word导入导出-Apache POI 和 Poi-tl

news2025/1/31 7:39:03

word 文件读取

使用Apache POI Word 进行读取文件
使用poi 时如果报ClassNotFoundException 等错误,请注意请求以下maven 文件的版本
Apache POI Word 说明文档:Apache POI Word 说明文档

maven 解决依赖冲突教程:https://www.cnblogs.com/shangxiaofei/p/17662176.html

1:导包

 <!--poi-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>

        <!--读取doc文件-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>5.2.2</version>

        </dependency>

2:读取doc和docx文件的工具类

package com.wkl.testdemo.word;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

/**
 * 读取word工具类
 */
public class ReadWordUtil {
    public static String readWord(InputStream inputStream, String suffix) throws Exception{
        String buffer = "";
        try {
            if ("doc".equals(suffix)) {
                HWPFDocument document = new HWPFDocument(inputStream);
                WordExtractor extractor = new WordExtractor(document);
                buffer = extractor.getText();
                String[] paragraphText = extractor.getParagraphText();
                //解析段落
                for (String s : paragraphText) {
                    System.out.println(s);
                }
                extractor.close();
                document.close();
            } else if ("docx".equals(suffix)) {
                XWPFDocument doc = new XWPFDocument(inputStream);
                XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
                buffer = extractor.getText();
                //解析段落
                List<XWPFParagraph> paragraphs = doc.getParagraphs();
                for (XWPFParagraph paragraph : paragraphs) {
                    String text1 = paragraph.getText();
                    System.out.println(text1);
                }
                extractor.close();
                doc.close();
            }
            return buffer;
        } catch (Exception e) {
            throw e;
        }
    }
    public static void main(String[] args) throws Exception {
        String pathdocx = "C:\\Users\\wenge\\Desktop\\新建 DOCX 文档.docx";
        readWord(new FileInputStream(new File(pathdocx)),"docx");
        String pathdoc = "C:\\Users\\wenge\\Desktop\\新建 DOC 文档.doc";
        readWord(new FileInputStream(new File(pathdoc)),"doc");
    }
}

导出word文档-Poi-tl

1:Poi-tl介绍

poi-tl是一个基于Apache POI的Java库,用于操作Microsoft Office文档,包括Word文档(.docx)、Excel电子表格(.xlsx)和PowerPoint演示文稿(.pptx)。它提供了一组简单易用的API,使开发人员能够轻松地创建、读取和修改Office文档。

poi-tl的主要特点如下:

  • 简单易用:poi-tl提供了一组简单易用的API,使开发人员能够快速上手并进行Office文档的操作。它提供了丰富的方法和属性,以满足不同的需求。

  • 支持多种文档格式:poi-tl支持多种常见的Office文档格式,包括Word文档(.docx)、Excel电子表格(.xlsx)和PowerPoint演示文稿(.pptx)。开发人员可以使用poi-tl来创建、读取和修改这些文档。

  • 功能丰富:poi-tl提供了许多有用的功能,如创建和修改文档的样式、添加和删除文本、插入和删除图片、创建和修改表格、添加和删除行列等。它还支持合并单元格、设置字体样式和颜色、设置边框和背景颜色等高级功能。

  • 支持模板引擎:poi-tl支持使用模板引擎来生成Office文档。开发人员可以使用模板引擎来定义文档的结构和样式,并使用poi-tl来填充数据。这样可以实现文档的动态生成,使开发人员能够更灵活地生成各种类型的文档。

  • 支持国际化:poi-tl支持国际化,可以根据不同的语言和地区生成相应的文档。开发人员可以使用poi-tl提供的API来设置文档的语言、日期格式、货币格式等,以满足不同国家和地区的需求。

  • 开源免费:poi-tl是一个开源的Java库,使用Apache License 2.0许可证。这意味着开发人员可以免费使用和修改poi-tl,并将其用于商业和非商业项目。

综上所述,poi-tl是一个功能强大且易于使用的Java库,用于操作Microsoft Office文档。它提供了丰富的API和功能,使开发人员能够轻松地创建、读取和修改Office文档。无论是生成报告、导出数据还是进行数据分析,poi-tl都是一个理想的选择

2:Poi-tl和其他模板引擎对比

在这里插入图片描述
其中:
poi-tl官网地址:https://deepoove.com/poi-tl/
Apache POI Word 说明文档:Apache POI Word 说明文档

3:Poi-tl 功能列表

在这里插入图片描述

4:导包

看poi-tl 官网,有版本建议
在这里插入图片描述

        <!--poi word-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.0</version>
        </dependency>
        <!--poi-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>

        <!--读取doc文件-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>5.2.2</version>
        </dependency>

5:导出文件测试-helloworld

1:生成一个模板.docx
在这里插入图片描述

2:程序测试

package com.wkl.testdemo.word;

import com.deepoove.poi.XWPFTemplate;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author wangkanglu
 * @version 1.0
 * @description
 * @date 2023-12-20 15:53
 */
public class WriteWordUtil {

    public static void main(String[] args) {
        String path = "C:\\Users\\Desktop\\模板.docx";
        Map<String,String> data = new HashMap<>();
        data.put("title","标题1111");
        data.put("publishTime","2023-12-20 13:12:12");
        data.put("content","内容");
        try {
            toword(data,path,"C:\\Users\\Desktop\\模板1.docx");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 生成word工具类
     * @param datas 数据
     * @param filePath 模板地址
     * @param descpath 输出地址
     * @return 返回生成文件路径
     * @throws IOException
     */
    public static String toword(Map datas, String filePath, String descpath) throws IOException {
        String outPath = descpath;
        XWPFTemplate template = XWPFTemplate.compile(filePath)
                .render(datas);
        FileOutputStream out = new FileOutputStream(outPath);
        template.write(out);
        template.close();
        return descpath;
    }
}

3:结果:
在这里插入图片描述

6:复杂使用-增加文件批注


package com.wkl.testdemo.word;

import java.io.IOException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.util.LocaleUtil;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.Documents;
import com.deepoove.poi.data.Documents.DocumentBuilder;
import com.deepoove.poi.data.ParagraphRenderData;
import com.deepoove.poi.data.Paragraphs;
import com.deepoove.poi.data.Pictures;
import com.deepoove.poi.data.TableRenderData;
import com.deepoove.poi.data.Tables;
import com.deepoove.poi.data.Texts;
import com.deepoove.poi.data.style.Style;
import com.deepoove.poi.plugin.comment.CommentRenderData;
import com.deepoove.poi.plugin.comment.CommentRenderPolicy;
import com.deepoove.poi.plugin.comment.Comments;
import com.deepoove.poi.plugin.comment.Comments.CommentBuilder;

public class CommentRenderPolicyTest {

    public static void main(String[] args) {
        try {
            testCommentExample();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

  

    public static void testCommentExample() throws IOException {
        // comment
        CommentRenderData comment0 = newCommentBuilder().addText(Texts.of("咏鹅").fontSize(20).bold().create())
                .comment(Documents.of()
                        .addParagraph(Paragraphs.of(Pictures.ofLocal("D:\\Pictures\\002KoyJzly1hix2zhdr2qj60sq0sq0uu02.jpg").create()).create())
                        .create())
                .create();
        CommentRenderData comment1 = newCommentBuilder().addText("骆宾王")
                .comment("骆宾王作为“初唐四杰”之一,对荡涤六朝文学颓波,革新初唐浮靡诗风。他一生著作颇丰,是一个才华横溢的诗人。")
                .create();
        CommentRenderData comment2 = newCommentBuilder().addText("曲项").comment("弯着脖子").create();
        CommentRenderData comment3 = newCommentBuilder().addText("拨").comment("划动").create();

        // document 
        DocumentBuilder documentBuilder = Documents.of()
                .addParagraph(Paragraphs.of().addComment(comment0).center().create());
        documentBuilder.addParagraph(Paragraphs.of().addComment(comment1).center().create());
        documentBuilder.addParagraph(Paragraphs.of("鹅,鹅,鹅,").addComment(comment2).addText("向天歌。").center().create());
        documentBuilder.addParagraph(Paragraphs.of("白毛浮绿水,红掌").addComment(comment3).addText("清波。").center().create());

        // render
        XWPFTemplate.create(documentBuilder.create(), Style.builder().buildFontFamily("微软雅黑").buildFontSize(14f).build())
                .writeToFile("C:\\Users\\Desktop\\增加批注.docx");
    }

    private static CommentBuilder newCommentBuilder() {
        return Comments.of().signature("Sayi", "s", LocaleUtil.getLocaleCalendar());
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1329679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的剧本杀预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的剧本杀预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

从零开发短视频电商 在AWS上SageMaker部署模型自定义日志输入和输出示例

从零开发短视频电商 在AWS上SageMaker部署模型自定义日志输入和输出示例 怎么部署自定义模型请看&#xff1a;从零开发短视频电商 在AWS上用SageMaker部署自定义模型 都是huaggingface上的模型或者fine-tune后的。 为了适配jumpstart上部署的模型的http输入输出&#xff0c;我…

和数软件:区块链技术重塑未来的分布式账本

区块链技术作为一项革命性的分布式账本技术&#xff0c;正在逐渐改变我们的生活方式和商业模式。它的出现为金融、供应链、物联网等领域带来了巨大的变革。本文将深入探讨区块链技术的原理、特点、应用以及未来发展趋势。 一、区块链技术原理 区块链是一种去中心化的数据库技术…

27.Java程序设计-基于Springboot的在线考试系统小程序设计与实现

1. 引言 随着数字化教育的发展&#xff0c;在线考试系统成为教育领域的一项重要工具。本论文旨在介绍一个基于Spring Boot框架的在线考试系统小程序的设计与实现。在线考试系统的开发旨在提高考试的效率&#xff0c;简化管理流程&#xff0c;并提供更好的用户体验。 2. 系统设…

Java之LinkedList核心源码解读

LinkedList核心源码解读 LinkedList 是一个基于双向链表实现的集合类&#xff0c;经常被拿来和 ArrayList 做比较 LinkedList 插入和删除元素的时间复杂度&#xff1f; 头部插入/删除&#xff1a;只需要修改头结点的指针即可完成插入/删除操作&#xff0c;因此时间复杂度为 O…

洛谷 NOIP2016 普及组 回文日期

这道题目本来是不难想思路的。。。。。。 然而我第一次做的时候改了蛮久才把代码完全改对&#xff0c;主要感觉还是不够细心&#xff0c;敲的时候也没注意见检查一些小错误&#xff0c;那么接下来不说废话&#xff0c;请看题干&#xff1a; 接下来请看输入输出的样例以及数据范…

基于Vite+Vue3 给项目引入Axios

基于ViteVue3 给项目引入Axios,方便与后端进行通信。 系列文章指路&#x1f449; 系列文章-基于Vue3创建前端项目并引入、配置常用的库和工具类 文章目录 安装依赖新建src/config/config.js 用于存放常用配置进行简单封装解决跨域问题调用尝试 安装依赖 npm install axios …

YOLOv8改进 | 主干篇 | 利用MobileNetV3替换Backbone(轻量化网络结构)

一、本文介绍 本文给大家带来的改进机制是MobileNetV3&#xff0c;其主要改进思想集中在结合硬件感知的网络架构搜索&#xff08;NAS&#xff09;和NetAdapt算法&#xff0c;以优化移动设备CPU上的性能。它采用了新颖的架构设计&#xff0c;包括反转残差结构和线性瓶颈层&…

Mac电脑上soucetree账户更改

在开发公司项目的时候遇到一个问题。soucetree提示需要输入已离职员工-张三的密码。 问题&#xff1a;Mac电脑使用souetree&#xff0c;拉取仓库代码提示需要输入其他员工密码。 解决&#xff1a; Mac电脑 SourceTree去掉之前的账户 1、前往文件路径 /Library/Application Su…

linux 中 C++的环境搭建以及测试工具的简单介绍

文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测gtest 单元测试 makefile 介绍 安装 : sudo apt install make makefile 的规则: 举例说明 包括&#xff1a;目标文件 、 依赖文件 、 生成规则 使用 &#xff1a; make make clean CMake : CMake是一个…

深度解析LinkedList

LinkedList是Java集合框架中List接口的实现之一&#xff0c;它以双向链表的形式存储元素。与传统的数组相比&#xff0c;链表具有更高的灵活性&#xff0c;特别适用于频繁的插入和删除操作。让我们从底层实现开始深入了解这个强大的数据结构。 底层数据结构 LinkedList的底层数…

LTO-3 磁带机种草终于是用上了

跑来跑去&#xff0c;买了不少配件&#xff0c;终于是把这磁带机给用上了&#xff0c;已经备份好了300 多 GB 的数据。 我们用了 NAS 的数据压缩功能&#xff0c;把需要备份的文件用 NAS 压缩成一个 Zip 文件&#xff0c;如果你可以 tar 的话也行。 这样传输速度更快&#xf…

Android Studio各种Gradle常见报错问题及解决方案

大家好&#xff0c;我是咕噜铁蛋&#xff01;在开发Android应用程序时&#xff0c;我们可能会遇到各种Gradle错误。这些错误可能来自不同的原因&#xff0c;例如依赖项问题、配置错误、版本冲突等。今天我通过搜索整理了一下&#xff0c;在这篇文章中&#xff0c;我将分享一些常…

SpringIOC之BeanFactoryResolver

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

Canal使用详解

Canal介绍 Canal是阿里巴巴开发的MySQL binlog增量订阅&消费组件&#xff0c;Canal是基于MySQL二进制日志的高性能数据同步系统。在阿里巴巴集团中被广泛使用&#xff0c;以提供可靠的低延迟增量数据管道。Canal Server能够解析MySQL Binlog并订阅数据更改&#xff0c;而C…

python3 数据分析项目案例,用python做数据分析案例

本篇文章给大家谈谈python3 数据分析项目案例&#xff0c;以及用python做数据分析案例&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 目录 一丶可视化绘图案例 1.曲线图 2.柱形图 3.点线图 4.3D散点图 5. 绘制漏斗图 6. 绘制词云图 二丶包/模块使用示例 (1)…

用Python处理PDF:拆分与合并PDF文档

PDF文档在信息共享和数据保存方面被广泛使用&#xff0c;处理PDF文档也成为常见需求。其中&#xff0c;合并和拆分PDF文档能够帮助我们更有效地管理PDF文档&#xff0c;使文档内容分布更合理。通过合并&#xff0c;可以将相关文档整合成一个文件&#xff0c;以便更好地组织和提…

蓝桥杯2019年10月青少组Python程序设计省赛真题

1:有n个人围成一个圈,按顺序排好号然后从第一个人开始报数(从1到3报数),报到3的人退出圈子,然后继续从1到3报数,直到最后留下一个人游戏结束,问最后留下的是原来第几号输人描迹:输人一个正整数n 输出描迹:输出最后留下的是原来的第几号 [样例输人] [样例输出] 2: 3、 […

P1883 函数

题目链接 P1883 函数 思路 举例 题目中的 F ( x ) F(x) F(x) 看起来很复杂&#xff0c;但由于每个 f ( x ) f(x) f(x) 的二次项系数 a a a 都不是负数&#xff0c;故 F ( x ) F(x) F(x) 是一个单谷函数。直接说出结论可能有些令人难以接受&#xff0c;不妨举出两个例子…

mysql忘记了密码

1.查找mysql的配置文件 find / -name my.cnf 2.编辑my.cnf vim /etc/my.cnf 3. 在最后一行添加skip-grant-tables跳过密码校验 4.检查mysql服务是否已正常启动 service mysqld status 5.修改完配置重启服务 systemctl restart msyqld 6.键入 msyql直接进入mysql mysql 7.进入my…