Office Open XML SDK 换词

Posted

技术标签:

【中文标题】Office Open XML SDK 换词【英文标题】:Office Open XML SDK word replacing 【发布时间】:2010-11-02 08:50:46 【问题描述】:

为了根据 SQL 数据库中的数据创建 Word 文档,我使用 Office Open XML SDK 来避免使用互操作。这加快了进程,并且无需在客户端系统上安装 Microsoft 办公套件。

虽然这很有效,但在替换文档中的某些文本时我遇到了问题。为了使最终文档的自定义成为一个选项,我创建了一个包含一些标签的文档作为模板。此模板包含 [TagHere] 等标签。由于标签名称应该易于阅读,它们可以在整个文档中使用,这就是为什么我用大括号 [] 将标签括起来。

这很好用,但有时会出现问题。当您在 docx 文档中键入时,文本可以分成多个标签,即使在同一个单词中也是如此。像 [TagHere] 这样的标签可以拆分为

<tag>[</tag><tag>TagHere</tag><tag>]</tag>

发生这种情况时,替换将不起作用。

现在 docx 格式有一些替代选项来执行此类操作,例如 Content Controls,但这些使创建模板的过程更加复杂。此外,在这些文档中,获取带有标签的表格的一行并多次复制它并不少见,这可能会破坏内容标签原则。因此,我选择不使用此选项。

如果有人能解决这个问题,那就太好了。

【问题讨论】:

如果您将钓鱼钩(= 尖括号?)作为代码部分,则无需更换:选择文本并单击“101010”按钮。 感谢评论,每天学习:) 【参考方案1】:

插入一个合并字段,而不是输入纯文本“taghere”。 (在word中,点击插入>快速部件>字段。选择“合并字段”并在“字段名称”字段中输入“TagHere”。)

然后不要进行文本查找替换,而是扫描文档以查找合并字段并设置内部文本。

class Program

    static void Main(string[] args)
    
        string document = args[0];
        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
        
            Dictionary<string, string> replaceOperations = new Dictionary<string, string>();

            replaceOperations.Add("company", "alex's applications");
            replaceOperations.Add("first_name", "alexander");
            replaceOperations.Add("last_name", "taylor");
            //etc

            Replace(wordDoc, replaceOperations);
        
    

    public static char[] splitChar = new char[] ' ';
    public static void Replace(WordprocessingDocument document, Dictionary<string, string> replaceOperations)
    
        //find all the fields
        foreach (var field in document.MainDocumentPart.Document.Body.Descendants<SimpleField>())
        
            //parse the instruction
            string[] instruction = field.Instruction.Value.Split(splitChar, StringSplitOptions.RemoveEmptyEntries);

            //check if it's a merge field, and if so...
            if (instruction[0].ToLower().Equals("mergefield"))
            
                //get the field name
                string fieldname = instruction[1];

                //find the text inside (there will only be one)
                foreach (var fieldtext in field.Descendants<Text>())
                
                    //see if we know what to set this value to
                    string value = replaceOperations.ContainsKey(fieldname) ? replaceOperations[fieldname] : null;

                    //if we found the replace value, set the text to this value
                    if (value != null)
                        fieldtext.Text = value;

                    //should only be one text inside
                    break;
                
            
        
    

【讨论】:

我正在尝试一些非常相似的东西,但问题是合并字段并不总是表示为 SimpleField,有时它们是 FieldCode 与关联的 FieldChars。跨度>

以上是关于Office Open XML SDK 换词的主要内容,如果未能解决你的问题,请参考以下文章

苹果手机 word打不开 显示office open xml处理文字

word文档关闭后再打开出现“office open xml 错误”怎么办啊

Office文件的Open Xml 格式

你好,我的word文档出现“无法打开office open xml”问题,求解决

word出现无法打开office open XML文件,因为内容有错误,该怎么办?

word出现无法打开office open XML文件,因为内容有错误,该怎么办?