我正在尝试访问和修改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);