package com.baoqilai.scp.service;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Test; import com.baoqilai.base.service.export.CustomExportServiceImpl;
import com.baoqilai.base.service.export.HeadlessExportServiceImpl;
import com.baoqilai.base.service.export.TemplateExportServiceImpl;
import com.baoqilai.scp.service.export.ExcelExportDataStragy;
import com.baoqilai.scp.service.export.ExcelExportService;
import com.baoqilai.scp.service.export.ExcelExportStragyImpl; public class ExcelExportTest { @Test
public void testHeadless() {
ExcelExportService excelExportService=new HeadlessExportServiceImpl();
List<Map<String, Object>> data=new ArrayList<>();
Map<String, Object> map=new HashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "李白");
data.add(map);
map=new HashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "鲁班");
data.add(map);
ExcelExportDataStragy dataStragy=new ExcelExportDataStragy();
dataStragy.setStrategy(new ExcelExportStragyImpl());
SXSSFWorkbook sx=excelExportService.exportByStragegy(data, dataStragy);
File f = new File("E:/ziyuan/test.xlsx");
try {
FileOutputStream fos = new FileOutputStream(f);
sx.write(fos);
} catch (Exception e) {
e.printStackTrace();
}
} @Test
public void testCustom() {
ExcelExportService excelExportService=new CustomExportServiceImpl();
List<Map<String, Object>> data=new ArrayList<>();
Map<String, Object> map=new HashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "李白");
data.add(map);
map=new HashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "鲁班");
data.add(map);
// ExcelExportStragy stragegy =new ExcelExportStragyImpl(); String[] title={"序号","BigDecimal类型","Double类型","Float类型","Long类型","Integer类型","int类型","date类型","String类型"};
String[] result={"serialNum","BigDecimal","Double","Float","Long","Integer","int","date","String"}; ExcelExportDataStragy dataStragy=new ExcelExportDataStragy();
dataStragy.setStrategy(new ExcelExportStragyImpl());
dataStragy.setTitle(title);
dataStragy.setResult(result);
SXSSFWorkbook sx=excelExportService.exportByStragegy(data, dataStragy);
File f = new File("E:/ziyuan/test3.xlsx");
try {
FileOutputStream fos = new FileOutputStream(f);
sx.write(fos);
} catch (Exception e) {
e.printStackTrace();
}
} @Test
public void testTemplate() {
ExcelExportService excelExportService=new TemplateExportServiceImpl();
List<Map<String, Object>> data=new ArrayList<>();
Map<String, Object> map=new LinkedHashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "李白");
data.add(map);
map=new LinkedHashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "鲁班1");
data.add(map);
map=new LinkedHashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "鲁班2");
data.add(map);
map=new LinkedHashMap<String, Object>();
map.put("BigDecimal", 3.0300000000000002);
map.put("Double", 1.33);
map.put("Float", 1.1);
map.put("Long", 10L);
map.put("Integer", 5);
map.put("int", 6);
map.put("date", new Date());
map.put("String", "鲁班3");
data.add(map);
// ExcelExportStragy stragegy =new ExcelExportStragyImpl();
String tempAddress="E:/ziyuan/test4.xlsx";
String[] result={"serialNum","BigDecimal","Double","Float","Long","Integer","int","date","String"};
// stragegy.setTempAddress(tempAddress);
// stragegy.setResult(result); ExcelExportDataStragy dataStragy=new ExcelExportDataStragy();
dataStragy.setStrategy(new ExcelExportStragyImpl());
dataStragy.setTempAddress(tempAddress);
dataStragy.setResult(result);
SXSSFWorkbook sx=excelExportService.exportByStragegy(data, dataStragy); // SXSSFWorkbook sx=excelExportService.exportByStragegy(data, stragegy);
File f = new File("E:/ziyuan/test5.xlsx");
try {
FileOutputStream fos = new FileOutputStream(f);
sx.write(fos);
} catch (Exception e) {
e.printStackTrace();
}
} }
package com.baoqilai.base.service.export;

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.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 org.springframework.stereotype.Service; import com.baoqilai.scp.exception.BaseException;
import com.baoqilai.scp.service.export.ExcelExportDataStragy;
import com.baoqilai.scp.service.export.ExcelExportService;
/**
* 模板导出
* @author lly
*
*/
@Service
public class TemplateExportServiceImpl implements ExcelExportService { @Override
public SXSSFWorkbook export(List<Map<String, Object>> data) throws BaseException { return null;
} @Override
public SXSSFWorkbook exportByStragegy(List<Map<String, Object>> data, ExcelExportDataStragy excelExportStragy)
throws BaseException {
long stime = System.currentTimeMillis();
try { XSSFWorkbook wb = excelExportStragy.getStrategy().getXSSFWorkbook(excelExportStragy.getTempAddress()); 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); 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 = excelExportStragy.getResult();
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);
} Object val = dataMap.get(columNames[j]);
excelExportStragy.getStrategy().setCellValue(cell, val);
if(gsMap!=null&&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;
} }
package com.baoqilai.base.service.export;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set; import org.apache.poi.ss.usermodel.Cell;
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.springframework.stereotype.Service; import com.baoqilai.scp.exception.BaseException;
import com.baoqilai.scp.service.export.ExcelExportDataStragy;
import com.baoqilai.scp.service.export.ExcelExportService;
/**
* 无头导出
* @author lly
*
*/
@Service
public class HeadlessExportServiceImpl implements ExcelExportService { @Override
public SXSSFWorkbook export(List<Map<String, Object>> data) throws BaseException { return null;
} @Override
public SXSSFWorkbook exportByStragegy(List<Map<String, Object>> data, ExcelExportDataStragy excelExportStragy)
throws BaseException {
long stime = System.currentTimeMillis();
SXSSFWorkbook wb = excelExportStragy.getStrategy().getSXSSFWorkbook(); // 设置最大行数,如果不想做限制可以设置为-1
// 创建第一个sheet(页),并命名
Sheet sheet = wb.createSheet("1");
// 创建第一行
Row row = sheet.createRow((short) 0); // 创建列(每行里的单元格)
Cell cell = null ;
Map<String, Object> row1 = data.get(0);
Set<String> keys1 = row1.keySet();
int rowNum2 = 0;
for (String key: keys1) {
cell = row.createCell(rowNum2);
cell.setCellValue(key);
rowNum2 ++;
} for (short i = 0; i < data.size(); i++) {
Map<String, Object> map = data.get(i);
// 创建一行,在页sheet上
row = sheet.createRow((short) i + 1);
Set<String> keys = map.keySet();
int rowNum = 0;
for (String key: keys) {
cell = row.createCell(rowNum);
excelExportStragy.getStrategy().setCellValue(cell, map.get(key));
rowNum ++;
}
map.clear();
// 清空内存中缓存的行数
if (i % 500 == 0) {
try {
((SXSSFSheet) sheet).flushRows();
} catch (IOException e) {
e.printStackTrace();
}
}
}
data.clear();
data = null;
long etime = System.currentTimeMillis();
System.out.println("处理写入自定义数据用时:" + (etime - stime) / 1000);
return wb;
} }
package com.baoqilai.base.service.export;

import java.io.IOException;
import java.util.List;
import java.util.Map; import org.apache.poi.ss.usermodel.Cell;
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.springframework.stereotype.Service; import com.baoqilai.scp.exception.BaseException;
import com.baoqilai.scp.service.export.ExcelExportDataStragy;
import com.baoqilai.scp.service.export.ExcelExportService;
/**
* 自定义头导出
* @author lly
*
*/
@Service
public class CustomExportServiceImpl implements ExcelExportService{ @Override
public SXSSFWorkbook export(List<Map<String, Object>> data) throws BaseException { return null;
} @Override
public SXSSFWorkbook exportByStragegy(List<Map<String, Object>> data, ExcelExportDataStragy excelExportStragy)
throws BaseException {
long stime = System.currentTimeMillis();
SXSSFWorkbook wb =excelExportStragy.getStrategy().getSXSSFWorkbook(); // 设置最大行数,如果不想做限制可以设置为-1
// 创建第一个sheet(页),并命名
Sheet sheet = wb.createSheet("1");
// 创建第一行
Row row = sheet.createRow((short) 0);
// 生成表头
int i = 0;
String[] title=excelExportStragy.getTitle();
String[] result=excelExportStragy.getResult();
Cell cell = row.createCell(i);
for (; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
}
// 写入
for (i = 0; i < data.size(); i++) {
Map<String, Object> map = data.get(i); map.put("serialNum", i + 1);
row = sheet.createRow(i + 1);
int j = 0;
for (; j < result.length; j++) {
String col = result[j];
cell = row.createCell(j);
excelExportStragy.getStrategy().setCellValue(cell, map.get(col));
}
map.clear();
// 清空内存中缓存的行数
if (i % 500 == 0) {
try {
((SXSSFSheet) sheet).flushRows();
} catch (IOException e) {
e.printStackTrace();
}
}
}
data.clear();
data = null;
long etime = System.currentTimeMillis();
System.out.println("处理写入自定义数据用时:" + (etime - stime) / 1000);
return wb;
} }
package com.baoqilai.scp.service.export;

public class ExcelExportDataStragy {

    //持有一个具体的策略对象
private ExcelExportStragy strategy;
private String[] title;
private String[] result;
private String tempAddress; public ExcelExportDataStragy() {
super();
}
public ExcelExportStragy getStrategy() {
return strategy;
}
public void setStrategy(ExcelExportStragy strategy) {
this.strategy = strategy;
}
public String[] getTitle() {
return title;
}
public void setTitle(String[] title) {
this.title = title;
}
public String[] getResult() {
return result;
}
public void setResult(String[] result) {
this.result = result;
}
public String getTempAddress() {
return tempAddress;
}
public void setTempAddress(String tempAddress) {
this.tempAddress = tempAddress;
} }
package com.baoqilai.scp.service.export;

import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
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.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelExportStragyImpl implements ExcelExportStragy { @Override
public Row getHeaders() {
SXSSFWorkbook wb = getSXSSFWorkbook(); // 设置最大行数,如果不想做限制可以设置为-1
// 创建第一个sheet(页),并命名
Sheet sheet = wb.createSheet("1");
Row row = sheet.createRow((short) 0);
return row;
} @Override
public Row getNextRow() { return null;
} @Override
public CellStyle getCellStyle() {
SXSSFWorkbook wb = getSXSSFWorkbook();
CellStyle contextstyle = wb.createCellStyle();
DataFormat df = wb.createDataFormat();
contextstyle.setDataFormat(df.getFormat("#,##0.00"));
return contextstyle;
} @Override
public void setCellValue(Cell cell, Object val) {
if (val == null) {
cell.setCellValue("");
} else if (val instanceof java.math.BigDecimal) {
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(((java.math.BigDecimal) val).doubleValue());
cell.setCellStyle(getCellStyle());
} else if (val instanceof Double) {
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue((((Double) val).doubleValue()));
cell.setCellStyle(getCellStyle());
} else if (val instanceof Float) {
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue((((Float) val).floatValue()));
cell.setCellStyle(getCellStyle());
} else if (val instanceof Long) {
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(((Long) val).intValue());
} else if (val instanceof Integer) {
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(((Integer) val).intValue());
} else {
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(val.toString());
}
} @Override
public SXSSFWorkbook getSXSSFWorkbook() {
SXSSFWorkbook wb = new SXSSFWorkbook(500); // 设置最大行数,如果不想做限制可以设置为-1
wb.setCompressTempFiles(false);
return wb;
}
@Override
public XSSFWorkbook getXSSFWorkbook(String tempAddress){
try {
File fi = new File(tempAddress);
FileInputStream is = new FileInputStream(fi);
XSSFWorkbook wb = new XSSFWorkbook(is);
return wb;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} }

POI 导出的更多相关文章

  1. poi导出excel

    Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能, ...

  2. POI导出excel的简单demo

    目前使用过两种导出excel的方式,一种是如题所示的使用POI的方式进行数据的导出,这种方式一般只有在处理比较多的数据或者说需要导出的excel表格中有图片之类的需要特殊处理的文件的时候使用:还有一种 ...

  3. [转载]poi导出excel,可以自定义保存路径

    poi导出excel比js导出excel安全性更好,在使用poi导出excel时,先要导入poi-3.5-FINAL-20090928.jar包到你项目的lib目录下,我这里选择是3.5版的 1.ac ...

  4. POI导出EXCEL经典实现

    1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...

  5. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  6. poi导出word

    最近做了个poi导出word的功能 下面是代码: 一个可以参考的例子: package com.lzb.crm.web; import java.io.FileOutputStream; import ...

  7. POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)

    说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel ...

  8. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  9. JAVA代码实现嵌套层级列表,POI导出嵌套层级列表

    要实现POI导出EXCEL形如 --A1(LV1) ----B1(LV2) ----B2(LV2) ------C1(LV3) ------C2(LV3) ----B3(LV2) --A1(LV1)

  10. 重构:以Java POI 导出EXCEL为例

    重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...

随机推荐

  1. 异常处理,MD5

    异常处理. try except raise try: 代码 except 异常类: 除了错, 如何处理异常 except 异常类: 除了错, 如何处理异常 except 异常类: 除了错, 如何处理 ...

  2. boost安装缺少libboost_iostreams.so

    编译安装boost库: 1 ./bootstrap.sh 2 ./bjam 3 ./b2 install 但安装boosth后,发现缺少libboost_iostreams.so库,后发现boost库 ...

  3. 面向对象开发C++快速入门视频教程 C++基础加实战视频教程

    课程目录: ├<C++面向对象高级开发(上)> │ ├1.C++编程简介.mp4 │ ├2.头文件与类的声明.mp4 │ ├3.构造函数.mp4 │ ├4.参数传递与返回值.mp4 │ ├ ...

  4. JDK Timer & TimerTask

    目录 Timer & TimerTask Binary Heap Insert DELETE MIN PERFORMANCE LifeCycle Constructor MainLoop sc ...

  5. 【转】vMAN 和 PVID

    vMAN关的情况下,如果用户的包内带有VLAN TAG,则以用户的TAG为准,如果用户的包内不带VLAN TAG,就打上PVID:vMAN开的情况下,无论用户的包内是否带有VLAN TAG,都强制在外 ...

  6. 本学期c#学习总结

    本学期c#学习总结 时间转瞬即逝,大一上半学期的学习生涯已经结束.虽然以前我没什么关于学习计算机的基础,但是经过了这几个月的学习我也还是有点收获的. 我发现c#语言的关键词有很多语言特性和固定的用法, ...

  7. Could not find a package,configuration file provided by "G2O" ,G2OConfig.cmake,g2o-config.cmake

    因为项目需要使用到g2o,所以自己从git上面clone下来, git clone https://github.com/RainerKuemmerle/g2o.git 然后: cd g2o mkdi ...

  8. 算法题——给定一个数组 arr,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

    参考自:https://blog.csdn.net/qq_38200548/article/details/80688630 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] ...

  9. java学习笔记(八):继承、extends、super、this、final关键字

    继承解决代码重用的问题,方便管理和维护代码. 继承 子类拥有父类非private的属性,方法. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. 子类可以用自己的方式实现父类的方法. Java ...

  10. SOA的理解

    SOA架构的概念网上一大堆,笔者也没有发现一个准确.公认的定义.不过笔者在贴吧了发了一个比较好的解释,能够帮助理解: 一个产品有PC端.iOS端.Android端,有个数据查询的功能.传统的设计方法就 ...