将 HTML 字符串添加到 OpenXML (*.docx) 文档

2024-02-08

我正在尝试使用 Microsoft 的 OpenXML 2.5 库来创建 OpenXML 文档。一切都运行良好,直到我尝试将 HTML 字符串插入到我的文档中。我已经在网上搜索过,这是我到目前为止所想到的(只截取我遇到问题的部分):

Paragraph paragraph = new Paragraph();
Run run = new Run();

string altChunkId = "id1";
AlternativeFormatImportPart chunk =
       document.MainDocumentPart.AddAlternativeFormatImportPart(
           AlternativeFormatImportPartType.Html, altChunkId);
chunk.FeedData(new MemoryStream(Encoding.UTF8.GetBytes(ioi.Text)));
AltChunk altChunk = new AltChunk { Id = altChunkId };

run.AppendChild(new Break());

paragraph.AppendChild(run);
body.AppendChild(paragraph);

显然,我实际上并没有在此示例中添加 altChunk,但我尝试将其附加到任何地方 - 运行、段落、正文等。在任何情况下,我都无法在 Word 2010 中打开 docx 文件。

这让我有点疯狂,因为它看起来应该很简单(我承认我没有完全理解 AltChunk “东西”)。将不胜感激任何帮助。

旁注:我确实发现一件有趣的事情,但我不知道这是否真的是一个问题,那就是这个回应 https://stackoverflow.com/a/12295441/132528其中表示 AltChunk 在使用 MemoryStream 时会损坏文件。有人能证实这是/不是真的吗?


我可以重现该错误“……内容有问题”通过使用 不完整的 HTML 文档作为替代格式导入部分的内容。 例如,如果您使用以下 HTML 片段<h1>HELLO</h1>MS Word 无法打开该文档。

下面的代码展示了如何添加AlternativeFormatImportPart到一个word文档。 (我已经使用 MS Word 2013 测试了代码)。

using (WordprocessingDocument doc = WordprocessingDocument.Open(@"test.docx", true))
{
  string altChunkId = "myId";
  MainDocumentPart mainDocPart = doc.MainDocumentPart;

  var run = new Run(new Text("test"));
  var p = new Paragraph(new ParagraphProperties(
       new Justification() { Val = JustificationValues.Center }),
                     run);

  var body = mainDocPart.Document.Body;
  body.Append(p);        

  MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("<html><head></head><body><h1>HELLO</h1></body></html>"));

  // Uncomment the following line to create an invalid word document.
  // MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes("<h1>HELLO</h1>"));

  // Create alternative format import part.
  AlternativeFormatImportPart formatImportPart =
     mainDocPart.AddAlternativeFormatImportPart(
        AlternativeFormatImportPartType.Html, altChunkId);
  //ms.Seek(0, SeekOrigin.Begin);

  // Feed HTML data into format import part (chunk).
  formatImportPart.FeedData(ms);
  AltChunk altChunk = new AltChunk();
  altChunk.Id = altChunkId;

  mainDocPart.Document.Body.Append(altChunk);
}

根据 Office OpenXML 规范,有效的父元素为w:altChunk元素是body, comment, docPartBody, endnote, footnote, ftr, hdr and tc。 所以,我添加了w:altChunk到身体元素。

欲了解更多信息w:altChunk元素看这个MSDN http://msdn.microsoft.com/en-us/library/documentformat.openxml.wordprocessing.altchunk.aspx link.

EDIT

正如 @user2945722 所指出的,为了确保 OpenXml 库正确地将字节数组解释为 UTF-8,您应该添加 UTF-8 前导码。这可以通过以下方式完成:

MemoryStream ms = new MemoryStream(new UTF8Encoding(true).GetPreamble().Concat(Encoding.UTF8.GetBytes(htmlEncodedString)).ToArray()

这将防止您的 é 被渲染为 é、您的 ä 被渲染为 ¤ 等。

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

将 HTML 字符串添加到 OpenXML (*.docx) 文档 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 未找到 Boost 库,但编译正常

    我正在尝试在 C 中使用 boost 的文件系统 使用时看起来编译没问题 c c Analyse c o Analyse o g W Wall L usr local lib lboost filesystem lboost system
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • VB6 和 VB7 的 Longptr 数据类型

    我面临的问题是 我想分发我的 Excel VBA 模板之一 几乎在所有过程中 我都指定了 LONG 数据类型 但是 我发现对于VBA7或2010及更高版本 我们可以使用LongPtr数据类型进行分配 这将绕过版本控制问题 无论是 64 位还
  • iOS Safari 中的点击会触发点击位置下方元素的“悬停状态”

    在 iOS Safari 11 上 如果我有 div 定位在具有 hover效果 以及 div 有一个事件使其在单击时消失 然后我的链接 下方 在元素从 DOM 中删除后应用悬停效果 请参阅下面的动画 GIF 了解我正在谈论的内容 我为按钮
  • 删除移动视图上的 HTML 元素?

    我没有使用jquery mobile 我在 WordPress 中构建了一个模板 并具有全宽背景 可以为每个页面设置不同的背景 Background 1 jpg Home Background 1 jpg About ens 这是前端加载的
  • 数字输入的测试用例

    处理数字输入时有哪些常见 或有价值 的测试 测试问题 弱点或误解 这是一个社区维基 请添加 例如 以下是一些示例想法 我经常看到用户在数字字段中输入文本 例如 gt 4 或 4 天 等 字段留空 空 很长的数字字符串 多个小数点和逗号 例如
  • 忽略 eslint 错误:“导入”和“导出”可能只出现在顶层

    是否可以在 eslint 中停用此错误 Parsing error import and export may only appear at the top level ESLint 本身不支持这一点 因为这违反了规范 但如果你使用babe
  • “允许推送通知”对话框被关闭一次后如何返回?

    我正在构建一个严重依赖 APN 的应用程序 第一次启动我的应用程序时 iOS 会询问是否允许该应用程序使用 APN 由于registerForRemoteNotificationTypes 称呼 然而 一旦关闭 该对话框就永远不会弹出 我必
  • JFrame 着色应该像这张图片

    我的问题有点奇怪 我希望我创建的表单 使用 JFrame 颜色应该类似于这张图片 我应该使用特殊的外观和感觉吗 我应该使用特殊的外观和感觉吗 据我所知 没有这样的内置外观和感觉可用 然而对于 外观和感觉 来说 Look 指 GUI 小部件
  • 用距离随机整数填充数组

    我需要一个数组来填充随机整数 这些整数应该彼此非常不同 即每个项目之间必须至少有 20 个单位的间隔 这是我到目前为止所尝试过的 var all var i 0 randomDiff function randomDiff var num1
  • 如何向 ode45 传递一个带有两个参数的 odefun ?

    我有一个用例如下 Inside F m我有一个函数F以 a 作为其参数2 x 1 matrix x F需要对矩阵进行矩阵乘法kmat by x kmat是由脚本生成的变量 所以 我所做的事情已经确定kmat在脚本中成为全局 global k
  • 如何在 C++ 中打印方法指针的地址?

    例如 struct A void m void stream print void A p void A m std cerr lt lt p lt lt std endl void printf print void A p void A
  • 在 Bash 脚本中指定 sftp 的密码 [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个脚本来通过 SFTP 备份文件 问题是 它需要密码 而且我认为没有办法手动指定 SFTP 的密码 我听说过使用公钥不需要密码 但这需要能够 ssh 进入远程服务器并修改一些配置文件 而我无法做到
  • Servlet 到 jsp 通信最佳实践

    我正在学习如何在谷歌应用程序引擎上编写java servlet 和jsp 页面 我正在尝试使用 MVC 模型 但我不确定我做得是否正确 目前 我有一个在访问页面时调用的 servlet servlet 完成所有处理并创建一个 HomePag
  • 检查 Swift 中的网络状态,找不到接受提供的参数的“~=”重载

    我在用着可达性 h库来检查我的 swift 应用程序中的网络状态 我在 案例 行中遇到了这个问题 找不到接受提供的 重载 论点 我该如何解决它 func checkNetworkStatus var reachability Reachab
  • 为什么这个查询不返回 10 行?

    我在一个唯一的列上连接两个表 这两个表都包含 10 行 我知道桌子cte可以有重复项 但仍然应该有10结果中的记录 请参阅DBFIDLE1 https dbfiddle uk C3fkuh3s with ints as select 1 a
  • 在 Visual Studio for Mac 17.5 预览版中找不到 SDK Microsoft.NET.Sdk

    当我想从 VS 2022 for Mac 17 5 预览版中的模板创建新的 MonoGame iOS 项目时 收到此错误消息 What is missing in Preferences What should I install None
  • ASP.NET 预编译期间出现类型解析错误

    在 NET 3 5 Web 应用程序的 ASP NET 预编译过程中 各种初始化在类型初始值设定项中执行 当环境配置不正确时 类型初始值设定项之一会引发自定义异常 但是 当抛出我们的自定义异常时 aspnet compiler exe 会告
  • 自动调用 Silverlight 行为的 OnDetaching()

    我在 silverlight 控件上使用了多种混合行为和触发器 我想知道是否有任何机制可以自动分离或确保当不再使用控件 即从可视化树中删除 时为行为或触发器调用 OnDetaching 我的问题是 由于其中一种行为 控件存在托管内存泄漏 该
  • 如何设置 ArrayList 中对象的变量值

    我正在执行一项任务 我必须 创建一个具有以下属性 变量的 Employee 类 姓名 年龄 部门 创建一个名为 Department 的类 其中将包含员工列表 A Department 类将有一个方法返回按年龄排序的员工 b 部门的值只能是
  • 如何在Python中给定时间后结束程序运行

    我希望我的 Python 程序运行一个算法给定的秒数 然后打印迄今为止最好的结果并结束 最好的方法是什么 我尝试了以下方法 但没有成功 程序在打印后继续运行 def printBestResult self print self bestR
  • 将 HTML 字符串添加到 OpenXML (*.docx) 文档

    我正在尝试使用 Microsoft 的 OpenXML 2 5 库来创建 OpenXML 文档 一切都运行良好 直到我尝试将 HTML 字符串插入到我的文档中 我已经在网上搜索过 这是我到目前为止所想到的 只截取我遇到问题的部分 Parag