天道酬勤,学无止境

替换 Word 2003 文档中的 MergeFields 并保持样式(Replace MergeFields in a Word 2003 document and keep style)

问题

我一直在尝试创建一个库来替换 Word 2003 文档上的 MergeFields,一切正常,只是我在替换它时丢失了应用于该字段的样式,有没有办法保留它?

这是我用来替换字段的代码:

private void FillFields2003(string template, Dictionary<string, string> values)
{
    object missing = Missing.Value;
    var application = new ApplicationClass();
    var document = new Microsoft.Office.Interop.Word.Document();

    try
    {
        // Open the file

        foreach (Field mergeField in document.Fields)
        {
            if (mergeField.Type == WdFieldType.wdFieldMergeField)
            {
                string fieldText = mergeField.Code.Text;
                string fieldName = Extensions.GetFieldName(fieldText);

                if (values.ContainsKey(fieldName))
                {
                    mergeField.Select();
                    application.Selection.TypeText(values[fieldName]);
                }
            }
        }
        document.Save();
    }
    finally
    {
        // Release resources
    }
}

我尝试在选择中使用 CopyFormat 和 PasteFormat 方法,也使用 get_style 和 set_style 但没有使用。

回答1

不要在选择的顶部使用 TypeText,而是使用 Field 的 Result 属性:

          if (values.ContainsKey(fieldName))
          {
             mergeField.Result = (values[fieldName]);
          }

这将确保保留字段中的任何格式。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Replace MergeFields in a Word 2003 document and keep style
    I've been trying to create a library to replace the MergeFields on a Word 2003 document, everything works fine, except that I lose the style applied to the field when I replace it, is there a way to keep it? This is the code I'm using to replace the fields: private void FillFields2003(string template, Dictionary<string, string> values) { object missing = Missing.Value; var application = new ApplicationClass(); var document = new Microsoft.Office.Interop.Word.Document(); try { // Open the file foreach (Field mergeField in document.Fields) { if (mergeField.Type == WdFieldType.wdFieldMergeField)
  • 如何在C#中创建Word文档? [关闭](How can a Word document be created in C#? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 7年前关闭。 改善这个问题 我有一个项目,我想以MS Word格式生成报告导出。 该报告将包括图像/图形,表格和文本。 做这个的最好方式是什么? 第三方工具? 你有什么经验? 回答1 答案将在一定程度上取决于应用程序是在服务器上运行还是在客户端计算机上运行。 如果您在服务器上运行,则将要使用一种基于XML的Office生成格式,因为在服务器上使用Office Automation时会出现一些已知问题。 但是,如果您在客户端计算机上工作,则可以选择使用Office Automation还是使用Office Open XML格式(请参阅下面的链接),Microsoft Office 2000以及其本身或通过Service Pack支持该格式。 不过,这样做的一个缺点是您可能无法嵌入想要显示的某些图形或图像。 处理事情的最佳方法全都取决于您必须花多少时间在开发上。 如果您走Office Automation的路线,那么有很多不错的教程可以通过Google找到,并且非常简单易学。 但是,Open Office XML格式是相当新的,因此您可能会发现学习曲线要​​高一些。 Office Open XML信息 Office Open XML-http:/
  • MS Office PIAs “backward compatibility”
    I've successfully completed a Windows Forms application with MS Word integration - the application writes to mergefields in a Word Template. I did the template using MS Word 2007, but saved it in compatible mode as a 97-2003 '.dot' file. Due to the fact that I have Office 2007 installed, I'm using version 12.0 of the MS Word Object Library PIA. If I were to deploy this application, would another person using Office XP or 2003 be able to use it, hence my asking about compatibility? I have copied the PIA DLLs to the output directory of the application.
  • System.Runtime.InteropServices.COMException (0x80080005): 使用 CLSID 检索组件的 COM 类工厂(System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID)
    问题 我正在一个简单的 asp.net c# 应用程序中用来自 SQL Server 的数据替换 MS Word MergeFields,它在本地运行良好,但是当我经常发布它时,我得到以下信息: System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {00020906-0000-0000-C000-000000000046} failed due to the following error: 80080005. 我尝试授予IIS_IUSRS和NETWORK SERVICE完全访问权限,并将身份设置为 DCOM 配置中的交互,但它没有解决任何问题。 回答1 对于讨厌的权限,阻止你做你期望的事情,(我过去也遇到过)。 有时我也不得不将我的 DCOM/COM+ 权限更改为一个对象。 在项目的 DCOM 配置选项卡屏幕上,在安全性下,确保“启动和激活”和“访问”都已自定义为明确包含您打算允许的用户帐户。 现在,还有一件事——只是为了排除所有其他人。 我什至(仅用于测试/确认)是在“身份”选项卡上,您可以选择“交互式用户”、“启动用户”或“此用户”。 我会输入您知道拥有权限的实际帐户(确保您的帐户也在启动和激活中
  • 如何使用python-docx替换Word文档中的文本并保存(How to use python-docx to replace text in a Word document and save)
    问题 在同一页面中提到的oodocx模块会将用户引向一个似乎不存在的/ examples文件夹。 我已经阅读了python-docx 0.7.2的文档,以及在Stackoverflow上可以找到的有关该主题的所有内容,因此请相信我已经完成了“作业”。 Python是我所知道的唯一语言(初学者+,也许是中级),所以请不要假定对C,Unix,xml等有任何了解。 任务:打开其中包含一行文本的ms-word 2007+文档(为简单起见),然后用其字典值替换该行文本中出现的“字典”中的所有“关键”词。 然后关闭文档,使其他所有内容保持不变。 文字行(例如)“我们将在海浪中徘徊。” from docx import Document document = Document('/Users/umityalcin/Desktop/Test.docx') Dictionary = {‘sea’: “ocean”} sections = document.sections for section in sections: print(section.start_type) #Now, I would like to navigate, focus on, get to, whatever to the section that has my #single line of text and
  • 将文本发送到Microsoft Word 2010中的邮件合并字段(Sending text to Mail-Merge Fields in Microsoft Word 2010)
    问题 我正在使用以下代码将文本发送到我仅用一个MergeField设置的简单单词模板,以测试我是否可以正常工作。 我使用的代码如下: public static void ReplaceMailMergeField(string pWordDoc, string pMergeField, string pValue) { object docName = pWordDoc; object missing = Missing.Value; Word.MailMerge mailMerge; Word._Document doc; Word.Application app = new Word.Application(); app.Visible = false; doc = app.Documents.Open(ref docName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); mailMerge = doc.MailMerge
  • How can I serialize a queryset from an unrelated model as a nested serializer?
    I'm trying to add a nested serializer to an existing serializer based on some criteria of the parent model, not a foreign key. The use case is to return a 'Research' object with an array of 'ResearchTemplate' objects that are identified by filtering on a Postgres ArrayField. Models class Research(TimeStampedModel): category = models.CharField(max_length=100, choices=RESEARCH_TEMPLATE_CATEGORIES, default='quote') body = models.CharField(max_length=1000, blank=True, default='') #The body of text comprising the nugget additionaldata = JSONField(null=True) # all the varying values to be merged
  • 如何替换 PowerPoint (.ppt) 文档中的文本?(How to replace text in a PowerPoint (.ppt) document?)
    问题 有哪些解决方案? 我只知道用 Apache POI 替换 Word (.doc) 文件中的书签的解决方案? 是否也可以更改 .doc 和 .ppt 文档中的图像、布局、文本样式? 我考虑替换 Word 和 PowerPoint 文档中的区域以进​​行批量处理。 平台:MS-Office 2003 回答1 您的平台限制是什么? 显然,Apache POI 至少可以让您完成一部分任务。 Microsoft 自己的 COM API 非常强大,并在此处进行了记录。 如果 a) 您不在服务器(许多用户,多线程)环境中运行,我会建议使用它们; b) 您可以在生产机器上安装正确版本的 powerpoint; c) 您可以针对 COM 对象模型进行编码。 回答2 它有点贵,但是 Aspose.Slides 是一个非常强大的用于处理 PowerPoint 文件的库 回答3 如果您包括使用其他 Office 套装作为选项,以下是可能的解决方案列表: Apache POI-HSLF PowerPoint 2007 API OpenOffice.org 一 使用 POI 您不能编辑 .pptx 文件格式,但您不依赖于系统上安装的应用程序。 相反,其他两个选项使用其他应用程序,但它们绝对更适合处理演示文稿。 顺便说一下,OpenOffice 与旧格式的兼容性更好。 此外,如果您使用 UNO
  • 正则表达式:在字符串中的两个标签之间提取子字符串(Regex: To pull out a sub-string between two tags in a string)
    问题 我有以下格式的文件: Data Data Data [Start] Data I want [End] Data 我想使用Regex从[Start]和[End]标记之间获取所需的Data I want 。 谁能告诉我该怎么做? 回答1 \[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\] 希望这也应该删除[start]和[end]标记。 回答2 \[start\](.*?)\[end\] Zhich'll将文本放在捕获的中间。 回答3 $text ="Data Data Data start Data i want end Data"; ($content) = $text =~ m/ start (.*) end /; print $content; 我有一段时间有类似的问题&我可以告诉你这种方法有效... 回答4 有关使用正则表达式查找匹配标签的陷阱的更完整讨论,请参见:http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi。 特别要注意的是,嵌套标签确实需要完整的解析器才能正确解释。 请注意,为了回答上述问题,必须关闭区分大小写的功能。 在perl中,这是i修饰符: $ echo "Data Data Data [Start] Data i want [End] Data
  • Python 第三方库之 docxtpl (处理word文档)
    项目官方文档 项目官方git docxtpl 软件包使用两个主要软件包: python docx,用于读取、写入和创建子文档jinja2用于管理插入到模板docx中的标记。jinja官网, jinja中文网站 简单示例 from docxtpl import DocxTemplate tpl = DocxTemplate('test.docx') context = { 'template': '123' } tpl.render(context) tpl.save('test1.docx') 安装 pip install docxtpl 导言 python-docx-template被开发出来,是因为python-docx的强大在于创建文档,而不是修改它们。 这个想法是开始于创建一个需要用MicrosoftWord生成的文档的示例,它可以像我们想要的那样复杂:如图片、索引表、页脚、页眉、变量,以及我们可以用Word做的任何事情。然后,当我们使用MicrosoftWord编辑文档时,直接在文档中插入类似于Jinja 2的标记。将文档保存为.docx文件(XML格式):它将是.docx模板文件。 现在,我们可以使用python-docx-template从这个.docx模板和将关联的上下文变量生成您想要的多个Word文档。 注意:python-docx-template是测试的是MS
  • Unable To Connect Laravel to MailChimp (laravel 5.4)
    I have to define List ID and MailChimp API Key in my .env file. I'm sure both are fine even I am not getting any error but email in not inserting in my List I installed https://github.com/spatie/laravel-newsletter (spatie/laravel-newsletter) Package. Here is my method public function subscribe(Request $request) { $email = request('email'); Newsletter::subscribe($email); Session::flash('subscribed', 'Successfully subscribed.'); return redirect()->back(); } Then I check subscribe Method in Newsletter.php it is as public function subscribe($email, $mergeFields = [], $listName = '', $options = [])
  • 在Microsoft Word 2013中查找并替换为正则表达式(Find and Replace with Regex in Microsoft Word 2013)
    问题 我正在编辑带有很多不必要标记的电子书文档。 我在文本中有很多部分,其代码类似于以下内容: <i>Some text here</i> 我正在尝试运行正则表达式查找和替换,以找到两个i-tag之间的任何短语,删除i-tag,并对文本应用样式。 这是我用来搜索的内容: Find: (<i>)(*)(</i>) Replace: \2 我还要选择“样式”>“ i”(斜体字)。 这告诉我们的转换软件对文本应用斜体。 如果我离开i-tag,最终会发生的是ScribeNet的转换过程将它们转换为十六进制值,以便它们在电子书中显示为原义文本。 乱。 当我运行此搜索时,没有任何结果。 我已选中“使用通配符”。 我想念什么? 根据Microsoft的帮助网站,*用于表示任意数量或类型的字符,并且各个字符串都应放在括号中。 回答1 要搜索定义为通配符的字符,请在该字符前放置一个反斜杠( \ )。 *本身可以匹配任何字符串,因此请使用范围限定符进行匹配( 1次或多次) Find: \<i\>(*{1,})\</i\> Replace: \1 回答2 搜索\<i\>(*{1,})\</i\>并替换为\1 。 别忘了选中“ Use wildcard 。 这里有Word“正则表达式”的参考表:http://office.microsoft.com/zh-cn/word-help/find-and
  • 如何在打开的xml文档上保持样式(How to keep style on open xml documents)
    问题 我正在使用开放XML(Microsoft Word-.docx)作为文件模板来自动生成其他文档。 在模板文档中,我定义了内容控件,并且编写了代码来替换这些内容控件中的内容。 内容已替换并生成了文档,但是我在保持样式方面很挣扎。 在Word中,当检查内容控件的属性时,我已经选中了复选框“使用样式将文本格式设置为空控件:样式”,还选中了“在编辑内容时删除内容控件”。 用代码生成文档时,这似乎没有任何影响。 这是我的代码(这里的社区成员很乐意为您提供帮助),用于替换内容控件中的数据。 有什么想法可以保持格式吗? 格式是简单的文本格式,例如大小和字体。 请指教: private static void ReplaceTags(MainDocumentPart mainPart, string tagName, string tagValue) { //grab all the tag fields var tagFields = mainPart.Document.Body.Descendants<SdtBlock>().Where (r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName); foreach (var field in tagFields) { //remove all paragraphs from the
  • Python docx在保留样式的同时替换段落中的字符串(Python docx Replace string in paragraph while keeping style)
    问题 在保留整个文档的格式的同时,我需要在替换Word文档中的字符串时需要帮助。 我使用的是python-docx,在阅读了文档后,它可用于整个段落,因此我松散了诸如粗体或斜体字之类的格式。 包括要替换的文本以粗体显示,我希望保持这种状态。 我正在使用此代码: from docx import Document def replace_string2(filename): doc = Document(filename) for p in doc.paragraphs: if 'Text to find and replace' in p.text: print 'SEARCH FOUND!!' text = p.text.replace('Text to find and replace', 'new text') style = p.style p.text = text p.style = style # doc.save(filename) doc.save('test.docx') return 1 因此,如果我实现它并希望得到类似的信息(包含要替换的字符串的段落将失去其格式): 这是第1款,这是粗体字。 这是第2段,我将替换旧文本 当前结果是: 这是第1款,这是粗体字。 这是第2段,我将替换新文本 回答1 我发布了这个问题(即使我在这里看到了几个相同的问题),因为
  • 如何以MS Word保留格式和语法高亮显示代码段?(How do you display code snippets in MS Word preserving format and syntax highlighting?)
    问题 有谁知道一种在Microsoft Word文档中显示可保留颜色和格式的代码的方法? 优选地,该方法也将是不引人注目的并且易于更新。 我试图将代码作为常规文本包含在内,这看起来很糟糕,并且在编辑常规文本时会遇到麻烦。 我还尝试将对象(写字板文档和文本框)插入文档,然后将代码放入这些对象中。 该代码看起来更好,并且在编辑其余文本时更容易避免。 但是,这些对象只能跨越一页,这在需要添加几页代码时使编辑成为一场噩梦。 最后,我知道有更好的编辑器/格式可以解决此问题,但是我仍然坚持使用MS word。 回答1 对我来说,这是在word中添加代码的最佳方法: 转到“ Insert选项卡的“ Text部分,单击“ object按钮(在右侧) 选择“ OpenDocument Text ,这将打开一个新的嵌入式Word文档从Visual Studio / Eclipse复制并粘贴您的代码到此嵌入式word页面中保存并关闭 结果看起来非常不错。 这是此方法的优点: 代码保持其原始布局和颜色代码与文档的其余部分分开,好像是图片还是图表拼写错误不会在代码中突出显示(这很酷!) 而且只需要几秒钟。 回答2 下载并安装Notepad ++并执行以下操作: 将您的代码粘贴到窗口中; 从语言菜单中选择编程语言; 选择要复制的文本; 右键单击并选择“插件命令” ->“复制带有语法突出显示的文本” ;
  • FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】
    版权声明:本文为HaiyuKing原创文章,转载请注明出处!前言这个方案只能在java中运行,无法在Android项目中运行。所以此方案是:APP将表单数据发送给后台,后台通过freemarker将表单数据根据模板ftl文件生成Word文件,然后返回给APP,由APP进行展现。前期准备1、下载freemarker.jar文件官网下载地址:https://freemarker.apache.org/freemarkerdownload.html 后续将freemarker.jar文件添加到项目中。2、制作模板ftl文件(1)先用office2003或更高版本word软件编辑好word模版文件【版本要2003以上,2003以下的不支持另存为xml格式功能】注意:在word模板中写入相对真实的数据【注意,不要使用英文,尽量使用中文、数字,见附录1】;对于对勾样式的数据,在word模板文件中统一用安卓代替(后续需要通过java代码传入带有对勾样式的数据);需要设置图片的话,需要在word模板文件中放入真实的图片占位;请尽量选择小于50K的图片,并且把图片的大小和位置调整好。选择小图片的原因是避免xml文件过大导致打开时缓慢甚至卡死。例子: (2)另存为Word 2003 XML文档对于Word2016,另存为后会自动打开xml文件,所以需要先关闭xml文件,然后再使用FirstObject
  • Word2003中10个让你提升工作效率的技巧
    虽说Word2010的出现增添了许多新功能,新用法,但是Word2003依旧不过时。相信大多数资深的办公族们目前电脑上装的依然是Word2003版本,毕竟这么多年了,用着也顺手。为方便大家使用时更顺手,下面学习啦为大家推荐10个快速输入技巧,可以帮助大家在工作中提高工作效率!  1、快速输入数字中的小数点  审计人员在结束现场审计工作,编制审计报告时,需要输入大量的审计数据,你如果是用安装Office时携带的五笔字型或拼音输入法,会为输入数字中的小数点而在中文与英文输入法间不断调整而烦恼(使用陈桥五笔不会出现这些问题,它会输入数据后接着数据时自动将数据间的句号修改为小数点)。不过利用Word工具中的"自动更正"可解决此问题,让你一劳永逸。方法:打开"工具"--"自动更正"--"自动更正",在"替换""替换为"中分别填上"。。"、"."(小数点),点击"确定",回到Word输入界面,在输入数据后输入两个"。",再输入数据,看看"."是不是变成了小数点"."。这一方法会让你在输入小数点是多输入一个"。",不过比每次输入数据中需输入小数点时需要在输入方法间调整要方便多了。按此办法进行后,你在Excel中用同样的输入方法,就可以快速输入数字中的小数点。此法可用于文字材料中的序号更正、如将"1、"改"⒈",年份中"零"的更正、如将"二00"改为"二○○";公文年份中"括号"的更正、如将"("
  • System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID
    I am replacing MS Word MergeFields with data from SQL Server in a simple asp.net c# application and it works fine locally but when i publish it often i get the following: System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {00020906-0000-0000-C000-000000000046} failed due to the following error: 80080005. I tried giving both IIS_IUSRS and NETWORK SERVICE full access, and also set the identity to interactive in the DCOM config but it didn't fix anything.
  • 如何在RStudio和Markdown生成的Word文档中添加分页符(How to add a page break in word document generated by RStudio & markdown)
    问题 我在R Studio中用R降价编写了一个Word文档。 我可以得到很多东西,但是目前我还没有弄清楚如何获得分页符。 我找到了解决方案,但仅针对渲染的乳胶/ pdf文档,这不是我的情况。 回答1 补充:要插入分页\newpage ,请使用\newpage格式,包括LaTeX,HTML,Word和ODT。 https://bookdown.org/yihui/rmarkdown-cookbook/pagebreaks.html Paragraph before page break. \newpage First paragraph on a new page. 以前:有一种方法可以使用YAML中定义的第五级标头块( ##### )和docx模板。 在Microsoft Word中创建headingfive.docx之后,选择“ Heading 5 Modify Style ”,然后在“ headingfive.docx Line and Page Breaks选项卡中选择Line and Page Breaks分页Line and Page Breaks Page break before ,然后保存headingfive.docx文件。 --- title: 'Making page break using fifth-level header block' output
  • 抑制列并删除Crystal报表中的空白(suppress column and remove blank space in crystal report)
    问题 我正在使用Microsoft Visual Studio 2003。 我正在寻找一种抑制空列的方法,并替换其他列留下的空白。 我到处搜索,但是找不到与2003版兼容的方式。 是否存在简单的方法? 感谢您的帮助。 回答1 Crystal Reports没有自动(或简单)的方式来动态移动列。 您可能会考虑多个可能与此近似的标题和详细信息部分-只需删除包含具有NULL值的字段的部分。 回答2 右键单击报表对象,然后选择“格式字段”。 在格式屏幕->数字选项卡上,单击自定义按钮。 在“自定义样式”屏幕->“数字”选项卡上,选中“如果为零则抑制”框。 但是我不认为它可以存在于2003版中 回答3 右键单击该字段,然后单击“格式对象”,然后转到“通用”选项卡->,您将看到“抑制复选框”(选中该复选框),旁边是“公式编辑器”图标,然后单击该下一个编写公式 if isnull({FieldName} ) then true else false 回答4 出于价值考虑,我遇到这个问题的原因完全不同。 我在报告中有多个组,其中一个是“文档日期”。 右键单击组,然后转到“组选项”,选中了“将组保持在一起”选项。 这意味着当有多个日期时,它们将被移至第二页,并在第1页上留出较大的空白。 空白取决于查询返回的结果集。 有时会出现,有时却不会出现,具体取决于同一日期有多少条记录。