Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式在.NET中的Word文档(OpenXML)中填充内容控件_C#_Ms Word_Custom Controls_Openxml - Fatal编程技术网

C# 以编程方式在.NET中的Word文档(OpenXML)中填充内容控件

C# 以编程方式在.NET中的Word文档(OpenXML)中填充内容控件,c#,ms-word,custom-controls,openxml,C#,Ms Word,Custom Controls,Openxml,我有一个非常简单的word文档,带有内容控件(所有文本)。 我想在控件之间循环,用字典中的值填充它们。应该非常简单,但有点不对劲: var myValues = new Dictionary<string, string>(); //And fill it using (var wordDoc = WordprocessingDocument.Open(outputFile, true)) { MainDocumentPart mainPart = wordDoc.Main

我有一个非常简单的word文档,带有内容控件(所有文本)。 我想在控件之间循环,用字典中的值填充它们。应该非常简单,但有点不对劲:

var myValues = new Dictionary<string, string>(); //And fill it

using (var wordDoc = WordprocessingDocument.Open(outputFile, true))
{
    MainDocumentPart mainPart = wordDoc.MainDocumentPart;

    foreach(SdtElement sdt in mainPart.Document.Descendants<SdtElement>())
    {
      SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault();

      if (alias != null)
      {
          string sdtTitle = alias.Val.Value;
          sdt.??? = myValues[sdtTitle];
      }
    }
    mainPart.Document.Save();
 }
var myValues=new Dictionary()//然后填满它
使用(var wordDoc=WordprocessingDocument.Open(outputFile,true))
{
MainDocumentPart mainPart=wordDoc.MainDocumentPart;
foreach(mainPart.Document.subjects()中的sdt元素sdt)
{
SdtAlias别名=sdt.subjects().FirstOrDefault();
如果(别名!=null)
{
字符串sdtTitle=alias.Val.Value;
sdt.??=myValues[sdtTitle];
}
}
mainPart.Document.Save();
}
如何将我的值写入文档?
我需要CustomXmlPart吗?

如果要执行类似操作,则需要在Sdt的Sdt内容中写入适当的内容:段落、跑步或tc等,具体取决于Sdt的父元素

另一种方法是将词典的内容放入CustomXml部分,并在每个引用相关词典元素的内容控件上设置数据绑定。Word将在首次打开docx时解析绑定(如果您希望用户用其他东西打开docx,这对您没有多大好处)。

您可以使用此代码

foreach (SdtElement sdt in mainPart.Document.Descendants<SdtElement>())
{
SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault();

if (alias != null)
 {
  string sdtTitle = alias.Val.Value;
  Text t = sdt.Descendants<Text>().First();
  t.Text = "test";
 }
}
foreach(mainPart.Document.substanders()中的SdtElement sdt)
{
SdtAlias别名=sdt.subjects().FirstOrDefault();
如果(别名!=null)
{
字符串sdtTitle=alias.Val.Value;
Text t=sdt.subjects().First();
t、 Text=“测试”;
}
}

谢谢,但仍不确定如何解决问题。我只想用最简单的方法在docx中写入内容控件。这里列出的这个替代方法是不好的。在i4i案例发生后,Microsoft更改了office程序以删除他们找到的任何自定义xml。@Scott,你(可以理解)感到困惑。您考虑的是“自定义xml标记”,而不是自定义xml部件和数据绑定。进一步看,我认为你是对的,我在这里感到困惑是可以理解的。因此,查看该链接,我们仍然可以在文档中插入自定义xml作为新的部分,然后将其绑定到内容控件。因此,是否允许在自定义xml和文档本身之间进行双向更新?那么,我们失去的是创建自定义xml标记的能力?我现在说的对吗?是的,现在你明白了:-)