poi-tl 根据模板动态创建表格,并修改字体样式及行距

poi TI版本为: 1.12.1

word表单模板,

在这里插入图片描述

核心生成表单代码
		//定义数据集合
        Map<String, Object> datas = new HashMap<>();
        int deptNumber = 0;
        for (String dept : Lists.newArrayList()) {
        	//标题解析
            datas.put(String.format("title%s_%s"), String.format("%s%s年第%s次周例会汇报材料-%s","工作计划"));
            //设置表单只有4个单元格,并设置单元格的大小
            Tables.TableBuilder tableBuilder = Tables.ofA4ExtendWidth().percentWidth("100%", new int[]{7, 10, 10, 73});
            //添加每行数据,.具体逻辑根据循环定义,内容省去
            RowRenderData rowRenderData = Rows.of(fdOrder, cellGzdl, rwly, cellRenderData).center().rowHeight(2.54f).create();
            //把内行添加到table 中去
            tableBuilder.addRow(rowRenderData);

            // 表单核心数据
            datas.put(String.format("table%s_%s"), tableBuilder.create());
        }
        Configure config = Configure.builder().build();
        try {
        //根据模板,输出流提供前端使用
            XWPFTemplate.compile(PropertiesUtils.getPath() + "template.docx", config).render(datas).writeAndClose(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
//设置表格 内容,
private static Map<String, RowRenderData> getRowRenderData() {
        Map<String, RowRenderData> title = new HashMap<>();
        //标题完成情况 每个单元格内容
        CellRenderData cell1 = getHearderCellRenderData("序号");
        CellRenderData cell2 = getHearderCellRenderData("大类");
        CellRenderData cell3 = getHearderCellRenderData("来源");
        CellRenderData cell4 = getHearderCellRenderData("情况");
        //表格一行数据
        RowRenderData row0 = Rows.of(cell1, cell2, cell3, cell4).center().rowHeight(2.5f).create();
        return title;
    }
表格样式
/**
     * 设置表格的样式
     */
    private static CellRenderData getCellRenderData(String text) {
        return Cells.of().addParagraph(getParagraphRenderData(text)).create();
    }
    /**
     * 表头样式
     *
     * @param text
     * @return
     */
    private static CellRenderData getHearderCellRenderData(String text) {
        return Cells.of().addParagraph(getParagraphRenderData(text, true)).create();
    }

    private static ParagraphRenderData getParagraphRenderData(String text) {
        return getParagraphRenderData(text, false);
    }

    private static ParagraphRenderData getParagraphRenderData(String text, boolean title) {
        //设置表格字体大小
        Style style = Style.builder().buildFontSize(14).build();
         //设置表格行距
        ParagraphStyle build = ParagraphStyle
                .builder()
                .withSpacingRule(LineSpacingRule.EXACT)
                .withSpacing(18).build();
        if (title) {
            style.setBold(true);
            return Paragraphs.of(Texts.of(text).style(style).create()).paraStyle(build).center().create();
        }
        return Paragraphs.of(Texts.of(text).style(style).create()).paraStyle(build).left().create();
    }
在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文档,其中包含合并列的表格。 请确保按照您的需求修改代码,并根据模板文件的位置进行相应的调整。 希望对您有所帮助!如果您有任何其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值