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
与关联的 FieldChar
s。跨度>
以上是关于Office Open XML SDK 换词的主要内容,如果未能解决你的问题,请参考以下文章
苹果手机 word打不开 显示office open xml处理文字
word文档关闭后再打开出现“office open xml 错误”怎么办啊
你好,我的word文档出现“无法打开office open xml”问题,求解决