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

}
相关推荐
Theodore_10223 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
冰帝海岸4 小时前
01-spring security认证笔记
java·笔记·spring
世间万物皆对象5 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·5 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic6 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王6 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康6 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神6 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342737 小时前
Java实现离线身份证号码OCR识别
java·开发语言