将样式文本写入 .docx 文件

2023-12-04

我正在尝试编写一个将文本写入 .docx 文件的应用程序。我的应用程序使用 JTextPane,因此用户可以编写他/她想要的任何内容,并且它还提供了许多按钮,例如粗体、字体颜色、字体大小...等。我遇到的问题是在写入 .docx 文件时保持 JTextPane 上文本的样式。我对 Swing 和 Apache POI 相当陌生,因此示例代码和/或详细解释会很有帮助。

我所拥有的是:(pad 指的是 JTextPane)

FileOutputStream output = new FileOutputStream(file);
XWPFDocument document = new XWPFDocument();
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(pad.getText());   
document.write(output);
output.close();

对于我的示例,我假设您会使用HTMLEditorKit在你的JTextPane。然后我会解析StyledDocument窗格并相应地设置文本运行。

当然,这只是一个开始,您需要解析所有可能的样式并在下面的循环中自行转换它们。

我必须承认,我从未使用 HTMLEditorKit 做过任何事情,因此我不知道如何正确处理 CSS.CssValues。

import java.awt.Color;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.Enumeration;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import org.apache.poi.xwpf.usermodel.*;


public class StyledText {
    public static void main(String[] args) throws Exception {
        // prepare
        JTextPane pad = new JTextPane();
        pad.setContentType("text/html");
        HTMLEditorKit kit = (HTMLEditorKit)pad.getEditorKit();
        HTMLDocument htmldoc = (HTMLDocument)kit.createDefaultDocument();
        kit.insertHTML(htmldoc, htmldoc.getLength(), "<p>paragraph <b>1</b></p>", 0, 0, null);
        kit.insertHTML(htmldoc, htmldoc.getLength(), "<p>paragraph <span style=\"color:red\">2</span></p>", 0, 0, null);
        pad.setDocument(htmldoc);

        // convert
        StyledDocument doc = pad.getStyledDocument();
        XWPFDocument docX = new XWPFDocument();

        int lastPos=-1; 
        while (lastPos < doc.getLength()) {
            Element line = doc.getParagraphElement(lastPos+1);
            lastPos = line.getEndOffset();
            XWPFParagraph paragraph = docX.createParagraph();
            for (int elIdx=0; elIdx < line.getElementCount(); elIdx++) {
                final Element frag = line.getElement(elIdx);

                XWPFRun run = paragraph.createRun();
                String subtext = doc.getText(frag.getStartOffset(), frag.getEndOffset()-frag.getStartOffset());
                run.setText(subtext);

                final AttributeSet as = frag.getAttributes();
                final Enumeration<?> ae = as.getAttributeNames();

                while (ae.hasMoreElements()) {
                    final Object attrib = ae.nextElement();

                    if (CSS.Attribute.COLOR.equals(attrib)) {
                        // I don't know how to really work with the CSS-swing class ...
                        Field f = as.getAttribute(attrib).getClass().getDeclaredField("c");
                        f.setAccessible(true);
                        Color c = (Color)f.get(as.getAttribute(attrib));
                        run.setColor(String.format("%1$02X%2$02X%3$02X", c.getRed(),c.getGreen(),c.getBlue()));
                    } else if (CSS.Attribute.FONT_WEIGHT.equals(attrib)) {
                        if ("bold".equals(as.getAttribute(attrib).toString())) {
                            run.setBold(true);
                        }
                    }
                }               
            }
        }

        FileOutputStream fos = new FileOutputStream("test.docx"); 
        docX.write(fos);
        fos.close();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将样式文本写入 .docx 文件 的相关文章

随机推荐

  • constexpr 对于重载有用吗

    C 中有没有一种方法可以根据输入的运行时 编译时常量调用不同的重载 我的 MSVC 版本 12 无法使用 constexpr 执行此操作 阅读 C 文档 我不确定这是否是 constexpr 的工作方式 inline int Flip4 c
  • 从 Unity 中的另一个脚本访问对象的位置

    我正在制作一个同时包含球和玩家的游戏 到目前为止 我为球制作了一个球体 为玩家制作了一个正方形 模型将在稍后制作 我为玩家附加了一个移动脚本 以便它可以向各个方向移动 但我希望他能够在碰到球时捡起球 为此 我假设在球脚本中的碰撞函数中 我必
  • 如何使用 Sevenzipsharp 提取文件

    我将使用 Sevenzipsharp 将 ISO 文件中的文件提取到 USB 为此 我从 vs nuget 包管理器下载了 Sevenzipsharp 并编写了 实际上我不能 这段代码 我没有接受任何错误 但它不起作用 我哪里会犯错误 请写
  • 使用 javascript 搜索“\”

    我编写了以下代码来仅获取不带扩展名和路径的文件名 我正在浏览器中运行它
  • React-Router 在新选项卡中打开链接

    有没有办法得到反应路由器在新选项卡中打开链接 我尝试了这个 但没有成功 Test 可以通过添加类似的东西来弄乱它onClick foo 像我上面那样链接到链接 但会出现控制台错误 Thanks 从 React Router 版本 5 0 1
  • 用于检查号码以“078”开头且仅包含 10 位数字的正则表达式

    我需要验证 Asp Net 应用程序中的文本框 用户可以在其中输入手机号码 并且该号码应以 078 开头 并应包含 10 位数字 Sample 0781234567 这是我的代码 public static bool CheckPhoneN
  • 在 jQuery 移动应用程序中将参数从一个页面传递到另一个页面

    我正在使用 PhoneGap 构建 jQuery 移动应用程序 我必须使用 jQuery mobile 传递前一个页面的一些参数来打开一个新页面 为此 我尝试使用本地存储 如下所示 li click function console log
  • 使用 ServiceStack.Client 超时

    我已经通过 AJAX 调用使用服务堆栈一段时间了 没有出现任何问题 但最近创建了一个快速 winforms 应用程序 它利用服务堆栈客户端 特别是 JsonServiceClient 然而 我遇到了一个问题 即我一直在呼叫超时 但在前两次尝
  • 为什么Python会改变前面有0的整数的值?

    我实现了一个将整数转换为字符串表示形式的函数intToStr 代码如下 为了进行测试 我传递了一些值并观察到意外的输出 print intToStr 1223 prints 1223 as expected print intToStr 0
  • 将事件处理程序绑定到由 jQuery .html() 函数插入的元素上

    我渲染一些新内容 html ajax 调用我的网站后 getJSON scriptURL domainForm serialize function data checkedDomain html data html 现在 如何将事件处理程
  • 参数包是否有设定限制?

    元素的最大数量是否有上限参数包就像最大模板递归深度一样 我认为没有必要单独进行限制 元素的数量由实例化站点以及可以传递给模板的模板参数数量决定 有一个限制函数调用的参数数量 建议最小值 256 有一个限制模板参数的数量在模板声明中 建议最小
  • 在 PrimeFaces 菜单组件中混合静态和动态菜单条目

    我想在标记中保持菜单的一部分静态 并在 Java 中动态生成另一部分
  • SPARQL 参数化查询

    再会 我将 rdflib 用于 python 我有个问题 如何将变量放入 SPARQL 的查询中 当然不是 OSPF OSPF qres g query SELECT x z y WHERE course OSPF course termN
  • 有没有办法在 SCCM 2012 中重新安装应用程序?

    在 SCCM 2007 中 有几个 右键单击工具 在它们的帮助下可以 重新安装 软件包 在SCCM 2012中我仍然找不到方法 如何重新安装应用程序 让我解释 我从软件创建了一个安装包 然后将其作为 应用程序 分发 安装成功完成 一周后 一
  • 通过 Whatsapp 或 Facebook 分享图像和文本

    我的应用程序中有一个共享按钮 我想同时共享图像和文本 在 GMail 中 它工作正常 但在 WhatsApp 中 仅发送图像 而在 Facebook 中 应用程序崩溃 我用来分享的代码是这样的 Intent shareIntent new
  • 如何在后台运行Python脚本?

    我有一个脚本每 5 分钟检查我的 PC 上的某些内容 但我不希望 Python 显示在我的任务托盘上 我使用 Windows 作为我的操作系统 有没有办法让Python在后台运行并强制它不显示在我的任务托盘中 如果您使用运行控制台脚本pyt
  • xjc:覆盖 xs:simpleType 定义

    我正在使用以下方法将一组 XSD 编译为 Java 类xjc 我希望能够覆盖给定简单类型的数据类型定义 XSD 片段是
  • Android:在 fling 和 onclick 上同步图像也可以显示上一个和下一个视图相同的图像

    我正在使用视图翻转器来翻转大约 20 个图像 并在滑动时翻转 在我的活动底部 我有两个按钮用于手动向左或向右切换图像 这两个按钮正在工作 但我无法显示相同的图像 例如 如果我从图像2滑动到图像3 然后单击 显示下一个 按钮 然后它切换到数组
  • 按组在data.table中创建新列

    我没有使用 data table 的经验 所以我不知道我的问题是否有解决方案 谷歌上的 30 分钟至少没有给出答案 但就这样了 对于 data frame 我经常使用以下命令来检查唯一值的观察数量 df Obs with df ave v1
  • 将样式文本写入 .docx 文件

    我正在尝试编写一个将文本写入 docx 文件的应用程序 我的应用程序使用 JTextPane 因此用户可以编写他 她想要的任何内容 并且它还提供了许多按钮 例如粗体 字体颜色 字体大小 等 我遇到的问题是在写入 docx 文件时保持 JTe