关于jxls2.6.0的学习以及遇到的问题(五)

访问jxls官网:http://jxls.sourceforge.net/

官网中也有例子:https://bitbucket.org/leonate/jxls-demo/src/master/。

笔者会在最后一篇总结中将笔者的项目和Excel文件打包上传

// 命令--updateCell

注意这个命令笔者没有使用JxlsHelper,官网也同样没有使用,笔者尝试使用后发现,要么函数乱了,要么干脆,所有的行的函数都相同。

第一个原因是缺少context.getConfig().setIsFormulaProcessingRequired(false);

第二个原因是缺少workbook.setForceFormulaRecalculation(true);//强制重新计算公式

所以笔者只好使用官网给出的updateCell代码进行学习,使用if,each中官网的代码就会出问题

关于jxls2.6.0的学习以及遇到的问题(五)_第1张图片

OutputStream也是一个坑,当使用包装类BufferOutputStream,打开对应的excel报错。

笔者也没有去跟踪代码,有兴趣的朋友可以去跟踪看原因是什么,然后在笔者下留言

关于jxls2.6.0的学习以及遇到的问题(五)_第2张图片

笔者的后台代码

// 命令--updateCell
    public static void updateCellCommand() throws Exception {
        BufferedInputStream is = new BufferedInputStream(
                new FileInputStream("E:\\wrc\\jxls\\study\\updateCellTeplate.xlsx"));
        OutputStream os = new FileOutputStream("E:\\wrc\\jxls\\study\\updateCell.xlsx");

        Workbook workbook = WorkbookFactory.create(is);
        Transformer transformer = PoiTransformer.createSxssfTransformer(workbook, 5, false);
        AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
        List xlsAreaList = areaBuilder.build();
        Area xlsArea = xlsAreaList.get(0);

        Context context = new Context();

        context.putVar("cellRefUpdater", new CellRefUpdater());

        List> list = new ArrayList>();
        for (int i = 11; i < 20; i++) {
            HashMap hashMap = new HashMap();
            hashMap.put("name", "name" + i);
            hashMap.put("count", i);
            hashMap.put("sl", i + 1);
            list.add(hashMap);
        }

        context.putVar("employees", list);

        xlsArea.applyAt(new CellRef("Result!A1"), context);

        context.getConfig().setIsFormulaProcessingRequired(false);
        workbook.setForceFormulaRecalculation(true);
        workbook.setActiveSheet(1);
        ((PoiTransformer) transformer).getWorkbook().write(os);

    }
 

 

public class CellRefUpdater implements CellDataUpdater {

    @Override
    public void updateCellData(CellData cellData, CellRef targetCell, Context context) {
         if( cellData.isFormulaCell() && cellData.getFormula() != null ){
             cellData.setEvaluationResult(cellData.getFormula().replaceAll("(?<=[A-Za-z])\\d", Integer.toString(targetCell.getRow()+1)));
         }
    }

}

笔者的Excel,注意名字和后台代码中context的key值保持一致

关于jxls2.6.0的学习以及遇到的问题(五)_第3张图片

 

注意使用这个代码,是单独在一个sheet中根据模板生成

 

 

你可能感兴趣的:(jxls2.6.0)