解决jxls生成excel后模板sheet没有删除的问题

需求:

根据一个模板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名称相同,也会被删除。
最终执行结果:

根据excel模板动态导出数据库数据 package text; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.ServletContext; import net.sf.jxls.transformer.XLSTransformer; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class TextAction extends ActionSupport { /** */ private static final long serialVersionUID = 1L; private String filename; @SuppressWarnings("rawtypes") public String export() throws Exception { String templateFile = "18.xls"; // String sql = "select * from t_ry order by rybm"; // exportAndDownload(templateFile, DataBase.retrieve(sql)); List datas = new ArrayList(); @SuppressWarnings("unchecked") HashMap map = new HashMap(); map.put("name", "1111"); datas.add(map); exportAndDownload(templateFile, datas); return SUCCESS; } @SuppressWarnings({ "rawtypes", "unchecked" }) public void exportAndDownload(String templateFile, List datas) { try { filename = UUID.randomUUID() + templateFile; // FacesContext context = FacesContext.getCurrentInstance(); // ServletContext servletContext = (ServletContext) // context.getExternalContext().getContext(); ServletContext servletContext = ServletActionContext .getServletContext(); String path = servletContext.getRealPath("\\ExcelFile"); String srcFilePath = path + "\\template\\" + templateFile; String destFilePath = path + "\\download\\" + filename; Map beanParams = new HashMap(); beanParams.put("results", datas); XLSTransformer transfer = new XLSTransformer(); transfer.transformXLS(srcFilePath, beanParams, destFilePath); // Browser.execClientScript("window.location.href='../ExcelFile/downloadfile.jsp?filename=" // + destFile + "';"); } catch (Exception e) { e.printStackTrace(); } } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值