package com.baoqilai.base.service.export;

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.baoqilai.ddg.util.ExcelUtil;
import com.baoqilai.scp.exception.BaseException;
import com.baoqilai.scp.service.export.ExcelExportService;
import com.baoqilai.scp.service.export.ExcelExportStragy;
/**
* 模板导出
* @author lly
*
*/
public class TemplateExportServiceImpl implements ExcelExportService { /**
* 模板地址
*/
protected String tempAddress;
/**
* 模板结果集
*/
protected String[] result; public TemplateExportServiceImpl(String tempAddress, String[] result) {
super();
this.tempAddress = tempAddress;
this.result = result;
} @Override
public SXSSFWorkbook export(List<Map<String, Object>> data) throws BaseException {
long stime = System.currentTimeMillis();
try {
File fi = new File(tempAddress);
FileInputStream is = new FileInputStream(fi);
XSSFWorkbook wb = new XSSFWorkbook(is);
//获取模板中最后一行,用于判断是否存在公式
int lastRowNum = wb.getSheetAt(0).getLastRowNum();
Sheet sheet0 = wb.getSheetAt(0);
Row baseRow0=sheet0.getRow(2);
lastRowNum = wb.getSheetAt(0).getLastRowNum(); Map<Integer, String> gsMap=new HashMap<>(); for (Iterator<Cell> it = baseRow0.cellIterator(); it.hasNext();) {
Cell baseCell = it.next();
if (baseCell.getCellType() == Cell.CELL_TYPE_FORMULA) {
String cellFormula = baseCell.getCellFormula();
gsMap.put(baseCell.getColumnIndex(), cellFormula);
}
}
sheet0.removeRow(baseRow0); //取到公式后进行删除 SXSSFWorkbook workbook = new SXSSFWorkbook(wb, 500);
Sheet sheet = workbook.getSheetAt(0); CellStyle contextstyle = workbook.createCellStyle();
DataFormat df = workbook.createDataFormat();
contextstyle.setDataFormat(df.getFormat("#,##0.00")); final int startRow = lastRowNum;
for (int i = startRow; i < data.size() + startRow; i++) {
int rowNum = i - startRow;
Row row = sheet.getRow(i);
if (row == null) {
row = sheet.createRow(i);
}
Map<String, Object> dataMap = data.get(rowNum); String[] columNames = result;
dataMap.put("serialNum", rowNum + 1); for (int j = 0; j < columNames.length; j++) {
Cell cell = row.getCell(j);
if (cell == null) {
cell = row.createCell(j);
}
System.out.println(cell.getColumnIndex());
Object val = dataMap.get(columNames[j]);
ExcelUtil.setCellValue(cell, val, contextstyle);
if(gsMap.get(cell.getColumnIndex())!=null){
String cellFormula =gsMap.get(cell.getColumnIndex());
String s = cellFormula.replaceAll("(\\w)\\d", "$1" + (i + 1));
cell.setCellFormula(s);
cell.setCellType(Cell.CELL_TYPE_FORMULA);
}
}
dataMap.clear();
// 清空内存中缓存的行数
if (i % 500 == 0) {
((SXSSFSheet) sheet).flushRows();
}
}
// 数据清理
data.clear();
data = null;
workbook.setForceFormulaRecalculation(true);//计算公式
long etime = System.currentTimeMillis();
System.out.println("处理写入模板数据用时:" + (etime - stime) / 1000);
return workbook;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} @Override
public SXSSFWorkbook exportByStragegy(List<Map<String, Object>> data, ExcelExportStragy stragegy)
throws BaseException {
long stime = System.currentTimeMillis(); long etime = System.currentTimeMillis();
System.out.println("处理写入模板数据用时:" + (etime - stime) / 1000);
return null;
} }

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. 刘志梅201771010115.《面向对象程序设计(java)》第四周学习总结

    实验四 类与对象的定义及使用 实验时间 2018-9-20 1.实验目的 (1)预定义类:(不是所有类都具有面向对象特征) 构造器的类名和方法名相同,是一种特殊的方法,用来构造并初始化对象. (2)用 ...

  2. Django model 字段类型及选项解析

    字段类型选择: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 ...

  3. js开发相关

    获取url中的参数 (function ($) { $.getUrlParam = function (name) { var reg = new RegExp("(^|&)&quo ...

  4. 性能测试day06_需求设计的学习(性能重中之重,思维方向永远重于工具)

    今天接着来学习下性能知识,本来是应该先学习一下LR的用法的,不过听完云层大大的课之后,我感觉工具没有这一篇来的重要,我们知道性能有三大步骤:负载->监控->调优,但是在这个之前我们首先要搞 ...

  5. Dubbo源码解析之registry注册中心

    阅读须知 dubbo版本:2.6.0 spring版本:4.3.8 文章中使用/* */注释的方法会做深入分析 正文注册中心是Dubbo的重要组成部分,主要用于服务的注册与发现,我们可以选择Redis ...

  6. 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

    代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到 ...

  7. __module__ 和 __class__

    __module__  查看当前方法来之于那个文件 __class__  查看当前方法来之于那个类

  8. Echarts报错 Can't read property 'getWidth' of null

    统计图报错: 这里的报错与echarts无关,与zrender有关,zrender是echarts依赖的canvas绘图库 你不需要了解zrender,这个问题是你代码出了错 谨记::代码的错

  9. python装饰器补漏

    以前写过一篇装饰器文章,觉得少了点东西,今天特来补上,也就是带参数的装饰器,上篇文章写的不严谨 def logger(logs=""): def outer(f): def inn ...

  10. python学习Day3 变量、格式化输出、注释、基本数据类型、运算符

    今天复习内容(7项) 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识别 ...