Java生成word文档

news2024/11/24 13:59:14

一 前言

Java编程生成word文档这种操作一般是常规操作比较常见,主要采用Apache的POI Word 这个库操作的比较多,还有的用Spire.Doc,但是这个库有些稍微难点的功能要收费,看了下费用还不低,周末朋友问起是否有用java操作word加上下标的经验,我是没有的,不过刚好借机研究下。 本文主要聊下POI,毕竟是免费的,更值得研究。

word 格式说明和POI支持情况: HWPF: MS-Word 97-2003(.doc),基于BIFF8格式的JAVA接口。只支持.doc文件简单的操作,读写能力有限。本API为POI项目早期开发,很不幸的 是主要负责HWPF模块开发的工程师-"Ryan Ackley"已经离开Apache组织,现在该模块没有人维护、更新、完善。 XWPF:MS-Word 2007+(.docx),基于OOXML格式的JAVA接口。较HWPF功能完善。

二 安装

都是利用的jar,不存在什么安装,直接配置pom文件即可。 添加POI的word的jar:

<!-- 操作excel的库 注意版本保持一致 poi poi-ooxml  poi-scratchpad -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>4.1.2</version>
      <scope>compile</scope>
    </dependency>

    
 <!--poi-ooxml和*poi-ooxml-schemas*是poi对2007及以上版本的扩充。-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.1.2</version>
      <scope>compile</scope>
    </dependency>

   <!--poi-ooxml和*poi-ooxml-schemas*是poi对2007及以上版本的扩充。-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>4.1.2</version>
      <scope>compile</scope>
    </dependency>
      

     <!-- WordToHtml .doc .odcx  poi  -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.1.2</version>
        </dependency>

三 基本使用

3.1  核心类

最核心的三个类: XWPFDocument : 文档本身的抽象、代表整个文档; XWPFParagraph: 段落、整个文档可以看做一个个段落组成、简单对应我们文章的段落; XWPFRun: 可以看做一个片段,整个段落由多个Run组成、每个Run可以有自己的文字内容、样式等。

XWPFTable: 表格,和段落平级;

3.2 文档

创建文档

XWPFDocument doc = new XWPFDocument();
或
XWPFDocument doc = new XWPFDocument(new FileInputStream("./deepoove.docx"));

获取文档上的元素、比如段落、表格、图片等。

// 段落
List<XWPFParagraph> paragraphs = doc.getParagraphs();
// 表格
List<XWPFTable> tables = doc.getTables();
// 图片
List<XWPFPictureData> allPictures = doc.getAllPictures();
// 页眉
List<XWPFHeader> headerList = doc.getHeaderList();
// 页脚
List<XWPFFooter> footerList = doc.getFooterList();

生成文档

try (FileOutputStream out = new FileOutputStream("simple.docx")) {
    doc.write(out);
}

3.3 段落

创建段落

XWPFParagraph p1 = doc.createParagraph();

段落样式设置:

// 对齐方式
p1.setAlignment(ParagraphAlignment.CENTER);
// 边框
p1.setBorderBottom(Borders.DOUBLE);
p1.setBorderTop(Borders.DOUBLE);
p1.setBorderRight(Borders.DOUBLE);
p1.setBorderLeft(Borders.DOUBLE);
p1.setBorderBetween(Borders.SINGLE);

3.4 基本样式Run

Run是段落的基本组成单元,可以是一段文字、也可以是一张图片、可以设置自己的不同样式风格。

获取段落内容

// 获取文字
String text = paragraph.getText();
// 获取段落内所有XWPFRun
List<XWPFRun> runs = paragraph.getRuns();

创建run

// 段落末尾创建XWPFRun
XWPFRun run = paragraph.createRun();
run.setText("为这个段落追加文本");

// 颜色
run.setColor("00ff00");
// 斜体
run.setItalic(true);
// 粗体
run.setBold(true);
// 字体
run.setFontFamily("Courier");
// 下划线
run.setUnderline(UnderlinePatterns.DOT_DOT_DASH);

获取段落中run和修改run

// 获取文字
String text = paragraph.getText();
// 获取段落内所有XWPFRun
List<XWPFRun> runs = paragraph.getRuns();

// 段落起始插入XWPFRun
XWPFRun insertNewRun = paragraph.insertNewRun(0);
insertNewRun.setText("在段落起始位置插入这段文本");

修改run

List<XWPFRun> runs = paragraph.getRuns();
// setText默认为追加文本,参数0表示设置第0个位置的文本,覆盖上一次设置
runs.get(0).setText("追加文本", 0);
runs.get(0).setText("修改文本", 0);

文本换行

run.addCarriageReturn();

3.5 关于图片

提取文档图片

List<XWPFPictureData> allPictures = doc.getAllPictures();
XWPFPicture pciture = allPictures.get(0);
byte[] data = pciture.getPictureData().getData();
// 接下来就可以将图片字节数组写入输出流

利用XWPFRun创建图片

List<XWPFPictureData> allPictures = doc.getAllPictures();
XWPFPicture pciture = allPictures.get(0);
byte[] data = pciture.getPictureData().getData();
// 接下来就可以将图片字节数组写入输出流

3.6 表格

创建三行三列的表格

XWPFTable table = doc.createTable(3, 3);

设置单元格的文本表格是由表格行XWPFRow构成,每行是由单元格XWPFCell构成,每个单元格内部又是由许多XWPFParagraph段落构成。

table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE");

上面代码和下面代码等价:

XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
XWPFRun r1 = p1.createRun();
r1.setText("EXAMPLE OF TABLE")

设置单元格里面的图片,可以按照上述办法获取到单元格的XWPFRun然后按照run添加图片的办法进行。

设置单元格的样式

XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
XWPFRun r1 = p1.createRun();
r1.setText("EXAMPLE OF TABLE")

四  实例

public class TestFirstDoc {

    public static void main(String[] args) throws IOException, InvalidFormatException {
        XWPFDocument document = new XWPFDocument();
        FileOutputStream out = new FileOutputStream(new File("测试文档.docx"));
        XWPFParagraph paragraph = document.createParagraph();

        // 基本测试
        XWPFRun paragraphOneRunOne = paragraph.createRun();
        paragraphOneRunOne.setText("测试第一个Run");
        paragraphOneRunOne.setBold(true);
        paragraphOneRunOne.setItalic(true);
        paragraphOneRunOne.addBreak();

        // 样式测试
        XWPFRun paragraphRun2 = paragraph.createRun();
        paragraphRun2.setText("为这个段落追加文本");
        paragraphRun2.setFontSize(20);
        paragraphRun2.setColor("00ff00");
        paragraphRun2.setFontFamily("Courier");
        paragraphRun2.setUnderline(UnderlinePatterns.DOT_DOT_DASH);

        // 上下标测试
        XWPFRun paragraphRun3 = paragraph.createRun();
        paragraphRun3.setText("设置正常文字");


        XWPFRun paragraphRun4 = paragraph.createRun();
        paragraphRun4.setText("上标");
        paragraphRun4.setItalic(true);
        paragraphRun4.setSubscript(VerticalAlign.SUPERSCRIPT);

        XWPFRun paragraphRun5 = paragraph.createRun();
        paragraphRun5.setText("下标");
        paragraphRun5.setItalic(true);
        paragraphRun5.setSubscript(VerticalAlign.SUBSCRIPT);

        // 设置换页,表格和上面内容分开来
        XWPFParagraph paragraph2 = document.createParagraph();
        paragraph2.setPageBreak(true);

        
        XWPFTable table = document.createTable(3, 3);
        table.getRow(0).getCell(0).setText("Head1");
        table.getRow(0).getCell(1).setText("Head2");
        table.getRow(0).getCell(2).setText("Head3");

        table.getRow(1).getCell(0).setText("col1");
        table.getRow(1).getCell(1).setText("col2");
        table.getRow(1).getCell(2).setText("col3");

        XWPFParagraph p1 = table.getRow(2).getCell(0).addParagraph();
        XWPFRun r1 = p1.createRun();
        InputStream stream = new FileInputStream("D:\\1.jpg");
        r1.addPicture(stream, XWPFDocument.PICTURE_TYPE_PNG, "Generated", Units.toEMU(256), Units.toEMU(256));


        document.write(out);
        out.close();
        System.out.println("测试完成");

    }
}

效果图:

69bfa21203e06a7b9a7b419cbcbaae1b.png第二页:

9f01b53f28c228d6b27cf723102c20de.png

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

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

相关文章

Linux - 守护进程的概念

Linux下的守护进程是在后台运行的特殊进程&#xff0c;它不与任何终端关联&#xff0c;通常在系统启动时自动启动&#xff0c;运行在后台并且不受用户登录或注销的影响。Linux 下的守护进程通常是以系统管理员的权限运行&#xff0c;用来执行一些系统任务&#xff0c;例如监控硬…

【RabbitMQ】RabbitMQ 集群的搭建 —— 基于 Docker 搭建 RabbitMQ 的普通集群,镜像集群以及仲裁队列

文章目录 一、集群分类1.1 普通模式1.2 镜像模式1.3 仲裁队列 二、普通集群2.1 目标集群2.2 获取 Erlang Cookie2.3 集群配置2.4 启动集群2.5 测试集群 三、镜像模式3.1 镜像模式的特征3.2 镜像模式的配置3.2.1 exactly 模式3.2.2 all 模式3.2.3 nodes 模式 3.3 测试镜像模式 四…

北大软微2024推免拟录取名单及分析

拟录取名单 直博生 硕士生 分析 北大软微在2023年的推免中共录取直博生17人&#xff0c;硕士生205人&#xff0c;其中硕士生全为专硕电子信息 当然&#xff0c;从录取结果咱们可以看出来&#xff0c;除了985和强势211&#xff0c;中国地质&#xff08;北京&#xf…

基于人工大猩猩部队算法的无人机航迹规划-附代码

基于人工大猩猩部队算法的无人机航迹规划 文章目录 基于人工大猩猩部队算法的无人机航迹规划1.人工大猩猩部队搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用人工大猩猩部队算法…

解决:GnuTLS recv error (-110): The TLS connection was non-properly terminated.

fatal: 无法访问 https://github.com/facebookresearch/fvcore/&#xff1a;GnuTLS recv error (-110): The TLS connection was non-properly terminated. error: subprocess-exited-with-error 关闭梯子&#xff0c;再试一次就好了

web前端——HTML+CSS实现奥运五环

web前端——HTMLCSS实现奥运五环 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

【Vue基础-实践】数据可视化大屏设计(林月明螺蛳粉文化公司单量数据大屏)

目录 一、知识整理 1、页面自适应 2、下载插件px to rem & rpx 3、关于padding与margin 4、下载echarts 5、下载axios 6、experss官网接口创建 7、创建路由 8、api接口创建 9、设置基准路径 10、跨域设置 11、图表设置 12、地图数据引用 13、设置地图效果 二、…

【MySQL】数据库MySQL基础知识与操作

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

聊一聊关于手机Charge IC的电流流向

关于手机Charge&#xff0c;小白在以前的文章很少讲&#xff0c;一是这部分东西太多&#xff0c;过于复杂。二是总感觉写起来欠缺点什么。但后来想一想&#xff0c;本是抱着互相学习来写文章的心理态度&#xff0c;还是决定尝试写一些。 关于今天要讲的关于手机Charge的内容&a…

软件测试具体人员分工

最近看了点敏捷测试的东西&#xff0c;看得比较模糊。一方面是因为没有见真实的环境与流程&#xff0c;也许它跟本就没有固定的模式与流程&#xff0c;它就像告诉人们要“勇敢”“努力”。有的人在勇敢的面对生活&#xff0c;有些人在勇敢的挑战自我&#xff0c;有些人在勇敢的…

SLAM从入门到精通(被忽视的基础图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 工业上用激光slam的多&#xff0c;用视觉slam的少&#xff0c;这是大家都知道的常识。毕竟对于工业来说&#xff0c;健壮和稳定是我们必须要考虑的…

电脑文件批量重命名攻略:高效操作技巧助您轻松完成任务

在日常使用电脑时&#xff0c;我们经常需要对文件进行重命名。当文件数量众多时&#xff0c;手动重命名既耗时又容易出错。此时&#xff0c;借助一些实用技巧&#xff0c;我们可以轻松地完成电脑文件的批量重命名。本文将提供一份全面的电脑文件批量重命名攻略&#xff0c;帮助…

k8s之service五种负载均衡byte的区别

1&#xff0c;什么是Service&#xff1f; 1.1 Service的概念​ 在k8s中&#xff0c;service 是一个固定接入层&#xff0c;客户端可以通过访问 service 的 ip 和端口访问到 service 关联的后端pod&#xff0c;这个 service 工作依赖于在 kubernetes 集群之上部署的一个附件&a…

产品实习笔记——会员体系 积分体系

文章目录 引入会员体系1. 业务逻辑产品化2. 产品逻辑可视化2.1 成长值&#xff1a;会员等级的判断机制2.1.1 成长值的获得2.1.1 成长值的消耗 2.2 会员等级区间划分2.3 成长值风控体系2.4 会员权益2.4.1 普通会员权益2.4.2 阶梯式会员权益 积分体系有赞商城&#xff08;会员体系…

YOLOv8-Seg改进:动态稀疏注意力(BiLevelRoutingAttention) | CVPR2023

🚀🚀🚀本文改进:动态稀疏注意力(BiLevelRoutingAttention),实现更灵活的计算分配和内容感知,使其具备动态的查询感知稀疏性,引入到YOLOv8-Seg任务中,1)与C2f结合实现二次创新;2)注意力机制使用; 🚀🚀🚀BiLevelRoutingAttention 亲测在番薯破损分割任务…

听GPT 讲Rust源代码--library/std(16)

题图来自 EVALUATION OF RUST USAGE IN SPACE APPLICATIONS BY DEVELOPING BSP AND RTOS TARGETING SAMV71[1] File: rust/library/std/src/sync/mpmc/select.rs 在Rust标准库中&#xff0c;rust/library/std/src/sync/mpmc/select.rs文件的作用是实现一个多生产者多消费者的选…

Java-Hbase介绍

1.1. 概念 base 是分布式、面向列的开源数据库&#xff08;其实准确的说是面向列族&#xff09;。HDFS 为 Hbase 提供可靠的 底层数据存储服务&#xff0c;MapReduce 为 Hbase 提供高性能的计算能力&#xff0c;Zookeeper 为 Hbase 提供 稳定服务和 Failover 机制&#xff0c…

如何远程访问WAMP搭建的内网Web站点?

花生壳是由贝锐自主研发的域名解析工具&#xff0c;可帮助用户实现外网访问到局域网内搭建的各类办公系统。以发布网站服务为例&#xff0c;下面就给大家演示下如何通过花生壳实现外网访问WAMP站点。 1. 搭建WAMP站点 &#xff08;1&#xff09;首先&#xff0c;用户需在本地…

leetcode-经典面/笔试题目

1.消失的数字 面试题 17.04. 消失的数字 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/missing-number-lcci/ 这个题目当然有好几种解法&#xff0c;这里我推荐一种比较优秀的思路&#xff0c;也就是单身狗思路&#xff1a;异或。 异或的特点是相异…

(免费领源码)小程序+spring boot+masql校园志愿者管理系统99213-计算机毕业设计项目选题推荐

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;校园志愿者管理系统被用户普遍使用&#xff0c;为方便用户…