如何使用 Open XML SDK 将文本插入内容控件

2024-04-12

我正在尝试开发一种解决方案,该解决方案从 ASP.Net 网页获取输入并将输入值嵌入到 MS Word 文档中的相应内容控件中。 MS Word 文档还具有静态数据,以及一些要嵌入到页眉和页脚字段中的动态数据。

这里的想法是解决方案应该基于 Web。我可以使用 OpenXML 来实现此目的吗?或者您可以建议的任何其他方法吗?

预先非常感谢您提供的所有宝贵意见。我真的很感激他们。


我的项目中有一些代码示例,用于在您在 Word 文档中创建的内容控件中插入一些单词:

public static WordprocessingDocument InsertText(this WordprocessingDocument doc, string contentControlTag, string text)
{
    SdtElement element = doc.MainDocumentPart.Document.Body.Descendants<SdtElement>()
      .FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>()?.Val == contentControlTag);

    if (element == null)
      throw new ArgumentException($"ContentControlTag \"{contentControlTag}\" doesn't exist.");

    element.Descendants<Text>().First().Text = text;
    element.Descendants<Text>().Skip(1).ToList().ForEach(t => t.Remove());

    return doc;
}

它只是查找文档中具有特定内容的第一个内容控件Tag(您可以通过在 Word 中启用设计器模式并右键单击内容控件来设置),并将当前文本替换为传递到方法中的文本。此后,文档仍将包含内容控件,当然这可能是不需要的。因此,当我编辑完文档后,我运行以下方法来删除内容控件:

internal static WordprocessingDocument RemoveSdtBlocks(this WordprocessingDocument doc, IEnumerable<string> contentBlocks)
{
    List<SdtElement> SdtBlocks = doc.MainDocumentPart.Document.Descendants<SdtElement>().ToList();

    if (contentBlocks == null)
        return doc;

    foreach(var s in contentBlocks)
    {
        SdtElement currentElement = SdtBlocks.FirstOrDefault(sdt => sdt.SdtProperties.GetFirstChild<Tag>()?.Val == s);
        if (currentElement == null)
            continue;
        IEnumerable<OpenXmlElement> elements = null;

        if (currentElement is SdtBlock)
            elements = (currentElement as SdtBlock).SdtContentBlock.Elements();
        else if (currentElement is SdtCell)
            elements = (currentElement as SdtCell).SdtContentCell.Elements();
        else if (currentElement is SdtRun)
            elements = (currentElement as SdtRun).SdtContentRun.Elements();

        foreach (var el in elements)
            currentElement.InsertBeforeSelf(el.CloneNode(true));
        currentElement.Remove();
    }
    return doc;
}

要打开WordProcessingDocument从模板中进行编辑,网上有大量信息。

Edit:

在内存流中使用文档时打开/保存文档的小示例代码,当然,您应该使用额外的存储库类来处理这个问题,该存储库类负责在实际代码中管理文档:

byte[] byteArray = File.ReadAllBytes(@"C:\...\Template.dotx");

using (var stream = new MemoryStream())
{
    stream.Write(byteArray, 0, byteArray.Length);

    using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
    {
       //Needed because I'm working with template dotx file, 
       //remove this if the template is a normal docx. 
        doc.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
        doc.InsertText("contentControlName","testtesttesttest");
    }
    using (FileStream fs = new FileStream(@"C:\...\newFile.docx", FileMode.Create))
    {
       stream.WriteTo(fs);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Open XML SDK 将文本插入内容控件 的相关文章

  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 将设置函数(setter)标记为 constexpr 的目的是什么? [复制]

    这个问题在这里已经有答案了 我无法理解将 setter 函数标记为的目的constexpr 自 C 14 起这是允许的 我的误解来自以下情况 我使用 constexpr c tor 声明一个类 并且我将通过创建该类的 constexpr 实
  • C 中“complex”的默认类型

    根据我读过的文档 C99 和更高版本的支持float complex double complex and long double complex作为复杂类型 但是 此代码在使用时编译时不会发出警告gcc Wall Wextra inclu
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 如何使用 CSI.exe 脚本参数

    当你运行csi exe 安装了 Visual Studio 2015 update 2 您将得到以下语法 Microsoft R Visual C Interactive Compiler version 1 2 0 51106 Copyr
  • 如何在审计触发器中使用system_user但仍使用连接池?

    我想做以下两件事 在我的数据库表上使用审计触发器来识别哪个用户更新了什么 使用连接池来提高性能 对于 1 我在数据库触发器中使用 system user 来识别进行更改的用户 但这阻止我执行需要通用连接字符串的 2 有没有一种方法可以让我充
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • Xamarin.Forms UWP 项目中标题栏和选项卡之间令人恼火的空白

    我几乎是新手Xamarin Forms我正在开发一个相当简单的跨平台应用程序 该应用程序在 Android 中显示得足够好 但在 UWP 中却出现了一个愚蠢的空白 该项目由一个 TabbedPage 组成 其中包含 4 个 Navigati
  • FormsAuthentication:安全吗?

    Using 表单验证构建成asp net创建一个为经过身份验证的用户创建 cookie 的登录系统非常快速且简单 FormsAuthentication SetAuthCookie uniqueUsername false 与中的一些代码配
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section

随机推荐

  • JSON.parse 返回 [Object Object] 而不是值

    我的 API 返回 JSON 值 例如 UserName xxx Rolename yyy I need Username and RoleNamevalue seperatly 我尝试了 JSON parse 但它返回 Object Ob
  • 如何编辑表格数据 (ASP MVC)

    我需要能够在浏览器中编辑数据表 我在 MVCContrib 中看到有一个 HTML 帮助器来渲染表格 有用 但是如果我希望用户能够编辑该表怎么办 据我所知 这并没有帮助 解决这个问题的最佳方法是什么 传统的 FORM 里面有一个 TABLE
  • Azure IoT Hub设备消息结构和路由查询

    我使用了来自的 python 示例https learn microsoft com de de azure iot hub quickstart send telemetry python https learn microsoft co
  • 使用“VisualStudio.DTE.10.0”创建解决方案并添加项目

    我正在尝试创建 VS2010 解决方案并从独立应用程序 而不是加载项 添加项目 我可以创建 VS2010 的实例 但我无法确定如何正确创建项目 我只能找到如何使用 EnvDTE80 对象创建项目的示例 这稍后会导致异常 因为该项目文件的格式
  • Android Room 通用 DAO

    美好的一天 Stack 我正在开发一个使用 Android Room 1 0 0 Alpha 5 的 Android 项目 我面临的主要问题是每次我需要从 Room 调用其中一个 DAO 时 我都需要执行类似的操作这 活动 java App
  • 基本树概念:定义祖先

    祖先的定义是什么 更具体地说 E 会是 H 的祖先吗 或者更简单地说 F C A 是 H 的祖先 也许甚至是G 我只是想澄清这个简单的概念 E 不是 H 的祖先 它是uncle因为它是一个siblingF 的parent of H F C
  • R twitterR 包,尽管有限制但仍能获得关注者

    我一直在玩RtwitteR包 但还没有弄清楚如何实现一个系统来收集超过每小时最大数量的数据 Twitter 用户的关注者数量 我知道计划应该是收集最大数量 等待 X 时间 然后重复直到收集完所有内容 但是我该如何使用twitteR包裹 th
  • 使用 FFmpeg 在特定时间将一个视频叠加在另一个视频上

    我正在尝试将一个视频与另一个视频叠加 我按照OP发布的原始命令进行操作here https stackoverflow com questions 35269387 ffmpeg overlay one video onto another
  • MySQL 语法和“OR”性能

    这个 MySQL 查询工作得很好 SELECT o id FROM descriptions programs d titles programs t programs o WHERE d object id o id AND MATCH
  • 检测触摸屏(ipad、iphone 等)的最佳方法?

    如果在 ipad 或 iphone 等触摸屏设备上查看页面 我需要向页面加载一些额外的 CSS 最简单的方法是什么 谢谢 对于 iPad 您可以尝试 if window Touch alert touch my ipad iphone ip
  • 错误消息:JSFiddle 中不允许 document.write

    当我尝试在 JSFiddle 上运行我的 JavaScript 文件之一时 收到以下错误消息 document write 在 JSFiddle 环境中是不允许的 并且可能会破坏你的小提琴 我该如何解决这个问题 Note 当我使用外部资源时
  • 尝试部署到 Google Cloud Run 时出现权限错误

    我在尝试将映像部署到云运行时遇到权限错误 gcloud beta run deploy endpoints proxy image gcr io endpoints release endpoints runtime serverless
  • Google Drive HTTP 403“访问未配置”错误

    我正在尝试将 Salesforce 的 DrEdit 示例应用程序安装到 GAE 上 应用程序运行 但保存或打开文件会导致 HTTP 403 访问未配置错误 我还尝试将 API Access gt Client ID 的值用于 Web 应用
  • android 编辑文本背景

    我想设置为我的 EditText背景 http img9 imageshack us f backgroundtext png 嗯 我也不知道该怎么解释 当有大量文本时垂直滚动启用 当用户滚动文本时 我需要 滚动 背景 现在我知道 当用户滚
  • 如何从 Firebase 中的 Android 应用创建空表? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在 Android 平台上开发实时应用程序 我想在 Firebase 数据库中添加一个具有特定名称且没有信息的表 这可能吗 我该怎
  • 无法加载 ResolveComReference 任务

    Win7 VS2017 ASP Net core应用程序 目标框架是4 6 当我尝试使用 CLI 构建项目时 在调用 dotnet 命令之前需要它 会发生错误 C Microsoft Common CurrentVersion target
  • NanoScroller 不触发自身

    下面的代码应该能够触发pane and slider适当地displaycss 属性根据纳米滚动文档 http jamesflorentino github com nanoScrollerJS 但是 滚动条不显示slider直到我在浏览器
  • 连接两个php变量

    我从这样的表单中获取文本和颜色 代码在管理 php
  • Android Content Provider 的实例化顺序

    对于我的应用程序 我需要先启动一个内容提供程序 据我所知 该顺序与 AndroidManifest 中的顺序无关 并且不是按字母顺序排列的 如何控制 Android 调用 Content Provider 的 onCreate 方法的顺序
  • 如何使用 Open XML SDK 将文本插入内容控件

    我正在尝试开发一种解决方案 该解决方案从 ASP Net 网页获取输入并将输入值嵌入到 MS Word 文档中的相应内容控件中 MS Word 文档还具有静态数据 以及一些要嵌入到页眉和页脚字段中的动态数据 这里的想法是解决方案应该基于 W