国家示范校建设成果网站,网站建设的目的模板,有哪些学做衣服的网站有哪些,区域工业互联网平台文章目录 一、背景二、实现1、写法一2、写法二 三、遇到的问题四、参考 一、背景
近期开发的一个新功能需要导出和前端展示样式一致的统计表格#xff0c;而前端使用的elementui的table组件#xff0c;show-summary属性选择后可以自动计算。后端导出时其他单元格与返回前端展… 文章目录 一、背景二、实现1、写法一2、写法二 三、遇到的问题四、参考 一、背景
近期开发的一个新功能需要导出和前端展示样式一致的统计表格而前端使用的elementui的table组件show-summary属性选择后可以自动计算。后端导出时其他单元格与返回前端展示时一致但最后一行的合计行需要后端计算并填充。
二、实现
1、写法一
可以参考issue中填充模板形式代码略。
2、写法二
由于表头和行数量是动态的我是采取构造dataList和header的方式未读取模板文件。部分逻辑为伪代码。
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.data.FormulaData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.google.common.collect.Lists;
import org.apache.poi.ss.usermodel.Workbook;import java.util.List;public class ExcelTest {public void download() {try {ExcelWriter excelWriter EasyExcel.write(需要生成的文件名.xlsx).inMemory(true).build();WriteSheet mainSheet EasyExcel.writerSheet(0, 需要写入的sheet名).head(buildHeadTitles(123)).build();excelWriter.write(buildData(123), mainSheet);Workbook workbook excelWriter.writeContext().writeWorkbookHolder().getWorkbook();workbook.setForceFormulaRecalculation(true);workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();excelWriter.finish();// 传给前端的相关逻辑} catch (Exception e) {// 异常处理}}private ListListString buildHeadTitles(String targetId) {// 构建动态表头相邻两个同名表头会默认合并// 这里的Lists是com.google.guava下的 com.google.common.collect.ListsListListString headTitles Lists.newArrayList();// 第一列headTitles.add(Lists.newArrayList(团队统计, 姓名, 姓名));headTitles.add(Lists.newArrayList(团队统计, 机构名称, 机构名称));// 查询并类似上面格式添加动态列headTitles.add(Lists.newArrayList(团队统计, 分类1, 动态列1));return headTitles;}private ListListObject buildData(String targetId) {ListListObject dataList Lists.newArrayList();// 循环塞数据行 循环开始// 最后一行塞数据的其中一个单元格公式示例如下// 在前面构造的公式字符串ListObject list new ArrayList():// 先塞其他数据list.add(syz);list.add(顶级机构);list.add(1);String formulaStr SUM(VALUE(D4),VALUE(E4),VALUE(F4));WriteCellDataString formula new WriteCellData();FormulaData formulaData new FormulaData();formula.setFormulaData(formulaData);formulaData.setFormulaValue(formulaStr);list.add(formula);dataList.add(list)// 循环结束return dataList;}
}
三、遇到的问题
需要注意的是只有3.0.0版本才包含WriteCellData类以及对应的formulaData的内部类workbook相关的计算属性才会被调用否则不会生效。此前2.0.0的版本找了半天设置未生效原因翻了下workbook设置源码和相关issue才发现。计算序号与字母转换时可以善用hutool工具包的ExcelUtil已提供了序号到字母的转换从0开始如0-A1-B。。。26-AA。。。等等便于公式计算行和列。
四、参考
https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write https://github.com/alibaba/easyexcel/issues/3242 https://github.com/alibaba/easyexcel/issues/1464