利用poi向word模板填充数据

java基于POI实现向word模板填充数据

在做项目的时候遇到需要将多张表单导出为word,就想到了这个方法。

注意:XWPFDocument不支持doc类型文档,做模板的时候要另存为docx。

示例模板:
在这里插入图片描述
填充结果:
在这里插入图片描述

maven工程在pom.xml文件引入依赖:

		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.0.0</version>
		</dependency>
 
		<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.0.0</version>
		</dependency>

import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFooter;
import org.apache.poi.xwpf.usermodel.XWPFHeader;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
/**
     * 替换段落里面的变量
     * @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);
                            }
                        }
                    }
                }
            }
        }
    }
    /**
     * 替换页眉里面的变量
     * @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 Footer
     * @param map
     */
    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 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);
                    }
                }
            }
        }
    }
/**
     * 导出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);

            // 如果文件夹不存在 则建立新文件夹
            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();
            }
        }
    }
//测试
public static void main(String[] args) throws Exception{
		HashMap map = new HashMap();
    	map.put("${title}", "人员信息表");
		map.put("${name}", "张三");
		map.put("${age}", "20岁");
		map.put("${height}", "180cm");
		map.put("${weight}", "70kg");		
		String templatePath = "D:\\1.docx";
		String outPath = "D:\\2.docx";
		getDocx(templatePath , outPath , map);
	}

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Java中,可以使用Apache POI库来填充Word模板的表格数据POI是一个用于读取和写入Microsoft Office格式文件的Java库。使用POI,我们可以创建和填充Word模板中的表格数据。 首先,需要导入POI库到项目中。接着,就可以使用POI的XWPFDocument类来操作Word文档。可以使用XWPFDocument类的构造方法来打开模板文件,并将其读取到内存中。然后,需要定位到要填充表格数据的位置。使用XWPFTable类可以获取表格对象,并使用getRows()方法获取表格中的行。然后,可以使用XWPFTableRow类来获取特定行的单元格对象,并使用getCell()方法获取单元格。 为了填充表格数据,需要提供数据源。可以使用Java中的集合类(如List或Map)来存储数据。然后可以使用循环来遍历数据源,依次填充表格中的单元格。可以使用XWPFParagraph类来创建段落对象,并使用该类的createRun()方法创建Run对象。使用Run对象的setText()方法即可将数据填充到单元格中。 填充完表格数据后,需要保存Word文档。可以使用XWPFDocument类的write()方法将修改后的文档保存到磁盘上。 总的来说,使用POI填充Word模板表格数据可以简化表格数据填充的过程,并可以提高代码的可读性和可维护性。 ### 回答2: Java使用POI填充Word模板表格数据是一种非常常见的应用场景。POI是一个开放源代码库,允许Java程序员使用Java语言创建、修改和读取各种Microsoft Office格式文件,如Excel、Word和PowerPoint。 填充Word模板表格数据的主要步骤如下: 1.导入POI的相关jar包,可通过Maven或手动引入方式。 2.创建一个Word文档,将其保存为模板文件(*.dotx)。 3.使用POI的XWPFDocument类将模板文件加载到内存中,然后通过XWPFTable类获取表格对象。 4.使用XWPFTableRow和XWPFTableCell类,遍历表格行和列,对需要填充的单元格进行赋值操作。 5.完成赋值后,使用OutputSteam将数据写入新的Word文件中,保存完成。 下面给出一个使用POI填充Word模板表格数据的例子: ``` public static void fillTemplate(String templatePath, String destPath, Map<String, String> data) throws Exception { //加载模板文件 XWPFDocument document = new XWPFDocument(new FileInputStream(new File(templatePath))); //获取表格对象 List<XWPFTable> tables = document.getTables(); XWPFTable table = tables.get(0); //遍历表格行和列 for (XWPFTableRow row : table.getRows()) { for (XWPFTableCell cell : row.getTableCells()) { //获取单元格内容 String text = cell.getText(); if (text != null && data.containsKey(text)) { //填充数据 cell.setText(data.get(text)); } } } //保存填充数据后的新文件 OutputStream os = new FileOutputStream(new File(destPath)); document.write(os); os.flush(); os.close(); } ``` 在上面的例子中,我们首先通过XWPFDocument类将模板文件加载到内存中,然后获取表格对象。接着,我们遍历表格行和列,对需要填充的单元格进行赋值操作,最后使用OutputStream将数据写入新的Word文件中,完成填充数据的操作。 综上所述,使用POI填充Word模板表格数据是一种实现简单、使用方便的方式,对于需要生成大量Word文档且格式固定的企业业务而言,具有非常实际的意义和应用价值。 ### 回答3: Java使用POI填充Word模板表格数据的方法主要分为以下几个步骤: 1.打开Word模板 使用POI的`XWPFDocument`类打开Word模板文件,例如: ```java XWPFDocument doc = new XWPFDocument(new FileInputStream("模板.docx")); ``` 2.获取Word表格 通过`XWPFDocument`对象获取模板中的表格,例如: ```java List<XWPFTable> tables = doc.getTables(); XWPFTable table = tables.get(0); // 获取第一个表格 ``` 3.获取表格行和单元格 通过`XWPFTable`对象获取表格的行和单元格,例如: ```java List<XWPFTableRow> rows = table.getRows(); XWPFTableRow row = rows.get(rowIndex); // 获取第rowIndex行 XWPFTableCell cell = row.getCell(cellIndex); // 获取第cellIndex个单元格 ``` 4.填充单元格数据 通过`XWPFTableCell.setText()`方法填充单元格数据,例如: ```java cell.setText(data); // 填充数据 ``` 5.保存Word文档 使用`XWPFDocument`的`write()`方法将填充数据Word文档保存到本地,例如: ```java doc.write(new FileOutputStream("填充后的文档.docx")); ``` 使用以上的步骤,就可以很方便地使用JavaPOI填充Word模板表格数据了。需要注意的是,填充数据的过程中,表格的行和列都需要对应好数据的长度。如果数据填充不全,可能会影响整个表格的显示效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值