Java文件:XWPFDocument导出Word文档

这篇具有很好参考价值的文章主要介绍了Java文件:XWPFDocument导出Word文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

在Java项目开发过程中经常会遇到导出Word文档的业务场景。XWPFDocument是apache基金会提供的用户导出Word文档的工具类。

二、基本的概念

  • XWPFDocument:代表一个docx文档
  • XWPFParagraph:代表文档、表格、标题等各种的段落,由多个XWPFRun组成
  • XWPFRun:代表具有同样风格的一段文本
  • XWPFTable:代表一个表格
  • XWPFTableRow:代表表格的一行
  • XWPFTableCell:代表表格的一个单元格
  • XWPFChar:表示.docx文件中的图表
  • XWPFHyperlink:表示超链接
  • XWPFPicture:代表图片
  • XWPFComment :代表批注
  • XWPFFooter:代表页脚
  • XWPFHeader:代表页眉
  • XWPFStyles:样式(设置多级标题的时候用)

三、Maven依赖(JAR)

<!--  poi pdf文件/xml文件  -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.10-FINAL</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>

四、Word模板

1.正文段落

一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元

获取所有段落:List paragraphs = word.getParagraphs();

获取一个段落中的所有Runs:List xwpfRuns = xwpfParagraph.getRuns();

获取一个Runs中的一个Run:XWPFRun run = xwpfRuns.get(index);

XWPFRun–代表具有相同属性的一段文本

2.正文表格

一个文档包含多个表格,一个表格包含多行,一行包含多列(格),每一格的内容相当于一个完整的文档

获取所有表格:List xwpfTables = doc.getTables();

获取一个表格的行数:int rcount = xwpfTable.getNumberOfRows();

获取一个表格的第几行:XWPFTableRow row = table.getRow(i);

获取一个表格中的所有行:List xwpfTableRows = xwpfTable.getRows();

获取一行中的所有列:List xwpfTableCells = xwpfTableRow.getTableCells();

获取一格里的内容:List paragraphs = xwpfTableCell.getParagraphs();

之后和正文段落一样

注:

  1. 表格的一格相当于一个完整的docx文档,只是没有页眉和页脚。里面可以有表格,使用xwpfTableCell.getTables()获取,and so on
  2. 在poi文档中段落和表格是完全分开的,如果在两个段落中有一个表格,在poi中是没办法确定表格在段落中间的。(当然除非你本来知道了,这句是废话)。只有文档的格式固定,才能正确的得到文档的结构

3.页眉

一个文档可以有多个页眉,页眉里面可以包含段落和表格

获取文档的页眉:List headerList = doc.getHeaderList();

获取页眉里的所有段落:List paras = header.getParagraphs();

获取页眉里的所有表格:List tables = header.getTables();

4.页脚

页脚和页眉基本类似,可以获取表示页数的角标

五、XWPFDocument的使用

5.4导出Word文档

1.word模板

在resources目录下准备好word模板:xiaoshen.docx

xwpfdocument,Java文件解析,word,java

2.PdfTest测试类

package com.shenxm.file.pdf.test;

import com.shenxm.file.pdf.service.impl.SystemFileBizImpl;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

/**
 * @Author: shenxm
 * @Description: pdf测试
 * @Version 1.0
 */
public class PdfTest {

    @Test
    public void  test1(){
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String format = simpleDateFormat.format(date);

        HashMap<String, Object> boMap = new HashMap<>();
        boMap.put("address","北京");
        boMap.put("name","法克\n蒙克丽丽\n娜娜");
        boMap.put("datetime","\n"+format);
        boMap.put("opinion","\n小沈\n"+format+"\n审批通过");
        boMap.put("book","春的林野");
        String docxTemplate = "xiaoshen.docx";//docx模板
        String pdfFileName = "xiaoshen.pdf";//输出的pdf
        SystemFileBizImpl systemFileBiz = new SystemFileBizImpl();
        systemFileBiz.exportPdf(boMap,docxTemplate,pdfFileName);
    }
}

3.ISystemFileService接口

package com.shenxm.file.pdf.service;
import com.shenxm.file.pdf.entity.DownloadFileBo;
import java.util.Map;

public interface ISystemFileService {
    DownloadFileBo exportPdf(Map<String,Object> map,String template,String fileName);
}

4.SystemFileServiceImpl实现类

package com.shenxm.file.pdf.service.impl;

import com.shenxm.file.pdf.entity.DownloadFileBo;
import com.shenxm.file.pdf.service.ISystemFileService;
import org.apache.poi.xwpf.usermodel.*;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @Author: shenxm
 * @Description: 文件处理 Service
 * @Version 1.0
 */
@Service
public class SystemFileServiceImpl implements ISystemFilService {

    @Override
    public DownloadFileBo exportPdf(Map<String, Object> map, String docxTemplateName, String pdfFileName) {
        //校验参数
        Assert.notEmpty(map, "数据源不可为空!");
        Assert.notNull(docxTemplateName,"docxTemplateName不能为空");
        Assert.notNull(pdfFileName,"pdfFileName不能为空");

        String pdfExportPath = "G:" + File.separator + "test1" + File.separator;
        //1.生成pdf文件对象
        File pdfFile = this.createFile(pdfExportPath, pdfFileName);

        String docxExportPath = "G:" + File.separator + "test1" + File.separator;//生成的word的路径
        String docxExportName ="xiaoshen1.docx";
        //使用当前线程的类加载器读取文件
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(docxTemplateName);
        if (in == null) {
            System.out.println("读取文件失败!");
        } else {
            try {
                //读取模板文档
                XWPFDocument document = new XWPFDocument(in);
                //替换段落中的${}
                this.replaceTextInParagragh(document, map);
                //替换表格中的${}
                this.replaceTextInTables(document, map);
                //TODO 替换其他的

                //将Docx文档写入文件
                File exportWord = new File(docxExportPath + docxExportName);
                FileOutputStream fileOutputStream = new FileOutputStream(exportWord);
                //输出文件
                document.write(fileOutputStream);
                fileOutputStream.flush();
                //TODO word转为pdf

                //关闭流
                fileOutputStream.close();
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /** 替换表格中的占位符 */
    private void replaceTextInTables(XWPFDocument document, Map<String, Object> dataMap) {
        //获取所有的表格
        List<XWPFTable> tables = document.getTables();
        //循环
        for (XWPFTable table : tables) {
            //获取每个表格的总行数
            int rcount = table.getNumberOfRows();
            for (int i = 0; i < rcount; i++) {
                //获取表格的第i行
                XWPFTableRow row = table.getRow(i);
                //获取一行的所有单元格
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    //一个cell相当于一个document
                    //获取单元格内的文本
                    String cellTextString = cell.getText();
                    //替换文本:${} -> value
                    cellTextString = this.replaceText(cellTextString, dataMap);
                    //移除表格中的段落
                    while (cell.getParagraphs().size() > 0) {
                        cell.removeParagraph(0);
                    }
                    //处理换行,并设置单元格内容
                    this.setWrap(cellTextString,cell);
                }
            }
        }
    }


    /** 替换段落中的占位符 */
    private void replaceTextInParagragh(XWPFDocument document, Map<String, Object> dataMap) {
        //获取整个Word所有段落:包含页眉或页脚文本的段落
        List<XWPFParagraph> paragraphs = document.getParagraphs();
        //循环
        for (XWPFParagraph paragragh : paragraphs) {
            //获取一段的所有本文
            List<XWPFRun> runs = paragragh.getRuns();
            //获取段落内容:paragragh.getText();
            //循环
            for (int i = 0; i < runs.size(); i++) {
                //XWPFRun--代表具有相同属性的一段文本
                XWPFRun xwpfRun = runs.get(i);
                //获取文本中的内容
                String paraString = xwpfRun.getText(xwpfRun.getTextPosition());
                if (paraString != null) {
                    //替换文字
                    paraString = this.replaceText(paraString, dataMap);
                    //设置替换后的段落
                    xwpfRun.setText(paraString, 0);
                }
            }
        }
    }

    /** 替换文字 */
    private String replaceText(String text, Map<String, Object> dataMap) {
        String paraString = text;
        //遍历map,将段落里面的${}替换成map里的value
        Iterator<Map.Entry<String, Object>> iterator = dataMap.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> entry = iterator.next();
            String key = entry.getKey();
            String value =  entry.getValue().toString();
            //组装map里的key为${key}
            StringBuffer sb = new StringBuffer();
            String placeHolder = sb.append("${").append(key).append("}").toString();
            //替换:将"${as}dasdas" --> value+dasdas
            paraString = paraString.replace(placeHolder, value);
        }
        return paraString;
    }

    /** 单元格内设置换行 */
    private void setWrap(String cellTextString,XWPFTableCell cell){
        if (cellTextString != null &&cellTextString.trim().contains("\n")){
            //创建文本
            XWPFRun run = cell.addParagraph().createRun();
            String[] split = cellTextString.split("\n");
            run.setText(split[0],0);
            for (int i = 1; i < split.length; i++) {
                //添加换行符
                run.addBreak();
                //设置单元格内容
                run.setText(split[i]);
            }
        }else {
            //设置单元格内容
            cell.setText(cellTextString);
        }
    }

    /** 根据路径和文件名 创建文件对象*/
    private File createFile(String filePath,String fileName){
        //pdf目录对象
        File file = new File(filePath);
        if (!file.exists() || !file.isDirectory()) {
            file.mkdirs();
        }
        //pdf文件对象
        StringBuffer filePathBuffer = new StringBuffer();
        filePathBuffer.append(filePath).append(fileName);
        return new File(filePathBuffer.toString());
    }
}

5.结果

xwpfdocument,Java文件解析,word,java

六、遇到问题

5.1输出为word的时候换行符无效

java换行符"\n"在word文档中不生效,使用"\r",“\r\n”,“(char)11”,“^p”,“br”,“<w:br>”,"w:p"等均无法实现单元格内换行的功能。

实现单元格内自动换行:文章来源地址https://www.toymoban.com/news/detail-800220.html

到了这里,关于Java文件:XWPFDocument导出Word文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java POI导出富文本的内容到word文档

    当创建使用富文本编辑器,操作完的数据,传输到后台都是带有html标签的。 如:h1标题头/h1h2第二个标题/h2a href=\\\"www.baidu.com\\\"百度搜索/a 我们想把富文本数据转换为Word内容。 Word是完全支持html标签的,但是我们获取到的富文本内容并不是完整的html代码,所有我们需要先补全

    2024年02月09日
    浏览(50)
  • Java利用POI-TL模板导出Word文档

    本文详细介绍了如何使用POI-TL,一个基于Apache POI的Word模板引擎,来导出Word文档。文章内容包括POI-TL的基本介绍,为什么选择POI-TL,以及如何使用POI-TL来处理文本、图片、表格、列表、嵌套、条件判断显示、非空集合循环和图表等内容。

    2024年02月09日
    浏览(110)
  • JAVA利用Freemarker模版动态生成并导出word文档(全网最详细)

    公司的某个需求,需要根据接口的信息生成一份word接口文档信息并支持导出功能。以前没做过这种需求,于是搜罗各种资料,最终发现java利用freemarker模版可以实现这个功能。 1、需要的环境 2、创建模板 1)展示word文档如下所示: 2)将word文档动态的参数替换成占位符,如下

    2024年02月16日
    浏览(45)
  • Java POI导出Word、Excel、Pdf文档(可在线预览PDF)

    1、导入依赖Pom.xml        dependency             groupIdorg.apache.poi/groupId             artifactIdpoi/artifactId             version3.14/version         /dependency 2、Controller   3、Service a、pdfService b、wordService c、excelService  4、Utils 5、模板截图   6、前端

    2024年02月08日
    浏览(59)
  • java使用apache.poi导出word文件

    功能说明: 将试卷导出word,并可以打印,装订,效果图: 下面是实现代码:

    2024年02月15日
    浏览(49)
  • Java将PDF文件转为Word文档

    一、创建Springboot Maven项目 二、导入依赖信息 三、创建Main类 代码如下: 效果展示:

    2024年02月11日
    浏览(55)
  • Java根据word模板生成word文档并转成PDF文件

    定义完我们的模板之后,我们要将文档保存为xml的格式 生成的xml格式看起来比较乱,没有层次感, 所以需要格式化一下 格式化 基础信息的定义 基础信息的定义只要保证我们转化成的xml文件中的${name}等格式没错误即可 表格的定义 遍历实现,表格的数据填充 在xml文件中我们的

    2024年02月09日
    浏览(62)
  • vue导出word文档(图文示例)

    第076个 查看专栏目录: VUE 在Vue中导出Word文档,可以使用第三方库file-saver和html-docx-js。首先需要安装这两个库: npm install file-saver html-docx-js --save 然后在Vue组件中使用这两个库来导出Word文档: 要生成 DOCX,只需将 HTML 文档(作为字符串)传递给 asBlob 方法以接收包含输出文件

    2024年02月19日
    浏览(34)
  • 【飞书】飞书导出md文档 | 飞书markdown文档导出 | 解决飞书只能导出pdf word

    github地址:https://github.com/Wsine/feishu2md 这是一个下载飞书文档为 Markdown 文件的工具,使用 Go 语言实现。 请看这里:招募有需求和有兴趣的开发者,共同探讨开发维护,有兴趣请联系。 《一日一技 | 我开发的这款小工具,轻松助你将飞书文档转为 Markdown》 配置文件需要填写

    2024年02月15日
    浏览(59)
  • 【PHPWrod】使用PHPWord导出word文档

    目的:PHP通过PHPWord类库导出文件为word。 开发语言及类库:ThinkPHP、PHPWord 项目根目录使用composer安装PHPWord,安装完成后会在vendor目录下生成phpoffice文件夹,就是PHPWord类库 前端代码 PHP代码 1、前端:先使用按钮事件,在点击事件里去请求后端返回的word文件的地址(这个地址是

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包