java使用POI -ti 导出word表格List对象类型数据包含图片数据,表格合并

一、前期准备?

导入pom文件 

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.12.1</version>
</dependency>

二 、导出 代码

看了很长时间的源码,没看懂,看了文档 介绍的技术,跟需求不符合,

导出表格 不能事先定义表格头部模版,就在表格中写

1.定义表格中 映射字段

 2.代码实现

    Map<String,Object> res = new HashMap<>();
        //设置的合并规则
        MergeCellRule.MergeCellRuleBuilder mergeCellRuleBuilder = MergeCellRule.builder();
        //设置表头
        RowRenderData header = Rows.of("姓名", "年龄", "身高").bgColor("F2F2F2").center()
                .textColor("7F7f7F").textFontFamily("Hei").textFontSize(9).create();
        List<Map<String,String>> lists = new ArrayList<>();
        Map<String,String> map = new HashMap<>();
        map.put("name", "小红");
        map.put("age", "18");
        map.put("height", "165");
        lists.add(map);
        lists.add(map);
        lists.add(map);
        lists.add(map);
        lists.add(map);
        lists.add(map);
        lists.add(map);
        lists.add(map);
        lists.add(map);
        lists.add(map);
        //设置样式颜色尺寸等等
        BorderStyle borderStyle = new BorderStyle();
        borderStyle.setColor("A6A6A6");
        borderStyle.setSize(4);
        borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);


        Tables.TableBuilder tableBuilder = Tables.ofA4MediumWidth();
        tableBuilder.addRow(header);
        //表体内容
        for (Map<String, String> list : lists) {
            RowRenderData row = Rows.of(map.get("name"),map.get("age"),map.get("height")).center().create();
            tableBuilder.addRow(row);
        }
        TableRenderData tableRenderData = tableBuilder.border(borderStyle).create();

        /**
         * 设置表格合并规则
         * 1.起始行 MergeCellRule.Grid.of(i, j) i: 行 j: 列
         * 2.结束行 MergeCellRule.Grid.of(i, j) i: 行 j: 列
         */
        mergeCellRuleBuilder.map(MergeCellRule.Grid.of(1, 0), MergeCellRule.Grid.of(3, 0));
        mergeCellRuleBuilder.map(MergeCellRule.Grid.of(4, 0), MergeCellRule.Grid.of(5, 0));
        mergeCellRuleBuilder.map(MergeCellRule.Grid.of(6, 0), MergeCellRule.Grid.of(9, 0));

        /**
         * MergeCellRule支持多合并规则,会以Map的形式存入可以看一下源码
         * !!! 一定要设置完规则后再调用 MergeCellRule的build方法进行构建
         */
        tableRenderData.setMergeRule(mergeCellRuleBuilder.build());

        res.put("title", "测试测试");
        res.put("date","2023-8-8");
        res.put("renderData",tableRenderData);

        XWPFTemplate template = XWPFTemplate.compile("C:\\Users\\admin\\Desktop\\施工日报.docx").render(res);
        template.writeAndClose(Files.newOutputStream(Paths.get("C:\\Users\\admin\\Desktop\\施工日报1.docx")));

这里的地址 写的是本地测试地址 ,等实际应用时  可以存放到服务器

 3. 导出结果

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Boot中使用poi-tl库来导出带有合并列的Word表格并下载,您可以按照以下步骤操作: 1. 首先,确保您的Spring Boot项目中已经添加了poi-tl的依赖。您可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.6.0</version> </dependency> ``` 2. 创建一个Controller来处理导出请求。例如,创建一个名为WordExportController的类,并添加一个处理导出请求的方法。 ```java import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.data.*; import com.deepoove.poi.util.BytePictureUtils; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; @Controller public class WordExportController { @GetMapping("/export") public ResponseEntity<InputStreamResource> exportWord() throws IOException { // 创建一个数据模型 List<List<String>> tableData = new ArrayList<>(); tableData.add(createRow("Merged Cells", "Cell 3")); tableData.add(createRow("Cell 4", "Cell 6")); // 使用poi-tl的XWPFTemplate来生成Word文档 XWPFTemplate template = XWPFTemplate.compile("templates/template.docx").render( new DataTable(tableData) .setHeader(createRow("Header 1", "Header 2")) .setCellWidth(2000) // 设置单元格宽度 .setHeaderCellStyle(new CellStyle().setBold(true).setColor("FFFFFF").setBgColor("336699")) .setOddRowCellStyle(new CellStyle().setColor("FFFFFF").setBgColor("99CCFF")) .setEvenRowCellStyle(new CellStyle().setColor("FFFFFF").setBgColor("CCEEFF")) ); // 将生成的Word文档转换为字节数组 ByteArrayOutputStream out = new ByteArrayOutputStream(); template.write(out); byte[] documentBytes = out.toByteArray(); // 设置下载响应的头信息 HttpHeaders headers = new HttpHeaders(); headers.setContentDispositionFormData("attachment", "merged_table.docx"); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // 创建一个包含Word文档字节数组的InputStreamResource InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(documentBytes)); // 返回响应实体 return ResponseEntity.ok() .headers(headers) .body(resource); } private List<String> createRow(String cell1, String cell2) { List<String> row = new ArrayList<>(); row.add(cell1); row.add(cell2); return row; } } ``` 3. 在resources目录下创建一个名为template.docx的Word模板文件。在模板文件中,您可以根据自己的需求设置表格样式和内容。 4. 启动您的Spring Boot应用程序,并访问导出请求的URL(例如:http://localhost:8080/export)。将会自动下载名为merged_table.docx的Word文档,其中包含合并列的表格。 请确保按照您的需求修改代码,并根据模板文件的位置进行相应的调整。 希望对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值