java 将对象数据填充到word模版文件中

模版文件(以截图形式展示)

结果
 

1.导入对应依赖

         <!-- hutool工具类 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </dependency>

        <!--word模板数据解析-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.9.0-beta</version>
        </dependency>
        <!-- word/pdf操作 -->
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-words</artifactId>
            <version>18.8</version>
        </dependency>

2.将工具类导入
 

package com.example.demo;

import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil;
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.exception.RenderException;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.Map;

/**
 * @author LSL
 * @version 1.0
 * @date 2022/6/22
 */
@Slf4j
public class WordUtil {

    /**
     * 填充word模板,并且转成pdf文件后返回:
     * @param datas: 填充数据
     * @param fileStream: 文件模板流 -- 可从OSS/FastDFS上获取流,直接传入;
     * @return
     * @throws IOException
     */
    public static byte[] fillWordToPDF(Map<String,Object> datas,InputStream fileStream) throws IOException {
        try {
            //先填充word:
            byte[] bytes = fillWord(datas, fileStream);

            //在word转pdf:
            return wordToPDF(new ByteArrayInputStream(bytes));
        } catch (IOException ex){
            log.error("系统异常::{}",ex);
            throw ex;
        }
    }

    /**
     * 填充word模板,获取填充后的word文件流:
     * @param datas: 填充数据
     * @param fileStream: 文件模板流 -- 可从OSS/FastDFS上获取流,直接传入;
     * @return
     * @throws IOException
     */
    public static byte[] fillWord(Map<String,Object> datas, InputStream fileStream) throws IOException {
        XWPFTemplate template = null;
        ByteArrayOutputStream wordOut = new ByteArrayOutputStream(1024);
        try {
            //设置占位符:
            Configure config = Configure.builder()
                    .buildGramer("${", "}") //设置模板中的占位符${}, 默认是{{}}
                    .setValidErrorHandler(new Configure.AbortHandler()) //若模板中占位符与填充属性不对应,则报错;
                    .bind("list", new HackLoopTableRenderPolicy()) //设置模板中表格的参数属性
                    .build();

            //填充文本域:
            template = XWPFTemplate.compile(fileStream, config).render(datas);
            template.write(wordOut);
        }catch (RenderException ex){
            log.error("模板填充失败,请保证模板文本域与参数保持一致。错误信息::{}",ex);
            throw ex;
        } catch (IOException ex){
            log.error("系统异常::{}",ex);
            throw ex;
        }finally {
            try {
                if (template != null){
                    template.close();
                }
            } catch (IOException ex) {
                log.error("关闭文件流资源异常::{}",ex);
            }
        }
        return wordOut.toByteArray();
    }

    /**
     * word转pdf
     * @param wordInStream: word文件输入流;
     */
    public static byte[] wordToPDF(InputStream wordInStream) {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream(1024);
        try {
            InputStream licenseIn = WordUtil.class.getClassLoader().getResourceAsStream("license.xml");
            License aposeLic = new License();
            aposeLic.setLicense(licenseIn);

            //因linux环境没有语言包,当项目部署到linux环境后,转成的pdf中的中文是类似乱码的,所以需要去加载此目录下的语言包;
            OsInfo osInfo = SystemUtil.getOsInfo();
//            if(osInfo.isLinux()){
//                //====================================== 注意 ============================================
//                //注意: 需要把项目中resource/fonts目录下的语言包全部放到linux中的此目录下,否则linux环境中处理是乱码;
//                //以下是我自己定义的目录,你可随意更改为你linux上的目录;
//                FontSettings.setFontsFolder("/usr/share/fonts/chinese", true);
//                //=======================================================================================
//            }

            //Address是将要被转化的word文档
            Document doc = new Document(wordInStream);
            //全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
            doc.save(byteOut, SaveFormat.PDF);
        } catch (Exception e) {
            log.error("word转pdf异常::{}",e);
            throw new RuntimeException("word转pdf异常");
        }
        return byteOut.toByteArray();
    }

    /**
     * word转pdf
     * @param wordInStream: word文件输入流;
     * @param pdfOutStream: pdf文件输出流;
     */
    public static void wordToPDF(InputStream wordInStream, OutputStream pdfOutStream) {
        try {
            InputStream licenseIn = WordUtil.class.getClassLoader().getResourceAsStream("license.xml");
            License aposeLic = new License();
            aposeLic.setLicense(licenseIn);

            //因linux环境没有语言包,当项目部署到linux环境后,转成的pdf中的中文是类似乱码的,所以需要去加载此目录下的语言包;
            OsInfo osInfo = SystemUtil.getOsInfo();
//            if(osInfo.isLinux()){
//                //====================================== 注意 ============================================
//                //注意: 需要把项目中resource/fonts目录下的语言包全部放到linux中的此目录下,否则linux环境中处理是乱码;
//                //以下是我自己定义的目录,你可随意更改为你linux上的目录;
//                FontSettings.setFontsFolder("/usr/share/fonts/chinese", true);
//                //=======================================================================================
//            }

            //Address是将要被转化的word文档
            Document doc = new Document(wordInStream);
            //全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,
            doc.save(pdfOutStream, SaveFormat.PDF);
        } catch (Exception e) {
            log.error("word转pdf异常::{}",e);
            throw new RuntimeException("word转pdf异常");
        }
    }
}

 3.加入破解程序 license.xml文件
 

<?xml version="1.0" encoding="UTF-8" ?>
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>

4.处理对应逻辑并赋值

 

private void download(DataHandlerDto dataHandlerDto) throws IOException {

        Map<String,Object> map = new HashMap<String,Object>();
        map.put("caption", dataHandlerDto.getCaption());
        map.put("dealerName", dataHandlerDto.getDealerName());
        map.put("linkMan", dataHandlerDto.getLinkMan());
        map.put("mobile", dataHandlerDto.getMobile());
        map.put("time", dataHandlerDto.getTime());
        map.put("address", dataHandlerDto.getAddress());
        map.put("list", dataHandlerDto.getList());
        //需要填充到word中的图片数据
        //模板文件流
        InputStream tempStream = new FileInputStream(new File("D://hh/inspectionDeliver1.docx"));

        String time = StringUtils.isBlank(dataHandlerDto.getTime()) ? " " : dataHandlerDto.getTime().split(" ")[0];
        //填充word:
        byte[] bytes = WordUtil.fillWord(map, tempStream);
        //word转pdf:
        File pdfFile = new File("D://dealerDeliver/"+time+"_"+dataHandlerDto.getDealerName() +".pdf");
        WordUtil.wordToPDF(new ByteArrayInputStream(bytes),new FileOutputStream(pdfFile));
    }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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")); ``` 使用以上的步骤,就可以很方便地使用Java和POI来填充Word模板表格数据了。需要注意的是,填充数据的过程,表格的行和列都需要对应好数据的长度。如果数据填充不全,可能会影响整个表格的显示效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值