java中,怎样用最简单方法实现写word文档

在跨平台环境中实现写word时,如果用现成的库,就会涉及跨平台兼容性问题,比如在安卓与java中实现写word的功能。还有一个问题就是,完全用程序生成word文档,工作量较大。所以采用了模板替换的方法。

docx文档本质就是一个zip文件,只要将它的扩展名改成zip,就能解压出一系列的xml文件与图片文件,它的目录结构如下:

  1. [Content_Types].xml:定义了文档中所有文件的 MIME 类型。

  2. _rels/:包含了文档的元数据和关系信息,有一个特殊的文件 .rels,定义了文档的内部链接和外部链接。

  3. docProps/:这个文件夹包含文档的属性信息,如标题、作者、主题等。

    • app.xml:包含应用程序特定的属性;
    • core.xml:包含核心属性,如标题、作者、创建日期等;
    • custom.xml:包含自定义元数据。
  4. word/:这个文件夹包含文档的主要内容和设置。

    • document.xml:这是文档的主要 XML 文件,包含了文本、样式、段落、表格和其他内容;
    • footer1.xml:页脚;
    • header1.xml:页眉;
    • styles.xml:包含文档中使用的样式定义;
    • settings.xml:包含文档的设置,如页面布局、标题等;
    • fontTable.xml:包含文档中使用的字体列表;
    • numbering.xml:包含文档中的编号格式定义;
    • theme/:包含文档的主题信息,如颜色方案、字体方案等;
    • media/:包含文档中使用的图像和其他媒体文件。

DOCX 文件的 XML 结构是层次化的,通常以 w:document 作为根元素,然后包含以下主要部分:

  • w:body:包含文档的主体内容,如段落 (w:p)、表格 (w:tbl)、图片 (w:drawing) 等;
  • w:p:段落元素,包含文本和格式化信息;
  • w:r:运行元素,表示文本的一段连续区域,可以包含文本 (w:t) 和格式化信息;
  • w:t:文本元素,包含实际的文本内容;
  • w:tbl:表格;
  • w:tr,w:tc:表格中的行与列。

每个 XML 文件都遵循 OOXML 的命名空间规则,并且使用特定的 XML 模式进行定义。

主要内容在word目录下,通常关注word目录下的document.xml,header1.xml、footer1.xml以及media子目录下的图片文件。

在程序中产生的数据,通常是规则的,比如表格数据(如下图),非常适合传给freemarker,由它替换到word目录下三个xml文件以及media子目录下的文件。注意:图片不能用base64格式,需要将它转成二进制格式,一个小遗憾,如果能用,模板定义就更简单了。

模板制作方法也很简单:用office或wps写一个文档,定义好格式,在需要占位的地方写上特定的内容(只要在xml中容易找到就可以)。然后将docx扩展名改成zip,解压后,在word目录下的document.xml,header1.xml、footer1.xml中,将内容都改成指定的占位符就行了。

freemarker的语法这里就不介绍了。freemarker在安卓中有点点问题,具体不记得了。我用的是js,把几个xml文档改成js程序,样例如下:

var xml=[];
xml.push(`....`);
if(conditions...) xml.push(`....`)
.....
xml.join('');//输出最后的内容

把它们放到一个js引擎中,比如graalvm的js引擎,安卓上的quickjs引擎等,因为都是基本js语法,不会有兼容性问题。js执行的最终输出结果就是所需的xml文档。

生成完毕,按原来的结构压缩成zip包,再改成docx扩展名就可以了。

至简网格的服务器要在java与安卓中都能运行,兼容性就是个大问题,并且资源占用不可能像普通服务器那样没有节制,所以用的就是这种方法。因为本身要用js引擎做接口实现的扩展,所以js引擎是必须的,顺带着,部分模板就用js实现拼接。

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

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

相关文章

算法与数据结构:二叉排序树与AVL树

ACM大牛带你玩转算法与数据结构-课程资料 本笔记属于船说系列课程之一,课程链接: 哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep66799?csourceprivate_space_class_null&spm_id_from333.999.0.0 你也可以选择购买『船说系列课程-年度会…

# AI作画原理:生成对抗网络(GAN)的原理与应用

AI作画原理:生成对抗网络(GAN)的原理与应用 现在,AI已经可以画出非常逼真的图像了。那么,AI是怎么做到这一点的呢? 深度学习与生成对抗网络(GAN) AI画画的核心技术之一是深度学习&…

关于MySQL数据库和数据表的基础

目录 一. 数据库的基础SQL 1. 创建数据库 2. 查看当前有哪些数据库 3. 选中数据库 4. 删除数据库 5. 小结 二. 数据表的基础SQL 1. 创建数据表 2. 查看当前数据库中有哪些表 3. 查看指定表的详细情况(查看表的结构) 4. 删除表 5. 小结 一. 数据库的基础SQL 1. 创建…

史上最全排序算法整理!(1)

1.排序的概念及其应用 1.1排序的概念 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之&#…

实战解析:爬取音乐每日推荐歌单并自动分享

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、准备阶段 三、实战步骤 四、总结与展望 一、引言 在数字化时代&#xff0c…

Gartner发布评估威胁情报计划有效性指南:评估威胁情报有效性的四个步骤

许多组织都在努力实施 TI 并评估其价值。安全和风险管理领导者必须使用优先情报要求来评估其 TI 计划的有效性,并根据其组织战略完善该计划。 主要发现 尽管许多组织已将威胁情报 (TI) 纳入其安全计划,但他们很难评估其性能、成熟度以及在相关产品和服务…

糖尿病视网膜病变分级新方法:卷积网络做分割和诊断 + 大模型生成详细的测试和治疗建议

糖尿病视网膜病变分级新方法:卷积网络做分割和诊断 大模型生成详细的测试和治疗建议 提出背景相关工作3.1 数据集3.1.1 病变分割 3.1.2 图像分级3.1.3 大型语言模型(LLMs) 解法 数据预处理 数据增强 网络架构 训练过程 测试过程子解法1…

【408真题】2009-25

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

【数据结构与算法 | 队列篇】力扣102, 107

1. 力扣102 : 二叉树的层序遍历 (1). 题 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3]…

STM32FLASH闪存

文章目录 前言首先来回顾一下存储器映像FLASH简介闪存模块组织Flash基本结构(关系)图Flash解锁使用指针访问存储器FLASH操作Flash全擦除Flash页擦除Flash写入 选项字节选项字节操作选项字节擦除选项字节写入 器件电子签名注意闪存控制寄存器一览 前言 本…

[leetcode hot 150]第一百九十一题,位1的个数

题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中设置位的个数(也被称为汉明重量)。 这道题比较简单,直接对最后一位进行与1的与操作,然…

RTPS协议之Messages Module

目录 Messages ModuleType定义RTPS消息结构RTPS消息头子消息结构 RTPS消息接收者SubmessageElementsRTPS HeaderRTPS Submessages Messages Module RTPS Writer和RTPS Reader之间的交换数据的消息。 Type定义 TypePurposeProtocolId_tSubmessageFlagsub msg flagSubmessageK…

第16章-超声波跟随功能 基于STM32的三路超声波自动跟随小车 毕业设计 课程设计

第16章-超声波跟随功能 无PID跟随功能 //超声波跟随if(HC_SR04_Read() > 25){motorForward();//前进HAL_Delay(100);}if(HC_SR04_Read() < 20){motorBackward();//后退HAL_Delay(100);}PID跟随功能 在pid.c中定义一组PID参数 tPid pidFollow; //定距离跟随PIDpidFol…

越来越多的连锁企业选择开源连锁收银系统

连锁企业的收银系统作为其信息化的基础&#xff0c;随着运营的复杂化&#xff0c;越来越多的连锁企业选择开源连锁收银系统来满足其日常经营需要。商淘云为大家分享连锁企业选择开源连锁收银系统的三大原因&#xff0c;大家点赞收藏。 首先是灵活性和定制性强&#xff0c;连锁企…

网络故障与排除(一)

一、Router-ID冲突导致OSPF路由环路 路由器收到相同Router-ID的两台设备发送的LSA&#xff0c;所以查看路由表看到的OSPF缺省路由信息就会不断变动。而当C1的缺省路由从C2中学到&#xff0c;C2的缺省路由又从C1中学到时&#xff0c;就形成了路由环路&#xff0c;因此出现路由不…

登录安全分析报告:小米官网注册

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

重学java 51.Collections集合工具类、泛型

"我已不在地坛&#xff0c;地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…

Nginx教程(持续更新中~)

浏览器优先查看host文件中的映射&#xff0c;如果host中没有就会从网上CDN找该域名对应的ip,但是目前使用的www.123.com是外卖假设的&#xff0c;CDN中并没有&#xff0c;所以就采用host中填写 第二种weight: 第三种 ip_hash: 第四种 fair: ​​​​​​

常见webshell工具及特征分析

前言 在工作中经常会遇到各种websehll&#xff0c;黑客通常要通过各种方式获取 webshell&#xff0c;从而获得企业网站的控制权&#xff0c;识别出webshell文件或通信流量可以有效地阻止黑客进一步的攻击行为&#xff0c;下面以常见的四款webshell进行分析&#xff0c;对工具连…

检测头篇 | YOLOv8改进之添加小目标检测头 / 添加大目标检测头 / 减少检测头

前言:Hello大家好,我是小哥谈。本文首先给大家展示原始YOLOv8的网络结构图,然后再对其进行改变,即增加小目标检测头、增加大目标检测头和减少检测头。🌈 目录 🚀1.网络结构图