当前位置:   article > 正文

Java中使用JXLS工具类导出复杂Excel表格

jxls
前言

   在项目开发中,我们会遇到各种文件导出的开发场景,但是这种情况并都不常用,于是本人将自己工作中所用的代码封装成工具类,旨在记录工具类使用方法和技术分享。

一、Jxls的简介

   Jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。Java中成熟的excel导出工具备Pol、Jxl,但他们都是使用java代码的方式来导出Excel,编码效率很低且不方便维护。

二、快速开始

1、导入依赖

  1. <dependency>
  2. <groupId>org.jxls</groupId>
  3. <artifactId>jxls</artifactId>
  4. <version>2.4.6</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.jxls</groupId>
  8. <artifactId>jxls-poi</artifactId>
  9. <version>1.0.12</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.jxls</groupId>
  13. <artifactId>jxls-jexcel</artifactId>
  14. <version>1.0.6</version>
  15. </dependency>


2、定义导出的模板

   导入依赖后,我们导出需要使用到模板,我们要先用word建立一个xlsx的模板(切记:新建excel工作表要使用xlsx格式,不要使用xls格式,因为使用xls导出的时候xlsx表格数据有可能会有问题)
建立好xlsx工作表了就根据实际需求的页面在xlsx表格上把需要的导出的框架画出来就可,赋值就要使用表达式了,表达式可以查看官网也可以查看我下方写的。官方网址,模板弄好之后,需要放在resource目录下,在Java中进行读取,下面代码中有具体实现。
如何写表达式,在工作表中右键插入批注,office中添加批注快捷键(Shit + F2)

jx:each(items="${collection}" var="item" lastCell="A3")

其中items是你传入的集合的名称,var是集合中每个对象的别名,lastCell是循环最后的位置

jx:area(lastCell="H3")

这里设置标题范围,最宽到H3

模板表达式

简单列举常用的几个表达式

(1)单个值的注入:

${variable},variable是你传入的参数的key

(2)迭代循环注入:

jx:each(items="${collection}" var="item" lastCell="A3")

其中items是你传入的集合的名称,var是集合中每个对象的别名,lastCell是循环最后的位置

(3)条件判断:

jx:if test="${condition}"   条件为真时执行的内容

(4)合并单元格:

jx:mergeCells(lastCell="合并单元格范围"
[, cols="合并的列数"]
[, rows="合并的行数"]
[, minCols="要合并的最小列数"]
[, minRows="要合并的最小行数"])

3、使用工具类

  1. package com.sansint.industry.utils;
  2. import org.jxls.common.Context;
  3. import org.jxls.expression.JexlExpressionEvaluator;
  4. import org.jxls.transform.Transformer;
  5. import org.jxls.transform.poi.PoiTransformer;
  6. import org.jxls.util.JxlsHelper;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.*;
  9. import java.net.URLEncoder;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. /**
  13. * @author DongJiYong
  14. * jxls工具类
  15. */
  16. public class JxlsUtils {
  17. /**
  18. * 模板导出
  19. *
  20. * @param is
  21. * @param os
  22. * @param model
  23. * @throws IOException
  24. */
  25. public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {
  26. Context context = PoiTransformer.createInitialContext();
  27. if (model != null) {
  28. for (Map.Entry<String, Object> Entry : model.entrySet()) {
  29. context.putVar(Entry.getKey(), Entry.getValue());
  30. }
  31. }
  32. JxlsHelper jxlsHelper = JxlsHelper.getInstance();
  33. Transformer transformer = jxlsHelper.createTransformer(is, os);
  34. //获得配置
  35. JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();
  36. //设置静默模式,不报警告
  37. evaluator.getJexlEngine().setSilent(true);
  38. //函数强制,自定义功能
  39. Map<String, Object> funcs = new HashMap<>();
  40. funcs.put("utils", new JxlsUtils());
  41. evaluator.getJexlEngine().setFunctions(funcs);
  42. //必须要这个,否则表格函数统计会错乱
  43. jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
  44. }
  45. /**
  46. * 导出excel
  47. *
  48. * @param templatePath
  49. * @param os
  50. * @param model
  51. * @throws Exception
  52. */
  53. public static void exportExcel(String templatePath, OutputStream os, Map<String, Object> model) throws Exception {
  54. File template = getTemplate(templatePath);
  55. if (template != null) {
  56. exportExcel(new FileInputStream(template), os, model);
  57. } else {
  58. throw new Exception("Excel 模板未找到。");
  59. }
  60. }
  61. /**
  62. * 获取jxls模板
  63. *
  64. * @param path
  65. * @return
  66. */
  67. public static File getTemplate(String path) {
  68. File template = new File(path);
  69. if (template.exists()) {
  70. return template;
  71. }
  72. return null;
  73. }
  74. /**
  75. * 设置响应头、文件名
  76. *
  77. * @param response
  78. * @param fileName
  79. * @throws UnsupportedEncodingException
  80. */
  81. public static void setResponse(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {
  82. fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
  83. response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
  84. response.setContentType("application/vnd.ms-excel");
  85. response.setCharacterEncoding("UTF-8");
  86. }
  87. }

4、Controller层代码

使用该工具类主要在Controller层或者Service层封装好导出的数据和导出流即可,本人是在Controller层进行封装的数据。

  1. /***
  2. * excel导出
  3. * @param request
  4. * @param sanSintUser
  5. */
  6. @GetMapping("/excel")
  7. public void excelDownload(ParamRequest request, SanSintUser sanSintUser, HttpServletResponse response) {
  8. try {
  9. //根据定义的excel模板 构建导出的数据
  10. Map<String, Object> map = buildData(request, sanSintUser);
  11. //设置导出流
  12. JxlsUtils.setResponse(response, "能源档案信息");
  13. // 获取excel模版路径
  14. InputStream tplIs = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/档案列表.xlsx");
  15. JxlsUtils.exportExcel(tplIs, response.getOutputStream(), map);
  16. } catch (IOException e) {
  17. throw new RuntimeException(e);
  18. }
  19. }
  20. private Map<String, Object> buildData(ParamRequest request, SanSintUser sanSintUser) {
  21. Map<String, Object> map = new HashMap<>();
  22. List<Map<String, Object>> energyFileExcelList = new ArrayList<>();
  23. //从数据库查询出的数据集合
  24. List<EnergyFile> list = new ArrayList<>();
  25. if (!CollectionUtils.isEmpty(request.getIds())) {
  26. //如果有id,则查询id对应的能源档案信息
  27. list = energyFileService.selectEnergyFileByIds(request.getIds());
  28. } else {
  29. //如果没有id,则查询全部能源档案信息
  30. EnergyFile energyFile = new EnergyFile();
  31. energyFile.setTenantId(sanSintUser.getTenantId());
  32. list = energyFileService.selectEnergy(energyFile);
  33. }
  34. //构建excel数据
  35. for (int i = 0; i < list.size(); i++) {
  36. EnergyFile energyFile = list.get(i);
  37. Map<String, Object> dataMap = new LinkedHashMap<>();
  38. dataMap.put("num", i + 1);
  39. dataMap.put("categoryName", energyFile.getCategoryName());
  40. dataMap.put("itemName", energyFile.getItemName());
  41. dataMap.put("fileName", energyFile.getFileName());
  42. String fileType = buildFileType(energyFile);
  43. dataMap.put("fileType", fileType);
  44. String createUserName = energyFileService.selectCreateUserNameByUserId(energyFile.getCreateUser());
  45. dataMap.put("createUserStr", createUserName);
  46. dataMap.put("createTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(energyFile.getCreateTime()));
  47. dataMap.put("deptName", energyFile.getDeptName());
  48. dataMap.put("jobName", energyFile.getJobName());
  49. dataMap.put("fileUrl", energyFile.getFileUrl());
  50. energyFileExcelList.add(dataMap);
  51. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/394184
推荐阅读
相关标签
  

闽ICP备14008679号