真实工作项目Java使用apache.poi生成word

加油,新时代打工人!

将实体类利用poi转成Word文件
demo示例

java 复制代码
package com.fqpais.util;

import com.fqpais.business.domain.TestReportTemplate;
import com.fqpais.common.utils.StringUtils;
import org.apache.poi.xwpf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
*@author wh
*@date 2024年05月24日8:59
 * 获取数据填充到word模板
*/
public class ReaderWord {

    private static final Logger log = LoggerFactory.getLogger(ReaderWord.class);

    public static void generateWordFromTemplate(String templatePath, String outputPath, List<TestReportTemplate> testReportTemplate) throws IOException {
        FileInputStream fis = new FileInputStream(templatePath);
        XWPFDocument doc = new XWPFDocument(fis);

        int userIndex = 0; // 用来追踪当前处理的用户索引
        for (XWPFParagraph p : doc.getParagraphs()) {
            for (XWPFRun r : p.getRuns()) {
                String text = r.getText(0);
                if (text != null) {
                    text = replaceUserData(text, testReportTemplate.get(userIndex));
                    r.setText(text, 0);
                }
            }

        }

        // 处理表格
        for (XWPFTable table : doc.getTables()) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    for (XWPFParagraph para : cell.getParagraphs()) {
                        for (XWPFRun run : para.getRuns()) {
                            String text = run.getText(0);
                            if (text != null) {
                                text = replaceUserData(text, testReportTemplate.get(userIndex));
                                run.setText(text, 0);
                            }
                        }
                    }
                }
            }
            // 同样,处理完一个表格后可能需要切换到下一个用户的数据
            userIndex++;
//            if (userIndex >= testReportTemplate.size()) break; // 防止数组越界
        }

        FileOutputStream out = new FileOutputStream(outputPath);
        doc.write(out);
        out.close();
        doc.close();
        fis.close();
        log.info("Word生成完成");
    }

    // 简化的替换逻辑,实际应用可能需要更复杂的正则表达式匹配
    private static String replaceUserData(String text, TestReportTemplate testReportTemplate) {
        NumberFormat numberFormat = NumberFormat.getNumberInstance();
        String square = numberFormat.format(testReportTemplate.getFieldsSquare());

        Date getDate = testReportTemplate.getGetDate();
        Date realTestTime = testReportTemplate.getRealTestTime();
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        String strDate1 = sdf1.format(realTestTime);
        String strDate2 = sdf1.format(getDate);
        if(StringUtils.isNull(testReportTemplate.getFarmerName())){
            testReportTemplate.setFarmerName("/");
        }
        if(StringUtils.isNull(testReportTemplate.getCode())){
            testReportTemplate.setCode("/");
        }
        if(StringUtils.isNull(testReportTemplate.getFieldsSquare())){
            testReportTemplate.setFieldsSquare(0L);
        }
        if(StringUtils.isNull(testReportTemplate.getTestEnvironment())){
            testReportTemplate.setTestEnvironment("/");
        }
        if(StringUtils.isNull(testReportTemplate.getFarmerContact())){
            testReportTemplate.setFarmerContact("/");
        }
        if(StringUtils.isNull(testReportTemplate.getTadminRegion().getName())){
            testReportTemplate.getTadminRegion().setName("/");
        }
        if(StringUtils.isNull(testReportTemplate.getTestItems())){
            testReportTemplate.setTestItems("/");
        }
        if(StringUtils.isNull(testReportTemplate.getTestBasis())){
            testReportTemplate.setTestBasis("/");
        }
        if(StringUtils.isNull(testReportTemplate.getTestUseDevice())){
            testReportTemplate.setTestUseDevice("/");
        }
        if(StringUtils.isNull(testReportTemplate.getConclusion())){
            testReportTemplate.setConclusion("不作结论。");
        }
        return text
                .replace("{{farmerName}}", testReportTemplate.getFarmerName())
                .replace("{{code}}", testReportTemplate.getCode())
                .replace("{{fieldsSquare}}",square)
                .replace("{{getDate}}",strDate2)
                .replace("{{realTestTime}}",strDate1)
                .replace("{{farmerContact}}",testReportTemplate.getFarmerContact())
                .replace("{{name}}",testReportTemplate.getTadminRegion().getName())
                .replace("{{testEnvironment}}",testReportTemplate.getTestEnvironment())
                .replace("{{testItems}}",testReportTemplate.getTestItems())
                .replace("{{testBasis}}",testReportTemplate.getTestBasis())
                .replace("{{testUseDevice}}",testReportTemplate.getTestUseDevice())
                .replace("{{conclusion}}",testReportTemplate.getConclusion());
    }

}
相关推荐
爱吃烤鸡翅的酸菜鱼11 分钟前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
惊涛骇浪、17 分钟前
SpringMVC + Tomcat10
java·tomcat·springmvc
墨染点香30 分钟前
LeetCode Hot100【6. Z 字形变换】
java·算法·leetcode
ldj20201 小时前
SpringBoot为什么使用new RuntimeException() 来获取调用栈?
java·spring boot·后端
超龄超能程序猿1 小时前
Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践
java·spring boot·后端·spring·spring cloud
风象南1 小时前
SpringBoot配置属性热更新的轻量级实现
java·spring boot·后端
洛阳泰山1 小时前
Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解
java·spring boot·后端·nacos
Y4090011 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
YuTaoShao1 小时前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
布朗克1681 小时前
java常见的jvm内存分析工具
java·jvm·数据库