poi动态填充word内容

移除单元格内容前的空行:
XWPFTableCell cell20 = rows.get(i).getTableCells().get(1);
cell20.removeParagraph(0);

  						for (XWPFTableCell tableCell : row.getTableCells()) {
                                for (XWPFParagraph paragraph : tableCell.getParagraphs()) {
                                    for (XWPFRun run : paragraph.getRuns()) {
                                        List<XWPFPicture> embeddedPictures = run.getEmbeddedPictures();
                                        if(!embeddedPictures.isEmpty()){
                                            flag=true;
                                        }
                                    }
                                }
                            }//判断单元格内是否有图片

=============================================

package com.shiting.analysis.util;

import com.alibaba.fastjson.JSON;
import com.shiting.analysis.model.dto.TemplateDto;
import org.apache.poi.xwpf.usermodel.*;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class ToDocUtils {
    //使用示例
    public static void main(String[] args) throws Exception {
        TemplateDto dto = new TemplateDto();
        dto.setProband_name("aaa");
        dto.setProband_NO("1111111");
        dto.setPhone("1212121212");
        dto.setAge_F("45");
        dto.setAge_M("13");
        dto.setReceive_date("2022.1.1");
        dto.setReport_date("2023.100");
        dto.setClinical_info("dskds");
        dto.setMother_name("bbb");
        dto.setMother_NO("11111111");
        dto.setFather_name("cccc");
        dto.setFather_NO("111");
        dto.setGene_name("ddd");
        dto.setMain_conclusion("ddd");
        dto.setParents_or_not("ddd");
        dto.setMain_explanation("ddd");
        dto.setPast_description_main("ddd");
        dto.setMain_site_suggestion_1("应该1..");
        dto.setMain_site_suggestion_2("应该2.。");
        dto.setSeq_info("111");
        dto.setReport_D_B("20231117");
        dto.setPicture_title("dsdsd");
        Map<String, Object> map = JSON.parseObject(JSON.toJSONString(dto), Map.class);
        String templatePath = "C:\\code\\genomic-analysis-backend\\src\\main\\resources\\positive_template有主位点阳性.docx";
        String outPath = "C:\\code\\genomic-analysis-backend\\src\\test\\java\\com\\shiting\\analysis\\out.docx";
        getDocx(templatePath , outPath , map);
    }
    /**
     * 导出docx
     * @param templatePath
     * @param outPath
     * @param map
     */
    public static boolean  getDocx(String templatePath, String outPath, Map<String, Object> map){
        XWPFDocument document = null;
        try{
            File file = new File(templatePath);
            InputStream in = new FileInputStream(file);
            document = new XWPFDocument(in);

            //替换页眉变量
            Iterator<XWPFHeader> headerIterator = document.getHeaderList().iterator();
            while (headerIterator.hasNext()){
                XWPFHeader header = headerIterator.next();
                replaceHeader(header,map);
            }
            //替换页脚变量
            Iterator<XWPFFooter> footerIterator = document.getFooterList().iterator();
            while (footerIterator.hasNext()){
                XWPFFooter footer = footerIterator.next();
                replaceFooter(footer,map);
            }
            //替换表格里面的变量
            replaceInTable(document,map);
            //替换段落里的
            Iterator<XWPFParagraph> paragraphIterator = document.getParagraphs().iterator();
            while (paragraphIterator.hasNext()){
                XWPFParagraph paragraph = paragraphIterator.next();
                replaceParagraph(paragraph,map);
            }
            // 如果文件夹不存在 则建立新文件夹
            File dir= new File(outPath);
            if (!dir.exists() == false) {
                dir.mkdirs();
            }
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            OutputStream out = new FileOutputStream(outPath);
            document.write(bos);
            out.write(bos.toByteArray());
            bos.close();
            out.close();
            return true;
        }
        catch (Exception e){
            e.printStackTrace();
            return false;
        } finally{
            try
            {
                if ( document != null )
                {
                    document.close();
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    /**
     * 替换段落里面的变量
     * @param paragraph
     * @param map
     */
    public static void replaceParagraph(XWPFParagraph paragraph, Map<String,Object> map){
        List<XWPFRun> runs = paragraph.getRuns();
        for (int i = 0; i < runs.size(); i++) {
            XWPFRun run = runs.get(i);
            String tkey = run.toString();
            if(tkey==null){
                return;
            }
            for (String key : map.keySet()) {
                if(tkey.equals(key)){
                    int size = run.getFontSize();
                    if(size==-1){
                        size=14;
                    }
                    String fontFamily = run.getFontFamily();
                    //因为直接调用setText()方法替换文本时,会在底层重新创建一个run,所以在设置文本之前要先删除当前run
                    paragraph.removeRun(i);
                    if(map!=null && map.get(key)!=null){
                        String runText = map.get(key).toString();
                        if(runText!=null){
                            if(runText.indexOf("\r\n")!=-1){
                                String[] texts = runText.split("\r\n");
                                List<String> tmp = new ArrayList<>();
                                for (String text : texts) {
                                    if(text!=null && text.length()!=0){
                                        tmp.add(text);
                                    }
                                }
                                texts = tmp.toArray(new String[0]);
                                for (int n = 0; n < texts.length; n++) {
                                    XWPFRun newRun = paragraph.createRun();
                                    newRun.setText("    "+texts[n].trim());
                                    if(texts.length>1 && n!=texts.length-1){
                                        newRun.addBreak();
                                    }
                                    newRun.setText(runText);
                                    newRun.setFontSize(size);
                                    newRun.setFontFamily(fontFamily);
                                }
                            }else if(runText.indexOf("\n")!=-1){
                                String[] texts = runText.split("\n");
                                List<String> tmp = new ArrayList<>();
                                for (String text : texts) {
                                    if(text!=null && text.length()!=0){
                                        tmp.add(text.trim());
                                    }
                                }
                                texts = tmp.toArray(new String[0]);
                                for (int n = 0; n < texts.length; n++) {
                                    XWPFRun newRun = paragraph.createRun();
                                    newRun.setText("    "+texts[n].trim());
                                    if(texts.length>1 && n!=texts.length-1){
                                        newRun.addBreak();
                                    }
                                    newRun.setFontSize(size);
                                    newRun.setFontFamily(fontFamily);
                                }
                            }else{
                                //重新创建一个run用于设置文本
                                XWPFRun newrun = paragraph.insertNewRun(i);
                                newrun.setText(runText);
                                newrun.setFontSize(size);
                                newrun.setFontFamily(fontFamily);
                            }
                        }
                    }
                }
            }
        }
    }
    public static void replaceFooter(XWPFFooter Footer, Map<String,Object> map){
        //获取表
        List<XWPFTable> tableList = Footer.getTables();
        if(tableList!=null && tableList.size()>0){
            for (int i = 0; i < tableList.size(); i++) {
                XWPFTable table = tableList.get(i);
                //获取行
                List<XWPFTableRow> rows = table.getRows();
                //获取单元格
                for (XWPFTableRow row : rows) {
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        //获取段落
                        List<XWPFParagraph> paragraphs = cell.getParagraphs();
                        for (XWPFParagraph paragraph : paragraphs) {
//                            paragraph.setAlignment(ParagraphAlignment.LEFT);
                            replaceParagraph(paragraph,map);
                        }
                    }
                }
            }
        }
        else {
            List<XWPFParagraph> paragraphs = Footer.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
//                paragraph.setAlignment(ParagraphAlignment.LEFT);
                replaceParagraph(paragraph,map);
            }
        }
    }
    /**
     * 替换页眉里面的变量
     * @param Header
     * @param map
     */
    public static void replaceHeader(XWPFHeader Header, Map<String,Object> map){
        //获取表
        List<XWPFTable> tableList = Header.getTables();
        if(tableList!=null && tableList.size()>0){
            for (int i = 0; i < tableList.size(); i++) {
                XWPFTable table = tableList.get(i);
                //获取行
                List<XWPFTableRow> rows = table.getRows();
                for (XWPFTableRow row : rows) {
                    //获取单元格
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        //获取单元格内容
                        List<XWPFParagraph> paragraphs = cell.getParagraphs();
                        for (XWPFParagraph paragraph : paragraphs) {
//                            paragraph.setAlignment(ParagraphAlignment.LEFT);
                            replaceParagraph(paragraph,map);
                        }
                    }
                }
            }
        }
        else {
            List<XWPFParagraph> paragraphs = Header.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
//                paragraph.setAlignment(ParagraphAlignment.LEFT);
                replaceParagraph(paragraph,map);
            }
        }

    }
    /**
     * 替换表格里面的变量
     * @param document
     * @param map
     */
    public static void replaceInTable(XWPFDocument document, Map<String,Object> map) throws Exception {
        Iterator<XWPFTable> iterator = document.getTablesIterator();
        while (iterator.hasNext()){
            //获取表
            XWPFTable table = iterator.next();
            //获取行
            List<XWPFTableRow> rows = table.getRows();
            for (XWPFTableRow row : rows) {
                //获取单元格
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    List<XWPFParagraph> paragraphs = cell.getParagraphs();
                    for (XWPFParagraph paragraph : paragraphs) {
                        //paragraph.setAlignment(ParagraphAlignment.LEFT);
                        replaceParagraph(paragraph,map);
                    }
                }
            }
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Poi-tl是一个基于Apache POI的开源Java模板引擎,用于生成Word、Excel等Office文档。它提供了一种方便的方式来填充Word文档中的数据。 使用poi-tl填充Word文档的步骤如下: 1. 首先,你需要创建一个Word模板文件,模板文件中包含了需要填充的数据的占位符。占位符可以是文本、表格、图片等。 2. 然后,你需要使用poi-tl提供的API来加载模板文件,并创建一个Document对象。 3. 接下来,你可以使用Document对象的方法来替换模板中的占位符。对于文本占位符,你可以使用replaceText方法来替换。对于表格占位符,你可以使用replaceTable方法来替换。对于图片占位符,你可以使用replacePicture方法来替换。 4. 最后,你可以使用Document对象的方法来保存填充好数据的Word文档。 需要注意的是,如果你需要在循环表格中加入图片,可以使用poi-tl提供的replacePicture方法来替换占位符为图片。具体的代码实现可以参考引用中提到的方法。 以上就是使用poi-tl填充Word文档的简要介绍。你可以参考引用中提供的API文档来了解更多关于poi-tl的用法和功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Poi-tl v1.12.1-API文档(中文版).zip](https://download.csdn.net/download/qq_40109352/87963821)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [POI-tl导出Word文档表格并且带图片+浏览器导出](https://blog.csdn.net/sh513023410/article/details/130947200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值