java按模板导出excel(三)

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/08/java-an-mu-ban-dao.html

按模板导出 excel 的过程如下:

按模板导出excel步骤图示
按模板导出excel步骤图示
  1. 制作excel模板:模板中可以规定单元格的格式、字体等;
  2. 准备数据:数据对象的属性可以有:数值类、字符串、日期、对象、list;
  3. 配置:在application.yml中配置相关导出的属性和数据对应的单元格(也可以手动实例化一个 ExcelProperties 对象);
  4. 一行代码导出:调用ExTplExporter的export方法导出,最后生成如上图的结果。(截图为反面例子,导出的方法调用最好不要换行)

详细配置属性可以参考 上一篇文章 中的两个表格说明。

nameLocationMap 是一个用来确定数据在excel中位置的map,key为数据实体的属性名、value为期望数据在 excel 单元格中的位置。其中表示位置的 B2、D4 的字母不区分大小写。

实验功能:

如果导出的数据中有List集合类型,并且不能确定list的大小,而list后面的数据该怎样写位置呢?

java按模板导出excel(三)插图(1)

可以如图写 D+4,指与 list 的相对位置为 +4,此功能要求list属性的位置配置必须在此之前,并且一张表只允许一个list。

使用实例

springboot中使用

0.依赖导入

<dependency>
  <groupId>com.jvm123</groupId>
  <artifactId>excel-converter-stater</artifactId>
  <version>1.0</version>
</dependency>

可在中央仓库查询是否有最新版本: https://mvnrepository.com/artifact/com.jvm123

1.配置

excel:
  converter:
    props-map:
      grade:
        sheet-index: 0
        date-pattern: yyyy年MM月dd日
        name-location-map:
          name: B2
          address: B4
          age: D2
          date: D15
          gradeList:
            project: b8
            grade: c8
          totalGrade:
            project: B13
            grade: C13

sheet-index配置了需要导出到的sheet;name-location-map配置了属性与导出位置坐标的对应关系。

2.调用导出

@RestController
public class DemoExcelConvertController {

    @Autowired
    private ExTplExporter exTplExporter;   

    @GetMapping("test5")
    public void test5(HttpServletResponse response) throws IOException {
        Person person = createPerson();
        response.addHeader("Content-Disposition","attachment;filename=grade.xlsx");
        exTplExporter.export("成绩单模板.xlsx", person,
                response.getOutputStream(), "grade");
    }
}

非springboot环境使用

<dependency>
  <groupId>com.jvm123</groupId>
  <artifactId>excel-converter</artifactId>
  <version>1.0</version>
</dependency>

可在中央仓库查询是否有最新版本: https://mvnrepository.com/artifact/com.jvm123

  1. 实例化ExcelTplExporter对象
  2. 设置ExcelProperties
  3. 调用export方法即可按照模板导出excel文件
public class Test3 {

    public static void main(String[] args) throws FileNotFoundException {
        Person p = new Person();
        p.setAddress("广东广州黄浦区科技企业加速器开元大道");
        p.setAge("12");
        p.setName("柳成功");

        List<Map> gradeList = new ArrayList<>();
        Map<String, Object> yuwen = new HashMap<>();
        yuwen.put("project", "语文");
        yuwen.put("grade", "90");
        Map<String, Object> shuxue = new HashMap<>();
        shuxue.put("project", "数学");
        shuxue.put("grade", "100");
        gradeList.add(yuwen);
        gradeList.add(shuxue);
        p.setGradeList(gradeList);

        Map<String, Object> totalGrade = new HashMap<>();
        totalGrade.put("project", "总分");
        totalGrade.put("grade", "190");
        p.setTotalGrade(totalGrade);
           
        ExcelProperties properties = new ExcelProperties();
        LinkedHashMap<String, Object> nameLocationMap = new LinkedHashMap<>();
        nameLocationMap.put("name", "B2");
        nameLocationMap.put("age", "D2");
        nameLocationMap.put("address", "b4");
        LinkedHashMap<String, String> gradeMap = new LinkedHashMap<>();
        gradeMap.put("project", "b8");
        gradeMap.put("grade", "c8");
        nameLocationMap.put("gradeList", gradeMap);
        LinkedHashMap<String, String> totalGradeMap = new LinkedHashMap<>();
        totalGradeMap.put("project", "b13");
        totalGradeMap.put("grade", "c13");
        nameLocationMap.put("totalGrade", totalGradeMap);
        properties.setNameLocationMap(nameLocationMap);

        ExcelTplExporter tplExporter = new ExcelTplExporter();
        tplExporter.setProperties(properties);
        tplExporter.export("成绩单模板.xlsx", p, new FileOutputStream(p.getName() + "同学成绩单.xlsx"));
    }
}

《java按模板导出excel(三)》有12个笔记:

    1. 文章说的 把位置配置成D+4这样的格式,就是相对于列表的最后一行,下移了4行。实现来说,普通的每行处理完,给行数加1,而这里就给行数加了4。

    1. 如果没有下移,首先看看有没有使用最新版本,因为1.0版本这里有些问题,最新1.2.1,然后是需要把列表的配置放在这个D+4这种配置前面。

      1. 因为设置模板时,不确定list行数有几行,所以列表只留了一行,然后下面还有其他内容。
        我debug了源码,设置完list的值后,假如是4行,在设置list下面的值时,行数是会加4,
        但是行数加4的位置原本单元格就有值,所以有冲突。我意思是 在给list赋值时,不能单纯的
        只将行数往下加,实际上模板要用sheet.createRow增加行数,像手工在excel里插入行一样,
        这样list下面的内容会往下移对应的行数

        1. 模板行数不够,这点我的确没考虑到,代码里也没做相应的处理。如果你需要使用的话,可以在https://gitee.com/yawensilence/excel-converter-starter先下载源码,自己修改一下先用着

          1. 行,因为我这个项目需要maven打包,我先用poi底层的方法自己把目前的功能先实现,
            等有时间我去下载代码,然后给你发Pull Requests

  1. PingbackExcel-converter:一行代码实现java中excel数据导入导出 – jvm123

发表评论