• springboot自定义表格(动态合并单元格)


    一、需求展示(一个订单多个商品,商品数量不限订单行合并)

    二、技术选型(jxls自定义模板)

    1. <!-- 版本具体看官网Release,这里我们使用 2.13.0 -->
    2. <dependency>
    3. <groupId>org.jxls</groupId>
    4. <artifactId>jxls</artifactId>
    5. <version>2.13.0</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.jxls</groupId>
    9. <artifactId>jxls-poi</artifactId>
    10. <version>2.13.0</version>
    11. </dependency>
    12. <!-- 要使用基于JavaExcelAPI的转换器实现,请添加以下依赖项 -->
    13. <dependency>
    14. <groupId>hu.blackbelt.bundles.jxls</groupId>
    15. <artifactId>org.jxls</artifactId>
    16. <version>2.10.0_1</version>
    17. </dependency>

    三、导出订单的数据结构展示

    1. [{
    2. "orderName": "订单1",
    3. "no": "13465464464121",
    4. "terminalValue": "微信 小程序",
    5. "userInfo": "微信 小程序",
    6. "items": [{
    7. "spuName": "ipnoe 6s",
    8. "properties": "非卖品,勿拍!!!!",
    9. "count": "10",
    10. "originalUnitPrice": "10"
    11. }]
    12. }]

    四、对应模板展示

    1、局部效果展示(一定要使用xlsx格式作为模板文档,xls有点问题)

    2、jx:area(lastCell = "P2")参数解释:整个表的作用域是到P列第2行,作用与必须要并且必须放在表格的的首行首列

    3、jx:each(items="tpList"var="tradeOrderPageItemRespVO" lastCell="P2")参数解析:tpList是最外层的order集合,tradeOrderPageItemRespVO是tpList循环时item的别称,P2是tpList循环作用表的生效范围。
    4、jx:mergeCells(rows="tradeOrderPageItemRespVO.items.size()" lastCell="A2")参数解析:rows要合并行的行数,lastcall是定位那A列第2行要进行单元行合并,有多少列要合并就拷贝多少次并将lastcall定位到相关列进行修改。尝试设置为C2没有从A2的位置自动每列合并到C2不知道为啥,就一列一列的设置的。

    5、jx:each(items="tradeOrderPageItemRespVO.items" var="tradeOrderItemBaseVO" lastCell="H2")参数解析:tradeOrderPageItemRespVO.items就是订单里边商品做循环,别名叫tradeOrderItemBaseVO,tradeOrderPageItemRespVO.items的作用范围就是批注D2到H2的位置可以使用用${}去到里边的变量。

    6、其他表达式使用请参考官网JXLS - (sourceforge.net)或文末备注

    五、代码参考

    1、引入依赖

    1. <!-- 版本具体看官网Release,这里我们使用 2.13.0 -->
    2. <dependency>
    3. <groupId>org.jxls</groupId>
    4. <artifactId>jxls</artifactId>
    5. <version>2.13.0</version>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.jxls</groupId>
    9. <artifactId>jxls-poi</artifactId>
    10. <version>2.13.0</version>
    11. </dependency>
    12. <!-- 要使用基于JavaExcelAPI的转换器实现,请添加以下依赖项 -->
    13. <dependency>
    14. <groupId>hu.blackbelt.bundles.jxls</groupId>
    15. <artifactId>org.jxls</artifactId>
    16. <version>2.10.0_1</version>
    17. </dependency>

    2、工具构建

    1. package cn.iocoder.yudao.module.trade.utils;
    2. import org.apache.commons.jexl3.JexlBuilder;
    3. import org.jxls.common.Context;
    4. import org.jxls.expression.JexlExpressionEvaluator;
    5. import org.jxls.transform.Transformer;
    6. import org.jxls.util.JxlsHelper;
    7. import java.io.IOException;
    8. import java.io.InputStream;
    9. import java.io.OutputStream;
    10. import java.util.HashMap;
    11. import java.util.Map;
    12. public class JxlsUtils {
    13. public static void exportExcel(InputStream is, OutputStream os, Map model) throws IOException {
    14. Context context = new Context();
    15. if (model != null) {
    16. for (String key : model.keySet()) {
    17. context.putVar(key, model.get(key));
    18. }
    19. }
    20. JxlsHelper jxlsHelper = JxlsHelper.getInstance();
    21. Transformer transformer = jxlsHelper.createTransformer(is, os);
    22. JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig()
    23. .getExpressionEvaluator();
    24. Map funcs = new HashMap<>();
    25. funcs.put("utils", new JxlsUtils()); // 添加自定义功能
    26. evaluator.setJexlEngine(new JexlBuilder().namespaces(funcs).create());
    27. jxlsHelper.processTemplate(context, transformer);
    28. }
    29. }

    3、Controller导出

    1. @GetMapping("/export-excel")
    2. @Operation(summary = "导出订单表格 Excel")
    3. @PreAuthorize("@ss.hasPermission('trade:order:export')")
    4. @OperateLog(type = EXPORT)
    5. public void exportActivityExcel(TradeOrderPageReqVO reqVO,
    6. HttpServletResponse response) throws IOException {
    7. CommonResult<PageResult<TradeOrderPageItemRespVO>> orderPage = getOrderPage(reqVO);
    8. List<TradeOrderPageItemRespVO> list = orderPage.getData().getList();
    9. List<TradeOrderExcelVO> result = new ArrayList<>();
    10. for (TradeOrderPageItemRespVO tradeOrderPageItemRespVO : list) {
    11. TradeOrderExcelVO convert = TradeOrderConvert.INSTANCE.convert(tradeOrderPageItemRespVO, 1);
    12. result.add(convert);
    13. }
    14. // 设置响应头
    15. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    16. response.setHeader("Content-Disposition", "attachment; filename=output.xlsx");
    17. // 使用 jXLS 进行模板变量替换并导出 Excel
    18. try (InputStream inputStream = getClass().getResourceAsStream("/tem/tem.xlsx");
    19. OutputStream outputStream = response.getOutputStream()) {
    20. //excel模板内,数据组装
    21. Map<String, Object> map = new HashMap<>();
    22. map.put("tpList", result);
    23. JxlsUtils.exportExcel(inputStream, outputStream, map);
    24. }
    25. }

    六、备注

    1. jx:mergeCells(lastCell="合并单元格范围"
    2. [, cols="合并的列数"]
    3. [, rows="合并的行数"]
    4. [, minCols="要合并的最小列数"]
    5. [, minRows="要合并的最小行数"]
    6. )
    7. lastCell:合并单元格范围;
    8. cols:合并的列数;
    9. rows:合并的行数;
    10. minCols:要合并的最小列数;
    11. minRows:要合并的最小行数;
    12. jx:each(items="countMonths" var="month" lastCell="C3" direction="RIGHT")
    13. 这里还是通过jx:each来使用,不同的是direction 属性的值为:RIGHT(向右),默认为:DOWN(向下)
    14. countMonths:动态列集合,month为集合循环的实体,取值为:${month}
    15. contracts:行数据集合,contract、colData 都是集合循环的实体,取值为:${contract.custName}等
    16. colData.monthData.get(month):动态列的数据,根据列名去匹配实体字段
    17. ${empty()}:判断集合对应动态列数据 是否为空,做好判断,写入数据
    18. 动态列数据行的数据获取:${empty(colData.monthData.get(month) ) ? 0 : colData.monthData.get(month)}

  • 相关阅读:
    UI自动化测试框架搭建——标记性能较差用例
    xss——权限维持,钓鱼
    tailwindcss 如何在 uniapp 中使用
    5个前端练手项目(html css js canvas)
    C语言数组清零----使用memset函数
    阿里内部 Java 面试题泄露:分布式 + 高并发 +Spring boot,扛住 HR 拷问
    脑机接口的商业化道路,还要走多远多长?
    基于ssm的计算机类考研资源平台管理系统(idea+spring+springmvc+mybatis+jsp)(前端+后端)
    BS4网络提取selenium.chrome.WebDriver类的方法及属性
    CRC校验——以SHT4xA温湿度传感器为例
  • 原文地址:https://blog.csdn.net/qq_29653373/article/details/132603259