需求:
根据一个模板sheet生成一个或多个sheet的excel导出功能,一开始我使用JXLS jar包中的: class org.jxls.util.JxlsHelper类执行生成excel
public static void main(String args[]) throws IOException {
long startTime = System.currentTimeMillis(); // 获取开始时间
InputStream inputStream = new FileInputStream("res\\empty.png");
byte[] emptyByte = toByteArray(inputStream);
inputStream = new FileInputStream("res\\test.jpg");
URL url = new URL("https://pic.baike.soso.com/ugc/baikepic2/18293/cut-20170602162513-2088410512.jpg/300");
BufferedImage bufImg = ImageIO.read(url); // 读取图片 byte[]
byte[] imageToBytes = imageToBytes(bufImg, "jpg");
byte[] testByte = toByteArray(inputStream);
inputStream = new FileInputStream("res\\imgTemplate.xls");
long endTime = System.currentTimeMillis(); // 获取结束时间
System.out.println("读取excel运行时间:" + (endTime - startTime) + "ms"); // 输出程序运行时间
OutputStream out = new FileOutputStream("res\\out_imgTemplate.xls");
Context context = new Context();
List<Department> list = new ArrayList<Department>();
List<String> sheetNames = new ArrayList<String>();
List<String> sheetNames2 = new ArrayList<String>();
Department dp = new Department();
dp.setImage(testByte);
dp.setName("这是第一个Sheet:图片是本地的");
sheetNames.add("Sheet1");
sheetNames2.add("Sheet2" );
sheetNames2.add("结果Sheet2_" + 2);
sheetNames2.add("结果Sheet2_" + 3);
list.add(dp);
Department dp2 = new Department();
dp2.setName("这是第二个Sheet:图片是URL");
dp2.setImage(imageToBytes);//
sheetNames.add("结果Sheet_" + 2);
list.add(dp2);
Department dp3 = new Department();
dp3.setName("这是第三个Sheet:图片是个很小的截屏空白图片");
dp3.setImage(emptyByte);// 第二张是代替空图片(不传值会报错是在没有找到解决方法)
sheetNames.add("结果Sheet_" + 3);
list.add(dp3);
context.putVar("departments", list);
context.putVar("sheetNames", sheetNames);
context.putVar("departments2", list);
context.putVar("sheetNames2", sheetNames2);
JxlsHelper.getInstance().processTemplate(inputStream, out, context);
long endTime2 = System.currentTimeMillis(); // 获取结束时间
System.out.println("生成excel运行时间:" + (endTime2 - endTime) + "ms"); // 输出程序运行时间
}
结果是无法删除模板sheet,除非把新生成的sheet 命名为和模板sheet一样的,这样可以覆盖,但如果有两个模板sheet:Sheet1、Sheet2,生成出来的excel中的sheet的顺序会有问题:
不会改变 Sheet1和Sheet2的位置
解决方案:
新建一个同名类:JxlsHelper.java
改写方法: public void processTemplate(Context context, Transformer transformer)
public void processTemplate(Context context, Transformer transformer) throws IOException {
areaBuilder.setTransformer(transformer);
List<Area> xlsAreaList = areaBuilder.build();
for (Area xlsArea : xlsAreaList) {
xlsArea.applyAt(
new CellRef(xlsArea.getStartCellRef().getCellName()), context);
if( processFormulas ) {
setFormulaProcessor(xlsArea);
xlsArea.processFormulas();
}
//删除模板sheet
if(this.deleteTemplateSheet){
String sourceSheetName = xlsArea.getStartCellRef().getSheetName();
transformer.deleteSheet(sourceSheetName);
}
}
transformer.write();
}
生成excel方法改成引用自己改写的类:JxlsHelper.java
另外:生成的sheet名称这里就不能和模板sheet中同名了,如果和模板sheet名称相同,也会被删除。
最终执行结果: