POI 导出
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; } }