高校邦营销型网站建设答案,wordpress怎么集成码支付宝,电子网站建设推广方案,兰州网站seo收费简介
相信大家能经常性的遇到项目上各类excel的导出#xff0c;简单的excel格式#xff0c;用简单的poi#xff0c;easyExcel等工具都能导出。但是针对复杂的excel#xff0c;有固定的样式、合并单元格、动态列等各类要求#xff0c;导致excel 导出需要花很大一部分精力去…简介
相信大家能经常性的遇到项目上各类excel的导出简单的excel格式用简单的poieasyExcel等工具都能导出。但是针对复杂的excel有固定的样式、合并单元格、动态列等各类要求导致excel 导出需要花很大一部分精力去写代码。jxls在很大程度上解决了以上问题。
这里简单介绍下jxlsJXLS是国外一个简单的、轻量级的excel导出库链接JXLS官网这里有详细的文档说明教程英文版为了方便大家使用我举例几个常见的excel模板配置方便大家使用。
引入maven依赖
!-- 版本具体看官网Release这里我们使用 2.11.0 --
dependencygroupIdorg.jxls/groupIdartifactIdjxls/artifactIdversion2.11.0/version
/dependency
dependencygroupIdorg.jxls/groupIdartifactIdjxls-poi/artifactIdversion2.11.0/version
/dependency!-- 要使用基于JavaExcelAPI的转换器实现请添加以下依赖项 --
dependencygroupIdorg.jxls/groupIdartifactIdjxls-jexcel/artifactIdversion${jxlsJexcelVersion}/version
/dependency
后台代码 工具类JxlsUtils导出静态方法 public static void exportExcel(InputStream is, OutputStream os, MapString, Object model) throws IOException {Context context new Context();if (model ! null) {for (String key : model.keySet()) {context.putVar(key, model.get(key));}}JxlsHelper jxlsHelper JxlsHelper.getInstance();Transformer transformer jxlsHelper.createTransformer(is, os);JexlExpressionEvaluator evaluator (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();MapString, Object funcs new HashMapString, Object();funcs.put(utils, new JxlsUtils()); // 添加自定义功能evaluator.setJexlEngine(new JexlBuilder().namespaces(funcs).create());jxlsHelper.processTemplate(context, transformer);}导出controller //导出示例Controller
PostMapping(/export/exportTradeCreditData)
ResponseBody
public void exportTradeCreditData(HttpServletRequest request, HttpServletResponse response, Date countDate) {String templatePath template/excel/trade_credit_data.xlsx;//查找模板文件路径这里PathTools类为系统内部封装类大家注意copyURL templateResource PathTools.findResource(templatePath);try (OutputStream out response.getOutputStream();InputStream templateStream templateResource.openStream();) {//业务数据查询ListCindaTradeCreditDto list countingReportService.queryTradeCreditData(countDate);//excel模板内数据组装MapString, Object map new HashMapString, Object();map.put(year, getYear(countDate));map.put(contracts, list);JxlsUtils.exportExcel(templateStream, out, map);out.close();} catch (Exception e) {e.printStackTrace();log.error(导出excel异常, {}, JxlsUtils.executeException(e));}}
创建模板 注意事项excel模板工作表要使用xlsx格式不要使用xls格式防止导出时数据转换出错 新建excel模板xlsx格式工作表中按照的导出要求设置表格样式仅限于简单的表头与行、列的宽度、高度编写写表达式在工作表中右键插入批注office中添加批注快捷键Shit F2设置区域、数据行、合并单元格、动态列等
XLS表达式
简单列举常用的几个表达式
jx:area jx:area(lastCell H3) XLS Area 是JxlsPlus中的一个重要概念它表明excel模板中须要被解析的矩形区域由A1到最后一个单元格表示有利于加快解析速度。它须要被定义在excel 模板的第一个单元格A1.
示例图 jx:each 最常用的xls表达式 jx:each(itemscontracts varcontract lastCellH3) items上下文中集合的变量名var 在遍历集合的时候每一条记录的变量名area 该XLS Command的解析区域direction 数据在excel中填充的方向默认DOWN向下select 其值为一个表达式用来过滤数据
注如果涉及到动态列横向遍历需注意其用法特别需注意动态列的数据显示问题下面会讲到 jx:each(itemscountMonths varmonth lastCellC3 directionRIGHT) 简单的示例图 复杂的示例图 jx:mergeCells 合并单元格 jx:mergeCells(lastCell合并单元格范围
[, cols合并的列数]
[, rows合并的行数]
[, minCols要合并的最小列数]
[, minRows要合并的最小行数]
) lastCell合并单元格范围cols合并的列数rows合并的行数minCols要合并的最小列数minRows要合并的最小行数
注意此命令只能用于还没有合并的单元格。 示例图 动态列-综合使用 jx:each(itemscountMonths varmonth lastCellC3 directionRIGHT) 这里还是通过jx:each来使用不同的是direction 属性的值为RIGHT向右默认为DOWN向下。
示例截图 以上截图中几个参数说明
countMonths动态列集合month为集合循环的实体取值为${month}
contracts行数据集合contract、colData 都是集合循环的实体取值为${contract.custName}等
colData.monthData.get(month)动态列的数据根据列名去匹配实体字段
${empty()}判断集合对应动态列数据 是否为空做好判断写入数据
动态列数据行的数据获取
${empty(colData.monthData.get(month) ) ? 0 : colData.monthData.get(month)} 总结
以上为我使用过程中几个较常用的操作关于复杂的动态列使用excel模板详见附件