1. package com.baoqilai.base.service.export;
  2.  
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9.  
  10. import org.apache.poi.ss.usermodel.Cell;
  11. import org.apache.poi.ss.usermodel.CellStyle;
  12. import org.apache.poi.ss.usermodel.DataFormat;
  13. import org.apache.poi.ss.usermodel.Row;
  14. import org.apache.poi.ss.usermodel.Sheet;
  15. import org.apache.poi.xssf.streaming.SXSSFSheet;
  16. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
  17. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  18.  
  19. import com.baoqilai.ddg.util.ExcelUtil;
  20. import com.baoqilai.scp.exception.BaseException;
  21. import com.baoqilai.scp.service.export.ExcelExportService;
  22. import com.baoqilai.scp.service.export.ExcelExportStragy;
  23. /**
  24. * 模板导出
  25. * @author lly
  26. *
  27. */
  28. public class TemplateExportServiceImpl implements ExcelExportService {
  29.  
  30. /**
  31. * 模板地址
  32. */
  33. protected String tempAddress;
  34. /**
  35. * 模板结果集
  36. */
  37. protected String[] result;
  38.  
  39. public TemplateExportServiceImpl(String tempAddress, String[] result) {
  40. super();
  41. this.tempAddress = tempAddress;
  42. this.result = result;
  43. }
  44.  
  45. @Override
  46. public SXSSFWorkbook export(List<Map<String, Object>> data) throws BaseException {
  47. long stime = System.currentTimeMillis();
  48. try {
  49. File fi = new File(tempAddress);
  50. FileInputStream is = new FileInputStream(fi);
  51. XSSFWorkbook wb = new XSSFWorkbook(is);
  52. //获取模板中最后一行,用于判断是否存在公式
  53. int lastRowNum = wb.getSheetAt(0).getLastRowNum();
  54. Sheet sheet0 = wb.getSheetAt(0);
  55. Row baseRow0=sheet0.getRow(2);
  56. lastRowNum = wb.getSheetAt(0).getLastRowNum();
  57.  
  58. Map<Integer, String> gsMap=new HashMap<>();
  59.  
  60. for (Iterator<Cell> it = baseRow0.cellIterator(); it.hasNext();) {
  61. Cell baseCell = it.next();
  62. if (baseCell.getCellType() == Cell.CELL_TYPE_FORMULA) {
  63. String cellFormula = baseCell.getCellFormula();
  64. gsMap.put(baseCell.getColumnIndex(), cellFormula);
  65. }
  66. }
  67. sheet0.removeRow(baseRow0); //取到公式后进行删除
  68.  
  69. SXSSFWorkbook workbook = new SXSSFWorkbook(wb, 500);
  70. Sheet sheet = workbook.getSheetAt(0);
  71.  
  72. CellStyle contextstyle = workbook.createCellStyle();
  73. DataFormat df = workbook.createDataFormat();
  74. contextstyle.setDataFormat(df.getFormat("#,##0.00"));
  75.  
  76. final int startRow = lastRowNum;
  77. for (int i = startRow; i < data.size() + startRow; i++) {
  78. int rowNum = i - startRow;
  79. Row row = sheet.getRow(i);
  80. if (row == null) {
  81. row = sheet.createRow(i);
  82. }
  83. Map<String, Object> dataMap = data.get(rowNum);
  84.  
  85. String[] columNames = result;
  86. dataMap.put("serialNum", rowNum + 1);
  87.  
  88. for (int j = 0; j < columNames.length; j++) {
  89. Cell cell = row.getCell(j);
  90. if (cell == null) {
  91. cell = row.createCell(j);
  92. }
  93. System.out.println(cell.getColumnIndex());
  94. Object val = dataMap.get(columNames[j]);
  95. ExcelUtil.setCellValue(cell, val, contextstyle);
  96. if(gsMap.get(cell.getColumnIndex())!=null){
  97. String cellFormula =gsMap.get(cell.getColumnIndex());
  98. String s = cellFormula.replaceAll("(\\w)\\d", "$1" + (i + 1));
  99. cell.setCellFormula(s);
  100. cell.setCellType(Cell.CELL_TYPE_FORMULA);
  101. }
  102. }
  103. dataMap.clear();
  104. // 清空内存中缓存的行数
  105. if (i % 500 == 0) {
  106. ((SXSSFSheet) sheet).flushRows();
  107. }
  108. }
  109. // 数据清理
  110. data.clear();
  111. data = null;
  112. workbook.setForceFormulaRecalculation(true);//计算公式
  113. long etime = System.currentTimeMillis();
  114. System.out.println("处理写入模板数据用时:" + (etime - stime) / 1000);
  115. return workbook;
  116. } catch (Exception e) {
  117. e.printStackTrace();
  118. }
  119. return null;
  120. }
  121.  
  122. @Override
  123. public SXSSFWorkbook exportByStragegy(List<Map<String, Object>> data, ExcelExportStragy stragegy)
  124. throws BaseException {
  125. long stime = System.currentTimeMillis();
  126.  
  127. long etime = System.currentTimeMillis();
  128. System.out.println("处理写入模板数据用时:" + (etime - stime) / 1000);
  129. return null;
  130. }
  131.  
  132. }

POI SXSSFWorkbook 读取模板 存在公式解决的更多相关文章

  1. java操作Excel之POI(5)利用POI实现使用模板批量导出数据

    后台导出方法: 在源文件夹src下面放个准备好的模板:/com/cy/template/userExportTemplate.xls,这个模板有头部一行: /** * 后台导出方法 * 利用POI实现 ...

  2. poi导入读取时间格式问题

    万能处理方案: 所有日期格式都可以通过getDataFormat()值来判断 yyyy-MM-dd-----14 yyyy年m月d日--- 31 yyyy年m月-------57 m月d日  ---- ...

  3. java的poi技术读取Excel数据到MySQL

    这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...

  4. java的poi技术读取Excel[2003-2007,2010]

    这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: ja ...

  5. Brophp框架开发时连接数据库读取UTF8乱码的解决(转)

    Brophp框架开发时连接数据库读取UTF8乱码的解决办法 (2012-09-15 10:41:22) 转载▼ 标签: 杂谈 it php 分类: 建站技术 Brophp框架开发时连接数据库读取UTF ...

  6. vxworks for x86读取bios时间的解决方法

    vxworks for x86读取bios时间的解决方法 系统时间与bsp有关,在vzworks for x86系列的目标没有直接读取RTC(实时时钟控制器)的函数,用time.h中的函数读到的始终是 ...

  7. java利用poi来读取execl表格返回对象

    利用poi来读取execl表格,返回一个对象(可能有点不完善,但是应该能满足平常的所用),用到了反射等等; 使用的jar包有: commons-collections4-4.1.jar poi-3.1 ...

  8. java的poi技术读取和导入Excel实例

    本篇文章主要介绍了java的poi技术读取和导入Excel实例,报表输出是Java应用开发中经常涉及的内容,有需要的可以了解一下. 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用 ...

  9. org.in2bits.MyXls.XlsDocument 生成excel文件 ; 如果想读取模板再另外生成的话,试试 NPOI

    优点:不依赖Microsoft组件,在内存中操作excel,读写速度快.   缺点:无法读取模板,只能生成新的excel (我亲自测试是在读取完模板后,不能保存,也不能另存,并且其他人说这个读取还会有 ...

随机推荐

  1. Reachability实时监控网络变化

    Reachability是一种实时观察网络发生变化控件,如当你的手机处于WiFi情况下,他就会检测环境,当处于GPS的情况下改变环境,当处于无网络的情况下又是一种环境.下面我们看下关于Reachabi ...

  2. Vue自学笔记--项目的创建

    一.项目的创建 1.必须要安装nodejs    2.搭建vue的开发环境 ,安装vue的脚手架工具   官方命令行工具        npm install --global vue-cli  /  ...

  3. 字符串String的API

      字符串的理解 1. 字符串的属性 str.length 2. 字符串的方法 charAt() charCodeAt() indexOf() lastIndexOf() slice() substr ...

  4. TP5 自定义验证器

    TP内置验证功能提供两种验证方法 验证器(推荐) $validate = Validate::make([ 'id' => 'require|integer', ]); if ($validat ...

  5. Django之form模板的使用

    form模块的简介与用处 1.form 是前后端交互的一种方式, form表单提交的一种,django中有一个模块是form他主要用处就过滤前端form提交的数据 1. forms 模块是处理前后台的 ...

  6. 深度学习原理与框架-Tfrecord数据集的读取与训练(代码) 1.tf.train.batch(获取batch图片) 2.tf.image.resize_image_with_crop_or_pad(图片压缩) 3.tf.train.per_image_stand..(图片标准化) 4.tf.train.string_input_producer(字符串入队列) 5.tf.TFRecord(读

    1.tf.train.batch(image, batch_size=batch_size, num_threads=1) # 获取一个batch的数据 参数说明:image表示输入图片,batch_ ...

  7. 用python优雅打开文件及上下文管理协议

    有次面试被问到如何优雅地打开一个文件?   那就是用with语句,调用过后可以自动关闭.   但是为什么使用with语句就可以自动关闭呢,原因就是上下文管理协议.   上下文管理协议:包含方法 __e ...

  8. c++冒号作用

    转自http://www.360doc.com/content/13/0605/11/3373961_290615318.shtml 1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bi ...

  9. python调用webservice接口

    使用suds这个第三方模块 from suds.client import Clienturl = 'http://ip:port/?wsdl'cilent=Client(url)print cile ...

  10. linux下安装python,Django,虚拟环境

    linux下python安装步骤: 1.下载python3源码包 wget https://www.python.org/ftp/python/3.6.6/Python-3.6.7.tgz 2.下载p ...