Office DocumentProperty返回动态而不是DocumentProperties-Collection

时间:2016-02-09 11:14:35

标签: c# .net dynamic ms-office office-interop

我正在尝试访问和修改Office中的DocumentProperties(我尝试使用Word atm,但稍后我想扩展到Excel,这应该不是问题,因为互操作非常相似),但此刻我有非常关注的问题是没有得到我猜的类型。

以下是我的代码的一部分:

var testWordApp = new Word.Application();
var testWordFile = testWordApp.Documents.Open(
                   @"C:\Work\Intern\DocPropChanger_Projektarbeit\" + 
                   @"PrototypeVorlagen\Proj-Nr_QPP_VersionVorlage_endeu.docx",
                   ReadOnly: false, Visible: false);

dynamic test = testWordFile.BuiltInDocumentProperties;

这段代码确实给了我内置的DocumentProperties,比如上一篇作者,版本号等,我可以用foreach来完成它,但它与它应该是不同的。

MSDN和其他来源清楚地将返回的对象转换为DocumentProperties的集合,而如果我这样做,还会得到 InvalidCastException

我目前正在使用VS 2015 Express和Office 13,但我已经在VS 2015社区尝试过VSTO,结果相同。

https://msdn.microsoft.com/en-us/library/dhxe2d75.aspx

以下是SO中其他用户的问题,他或多或少地做了同样的事情:

Accessing Excel Custom Document Properties programatically

它似乎对他有用,我参考了框架的适当部分,它们是:

Office.Core
Office.Interop.Word

由于不得不使用

而造成的主要问题
dynamic

导致无法添加我自己的属性,我尝试这样做:

testWordFile.CustomDocumentProperties.Add(
              Name: d.Name, 
              LinkToContent: false, 
              Type: 4, 
              Value: "Testtext aus Programm");

€:我也尝试添加测试,结果是相同的。

这会导致异常:

HRESULT:0x8000FFFF

这是在谷歌看一看非常一般的错误。

我该怎么做才能收回正确的收藏品?我在添加属性时是否犯了错误?

我在这些网站上查看了其中一个(其中一个是上面链接的MSDN页面)以供参考:

https://stackoverflow.com/a/12690798/3664953

€²:

清除:

我必须得到所设置的每个自定义属性,即使不知道名称,所以除了使用以前给定的方法使用动态并使用它之外,我没有真正找到一种方法。

正如Cindy Meister所说,我目前还没有使用VSTO,但是,如前所述,我已经尝试了一种方法,导致我遇到的问题同样存在,这可能与我对VSTO的经验不足有关...

这是我班上更完整的代码,只是为了它:

这是一个原型,因此所有使用的变量都没有以明显可理解的方式命名,这应该不是一个大问题,因为代码不是太复杂的。

var testWordApp = new Word.Application();
var testWordFile = testWordApp.Documents.Open(
                    @"C:\Work\Intern\DocPropChanger_Projektarbeit"+
                    @"\PrototypeVorlagen\Proj-Nr_QPP_VersionVorlage_endeu.docx",
                    ReadOnly: false, Visible: false);
dynamic test = testWordFile.BuiltInDocumentProperties;
Console.WriteLine(test.GetType());
foreach (dynamic d in test)
{
  //TryCatch due to the fact, that I also get some more stuff, that are not Properties...
  try
  {
    //I wanted to check the returned Types and if they have one at all
    //This was something someone in the internet stated 
    //(Props not having a valid Type ...)
    Console.WriteLine("\r\n---------\r\n");
    Console.WriteLine(d.GetType());
    Console.WriteLine(d.Name + " # " + d.Name.GetType());
    Console.WriteLine(d.Type + " # " + d.Type.GetType());
    Console.WriteLine(d.Value + " # " + d.Value.GetType());
  }
  catch
  { }
}

dynamic test2 = testWordFile.CustomDocumentProperties;
Console.WriteLine(test2.GetType());
foreach (dynamic d in test2)
{
  try
  {
    Console.WriteLine("\r\n---------\r\n");
    Console.WriteLine(d.GetType());
    Console.WriteLine(d.Name + " # " + d.Name.GetType());
    Console.WriteLine(d.Type + " # " + d.Type.GetType());
    Console.WriteLine(d.Value + " # " + d.Value.GetType());
    if(d.Name == "TestpropText")
    {
      //For highlighting
      Console.WriteLine("#+#+#+#+#+#+#+#+#+#+#");
      //This works like a charm
      testWordFile.CustomDocumentProperties[d.Name].Delete();
      //This results in the previously mentioned HRESULT: 0x8000FFFF 
      test.Add(Name: d.Name, LinkToContent: false, Type: 4, Value: "Testtext aus Programm");
    }

  }
  catch(Exception e)
  {
    Console.WriteLine(e.InnerException);
  }
}

testWordApp.Documents.Save(NoPrompt: true, OriginalFormat: true);
testWordApp.Application.Quit(SaveChanges: false, OriginalFormat: false, 
                             RouteDocument: false);

0 个答案:

没有答案