真实工作项目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());
    }

}
相关推荐
独断万古他化1 分钟前
【SpringBoot 配置文件】properties 与 yml 的基础用法、格式及优缺点
java·spring boot·后端
玄〤2 分钟前
Spring MVC 讲解:从初始化流程到请求参数与 JSON 处理全解析(黑马课程ssm笔记总结)(day5)
java·spring·json·mvc
廋到被风吹走5 分钟前
【Java】【JVM】垃圾回收深度解析:G1/ZGC/Shenandoah原理、日志分析与STW优化
java·开发语言·jvm
xrkhy6 分钟前
Java全栈面试题及答案汇总(3)
java·开发语言·面试
SunnyDays10119 分钟前
Java 高效实现 CSV 转 PDF
java·csv转pdf
隐形喷火龙11 分钟前
SpringBoot 异步任务持久化方案:崩溃重启不丢任务的完整实现
java·spring boot·后端
我是koten12 分钟前
K8s启动pod失败,日志报非法的Jar包排查思路(Invalid or corrupt jarfile /app/xxxx,jar)
java·docker·容器·kubernetes·bash·jar·shell
WX-bisheyuange16 分钟前
基于Spring Boot的库存管理系统的设计与实现
java·spring boot·后端
oMcLin19 分钟前
如何在 CentOS 7 上通过调优 Apache Tomcat 配置,提高高并发电商网站的性能?
centos·tomcat·apache
YanDDDeat20 分钟前
【JVM】类初始化和加载
java·开发语言·jvm·后端