小网站怎么搜关键词谷歌官方网站登录入口

当前位置: 首页 > news >正文

小网站怎么搜关键词,谷歌官方网站登录入口,龙游住房和城乡建设局网站,google chrome官网下载目录 环境要求 功能预览 需求分析 导入依赖 制作模板 编写代码 格式优化 最终效果 总结 在上一篇 EasyExcel模板导出与公式计算#xff08;上#xff09;-CSDN博客 文章中我们知道了在若依中使用自带的Excel注解来实现表格数据的导出#xff0c;并且通过重写相关接…目录 环境要求 功能预览 需求分析 导入依赖 制作模板 编写代码 格式优化 最终效果 总结 在上一篇 EasyExcel模板导出与公式计算上-CSDN博客 文章中我们知道了在若依中使用自带的Excel注解来实现表格数据的导出并且通过重写相关接口来支持导出公式的自动计算功能而在本文中我们将探究如何在带有自定义表头的定制化场景下如何实现表格数据的导出和公式的自动计算。 环境要求 若依Cloud 3.6.3 EasyExcel  3.3.2 功能预览 与上一篇文章相同这里继续以若依用户管理的导出功能为示例做一个简单的公式计算的验证大家可根据自己需求修改相应代码。 首先本地启动若依微服务版本登录后台依次选择系统管理 — 用户管理菜单进入如下页面 点击该页面的导出按钮 获取如下导出文件 现在如果我们想要在第四行计算第二和第三行用户编号的和可以直接在B4单元格输入A2A3这样的公式来实现可以注意到此时B4单元格中的公式颜色已经发生变化并且自动选中了A2和A3单元格但实际上我们的需求为从数据库表中导出的单元格实现自动计算结果接下来将通过若依前端页面来实现该功能验证。 现在需求变为除了能够正确计算单元格数据外还要变成像如下图的导出样式: 不难看出我们需要导出的结果有自定义的表头以及时间并且需要特别注意的是原本的计算公式由A2A3变为了A5A6这是因为新增了表头导致行号发生了变化接下来将针对这种需求进行实现。 需求分析 由于有了自定义标头的要求显然我们不能按照上一篇文章中直进行数据的导出因此我们将使用EasyExcel实现该功能 导入依赖 首先在ruoyi-common-core的pom.xml添加EaysExcel的依赖之所以添加到这里是因为该模块为通用核心模块会在项目中被其他的模块引用可以实现“一处添加多处使用”的效果。 !– easyexcel –dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion3.3.2/version/dependency 制作模板 为了实现上述中的导出效果我们需要使用Excel制作一个用于导出的模板最终效果如下所示: 可以看到图中红色框所标识的是新增的表头内容其中时间后面的{dataDate} 则为填充对象而第5行对应的内容中除了花括号外还有一个点这其实是代表的是将使用对象集合填充与时间的dataDate区别为 dataDate仅为一个对象。 编写代码 由于我们使用了EasyExcel之后原有的导出功能需要做调整 Excel注解将被替换为ExcelProperty如下图所示其中value属性对应了我们的模板中的表头 对应Controller层的代码也需要做如下调整: Log(title 用户管理, businessType BusinessType.EXPORT)RequiresPermissions(system:user:export)PostMapping(/export)public void export(HttpServletResponse response, SysUser user){ListSysUser list userService.selectUserList(user);//ExcelUtilSysUser util new ExcelUtilSysUser(SysUser.class);//util.exportExcel(response, list, 用户数据);try(InputStream resourceAsStream SysUserController.class.getClassLoader().getResourceAsStream(UserExportTemplate.xlsx);ExcelWriter excelWriter EasyExcel.write(response.getOutputStream()).withTemplate(resourceAsStream).inMemory(true).build()) {response.setContentType(application/vnd.ms-excel);String filename URLEncoder.encode(用户管理数据导出,UTF-8);response.setHeader(Content-disposition,attachment;filenamefilename.xlsx);WriteSheet writeSheet EasyExcel.writerSheet().build();FillConfig fillConfig FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(list, fillConfig, writeSheet);MapString, Object map MapUtils.newHashMap();// 自定义日期map.put(dataDate, new Date());excelWriter.fill(map, writeSheet);// 拿到原始的Workbook对象Workbook workbook excelWriter.writeContext().writeWorkbookHolder().getWorkbook();// 获取已经填充的sheet对象Sheet userSheet workbook.getSheetAt(0);for(Row row : userSheet){for (Cell cell : row){if(cell.getCellType() CellType.STRING StringUtils.isNotBlank(cell.getStringCellValue()) cell.getStringCellValue().contains()){cell.setCellFormula(cell.getStringCellValue().substring(1));}}}// 关闭excelWriter.finish();} catch (IOException e) {e.printStackTrace();}} 我们首先获取到了用户信息的list对象 随后加载自定义的模板 UserExportTemplate.xlsx 使用EasyExcel 构建一个 WriteSheet 对象其作用为填充自定义的日期对象以及我们的查询的list对象待填充完成后。通过excelWriter再次获取到初始的WorkBook对象在这里就是如何解决公式自动计算的关键通过workBookt获取到Sheet对象后对其进行遍历依次获取到Row和Cell对象 这里的Cell对象就是我们的单元格而我们填值的单元格为String类型因此需要进行过滤并且此处需要特别注意去掉公式中原有的 符号否则会引发异常。最后需要使用finish方法关闭流。该方案来源于官方文档easyexcel模板填充后有公式的单元格不会自动计算而需要我手动算如何处理 | Easy Excel 官网 以及github上的 issue https://github.com/alibaba/easyexcel/issues/3242  格式优化 虽然上述内容已经解决了公式导出后无法自动计算的问题但是如果仔细观察就会发现有个问题可以进一步优化由于最开始填入的单元格公式为A2A3而当增加了自定义表头后此处内容应变为A5A6在Excel中这种情况会自动处理但在当前场景下只能通过手动方式去修正最终的单元格而如果带有公式的单元格非常多时就会变得非常麻烦因此可以通过如下代码进行调整: Log(title 用户管理, businessType BusinessType.EXPORT)RequiresPermissions(system:user:export)PostMapping(/export)public void export(HttpServletResponse response, SysUser user){ListSysUser list userService.selectUserList(user);//ExcelUtilSysUser util new ExcelUtilSysUser(SysUser.class);//util.exportExcel(response, list, 用户数据);try(InputStream resourceAsStream SysUserController.class.getClassLoader().getResourceAsStream(UserExportTemplate.xlsx);ExcelWriter excelWriter EasyExcel.write(response.getOutputStream()).withTemplate(resourceAsStream).inMemory(true).build()) {response.setContentType(application/vnd.ms-excel);String filename URLEncoder.encode(用户管理数据导出,UTF-8);response.setHeader(Content-disposition,attachment;filenamefilename.xlsx);WriteSheet writeSheet EasyExcel.writerSheet().build();FillConfig fillConfig FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(list, fillConfig, writeSheet);MapString, Object map MapUtils.newHashMap();// 自定义日期map.put(dataDate, new Date());excelWriter.fill(map, writeSheet);// 根据自定义表头调整公式int rowOffset 3;// 拿到原始的Workbook对象Workbook workbook excelWriter.writeContext().writeWorkbookHolder().getWorkbook();// 获取已经填充的sheet对象Sheet userSheet workbook.getSheetAt(0);for(Row row : userSheet){for (Cell cell : row){if(cell.getCellType() CellType.STRING StringUtils.isNotBlank(cell.getStringCellValue()) cell.getStringCellValue().contains()){// 获取当前单元格内容String formula cell.getStringCellValue();// 正则表达式匹配单元格引用 (例如 A1, B2 等)Pattern pattern Pattern.compile(([A-Z])(\d));Matcher matcher pattern.matcher(formula);StringBuffer adjustedFormula new StringBuffer();while(matcher.find()) {// 列名 (A, B, …)String column matcher.group(1);// 行号 (1, 2, …)int rowNum Integer.parseInt(matcher.group(2));// 调整行号int adjustedRow rowNum rowOffset;// 替换原始引用为调整后的引用matcher.appendReplacement(adjustedFormula, column adjustedRow);}matcher.appendTail(adjustedFormula);// 重新设置公式cell.setCellFormula(adjustedFormula.substring(1));}}}// 关闭excelWriter.finish();} catch (IOException e) {e.printStackTrace();}} 此处通过在验证公式时使用正则匹配原有的公式并根据设置的 rowOffset 动态进行调整rowOffset为3是因为当前填入的公式从A2为基准开始因此偏移量为3而并非4使其能够正确计算结果。(此处代码也可抽取为方法在查询时list对象时直接使用) 最终效果 可以看到前端页面中填入的内容为A2A3而导出文件内容为A5A6并且打开导出的文件后自动计算了结果。 总结 对于具有自定义表头内容的导出需求需要使用EasyExcel工具实现功能增强并且需要先将内容写入到内容中之后再读取将公式进行进一步过滤转换去除等号调整行号进而实现导出文文件的计算功能根据官方文档所述该方案适用于文件小的场景当文件过大时将可能造成内存溢出的问题因此官方建议在Java层实现对公式的计算后再进行导出如果各位读者有更好的想法欢迎评论区留言探讨。