天道酬勤,学无止境

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)
            {
                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
    }
}

I tried using the CopyFormat and PasteFormat methods in the selection, also using the get_style and set_style but to no exent.

评论

Instead of using TypeText over the top of your selection use the the Result property of the Field:

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

This will ensure any formatting in the field is retained.

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在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.
  • 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
  • Parsing a MS Word generated XML file in C#
    So I have a client (this could only come from the government) who has a bunch of MS Word docs they want entered into a database, and short of manual entry, I feel like converting them to XML and parsing them using a utility program would be the best course of action. I have a utility to do this using code found here on stackoverflow: Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application(); object oMissing = System.Reflection.Missing.Value; DirectoryInfo dirInfo = new DirectoryInfo(Server.MapPath("\\testfiles")); FileInfo[] wordFiles = dirInfo.GetFiles("
  • 如何使用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
  • Python docx Replace string in paragraph while keeping style
    I need help replacing a string in a word document while keeping the formatting of the entire document. I'm using python-docx, after reading the documentation, it works with entire paragraphs, so I loose formatting like words that are in bold or italics. Including the text to replace is in bold, and I would like to keep it that way. I'm using this code: 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
  • 将文本发送到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 to replace text in a PowerPoint (.ppt) document?
    What solutions are there? I know only solutions for replacing Bookmarks in Word (.doc) files with Apache POI? Are there also possibilities to change images, layouts, text-styles in .doc and .ppt documents? I think about replacement of areas in Word and PowerPoint documents for bulk processing. Platform: MS-Office 2003
  • 在PHP中读/写MS Word文件(Reading/Writing a MS Word file in PHP)
    问题 是否可以在不使用COM对象的情况下用PHP读写Word(2003和2007)文件? 我知道我可以: $file = fopen('c:\file.doc', 'w+'); fwrite($file, $text); fclose(); 但是Word会将其读取为HTML文件而不是本机.doc文件。 回答1 读取二进制Word文档将涉及根据DOC格式的已发布文件格式规范创建解析器。 我认为这不是真正可行的解决方案。 您可以使用Microsoft Office XML格式来读取和写入Word文件-这与Word的2003和2007版本兼容。 为了阅读,您必须确保Word文档以正确的格式保存(在Word 2007中称为Word 2003 XML文档)。 对于编写,您只需要遵循公开可用的XML模式即可。 我从未使用过这种格式来从PHP编写Office文档,而是将其用于读取Excel工作表(自然保存为XML-Spreadsheet 2003)并将其数据显示在网页上。 由于文件显然是XML数据,因此在其中导航并弄清楚如何提取所需的数据是没有问题的。 另一个选项-仅Word 2007选项(如果Word 2003中未安装OpenXML文件格式)-将重新排序为OpenXML。 正如databyss指出的那样,DOCX文件格式只是一个包含XML文件的ZIP存档。
  • How to keep style on open xml documents
    I am using open XML(Microsoft Word - .docx) as a file template to automatically generate other documents. In the template document I have defined content controls, and I have written code to replace content in these content controls. The content is replaced and the documents are generated, but I am struggling with keeping the style. In Word, when inspecting properties of the content control, I have checked the checbox for "Use a style to format text into the empty control: style", and also checked for "Remove content controls when content are edited". This doesn't seem to have any impact when
  • 如何在打开的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 我发布了这个问题(即使我在这里看到了几个相同的问题),因为
  • 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
  • 我可以用什么来替代 HTML?(What can I use to substitute    in HTML?)
    问题    丑,我觉得。 回答1 边距和/或填充。 (css 属性),像这样: <p style='padding-left : 10px'>Hello</p> (值得注意的是,放置这样的内联样式通常被认为是不好的做法;您通常在外部 css 文件中声明一个选择器并适当地设置类/任何内容。) 回答2 在 CSS 中尝试: white-space:nowrap; 回答3 在 CSS 中,添加 pre{ white-space: pre-wrap; white-space: -moz-pre-wrap !important; white-space: -pre-wrap; white-space: -o-pre-wrap; } <pre> is not ugly anymore </pre> 回答4 当我意识到我会有空标签时,我遇到了这个问题。 我不想设置固定高度,更改 html 为时已晚。 我想在css中添加一个空格,代替&nbsp ,所以我在元素之前添加了空格,使用:before (它需要通过unicode指定)。 p:before { content: "\00a0"; } 希望这个解决方案可以帮助某人。 带填充的解决方案对我的问题不起作用。 回答5   是另一种选择,但它也很丑 漂亮的解决方案在 css 中可用。 如果您需要在段落开头留出空间,您可以使用 p {text
  • Python win32com - Automating Word - How to replace text in a text box?
    I'm trying to automate word to replace text in a word document using Python. (I'm on word 2003 if that matters and Python 2.4) The first part of my replace method below works on everything except text in text boxes. The text just doesn't get selected. I notice when I go into Word manually and hit ctrl-A all of the text gets selected except for the text box. Here's my code so far: class Word: def __init__(self,visible=0,screenupdating=0): pythoncom.CoInitialize() self.app=gencache.EnsureDispatch(WORD) self.app.Visible = visible self.app.DisplayAlerts = 0 self.app.ScreenUpdating = screenupdating
  • 将链接插入Google Charts api数据?(Insert Links into Google Charts api data?)
    问题 我在这里的Google图表游玩中已经玩了很多Google图表: 关联 我一直在玩的代码是这样的: function drawVisualization() { // Create and populate the data table. var data = google.visualization.arrayToDataTable([ ['Year', 'Austria'], ['2003', 1336060], ['2004', 1538156], ['2005', 1576579], ['2006', 1600652], ['2007', 1968113], ['2008', 1901067] ]); // Create and draw the visualization. new google.visualization.BarChart(document.getElementById('visualization')). draw(data, {title:"Yearly Coffee Consumption by Country", width:600, height:400, vAxis: {title: "Year"}, hAxis: {title: "Cups"}} ); } 这给了我一个漂亮的图表,看起来像这样: 我正在尝试使此图表适合我的网站的需求
  • Java Apache POI 读取 Word (.doc) 文件并获取使用的命名样式(Java Apache POI read Word (.doc) file and get named styles used)
    问题 我正在尝试使用 poi-scratchpad-3.8 (HWPF) 读取 Microsoft Word 2003 文档 (.doc)。 我需要逐字或逐字读取文件。 无论哪种方式都可以满足我的需要。 一旦我阅读了一个字符或单词,我需要获取应用于该单词/字符的样式名称。 所以,问题是,如何在阅读 .doc 文件时获取用于单词或字符的样式名称? 编辑 我正在添加我用来尝试此操作的代码。 如果有人想尝试这个,祝你好运。 private void processDoc(String path) throws Exception { System.out.println(path); POIFSFileSystem fis = new POIFSFileSystem(new FileInputStream(path)); HWPFDocument wdDoc = new HWPFDocument(fis); // list all style names and indexes in stylesheet for (int j = 0; j < wdDoc.getStyleSheet().numStyles(); j++) { if (wdDoc.getStyleSheet().getStyleDescription(j) != null) { System.out.println(j
  • Office Interop的替代品,用于文档生成(Alternative to Office Interop for document generation)
    问题 目前,我们正在使用Office Interop从Office 2003中的模板(Word,Excel和Powerpoint)生成文档。 这似乎很让人讨厌(请参阅Office-interop-with-64bit-windows-in-asp-net),尽管它工作正常,但我会更支持受支持的解决方案。 有什么非骇客的方法可以做到这一点? 要求是 仅限于Office 2003。 (不允许使用Office xml / Office 2007兼容性包) 必须从ASP.NET运行服务器端必须能够从用户提供的.dot,.xlt和.pot模板创建Word,Excel和Powerpoint文档必须能够通过在某些点(例如姓名,地址等)替换某些文本来进一步自定义文档免费或成本很低。 我将无法提出采购订单来替换工作系统,原因是某个网站上的四个人认为这是肮脏的骇客;) 我不确定是否有更好的方法。 有没有? 回答1 我只是将其发布为对有关Office自动化的另一个问题的解答,但我认为这也是对这个问题的适当回答(尤其是因为您正在寻找免费或低成本的解决方案)。 使用Microsoft Excel,Word和PowerPoint通过Web服务中的互操作将Office文档打印为PDF格式时,我没有遇到任何问题(性能低下,挂起进程,崩溃的进程等)。 我也遇到了我怀疑是由于看不见的对话框而引起的问题
  • Java Apache POI read Word (.doc) file and get named styles used
    I am trying to read a Microsoft Word 2003 Document (.doc) using poi-scratchpad-3.8 (HWPF). I need to either read the file word by word, or character by character. Either way is fine for what I need. Once I have read either a character or word, I need to get the style name that is applied to the word/character. So, the question is, how do I get the style name used for a word or character when reading the .doc file? EDIT I am adding the code that I used to attempt this. If anyone wants to attempt this, good luck. private void processDoc(String path) throws Exception { System.out.println(path)
  • 抑制列并删除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页上留出较大的空白。 空白取决于查询返回的结果集。 有时会出现,有时却不会出现,具体取决于同一日期有多少条记录。