如何在C#中使用动态程序集比较两个docx Word文件?

3

我使用这段代码来比较两个word文档,使用的是office word interopt:

object missing = System.Reflection.Missing.Value;
                    object readonlyobj = false;
                    object filename = FirstDocx;

                    //Call assemblys dynamically
                    dynamic objEApp = Activator.CreateInstance(Type.GetTypeFromProgID("Word.Application"));
                    string strAssemblyOff2007 = "Microsoft.Office.Interop.Word, Version=" + objEApp.Version + ".0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c";
                    Assembly xslWordAssembly = Assembly.Load(strAssemblyOff2007); //Load Assembly
                    Type type = xslWordAssembly.GetTypes().Single(t => t.Name == "ApplicationClass");
                    dynamic app = Activator.CreateInstance(type);
                    //var docs = app.Documents;
                    //

                    //Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
                    var doc = app.Documents.Open(
                    ref filename, ref missing, ref readonlyobj, ref missing, ref missing,
                    ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

                    string filenm = SecondDocx;
                    string nm = FirstDocx;
                    object filesavename = nm;

                    doc.TrackRevisions = true;
                    doc.ShowRevisions = true;
                    doc.PrintRevisions = true;
                    doc.Compare(filenm);
                    doc.Close(ref missing, ref missing, ref missing);
                    app.Quit(ref missing, ref missing, ref missing);

第一和第二个Docx是我的文件。 在代码中,我动态加载程序集,但当我想打开第一个docx时,在 var doc = app.Documents.Open(这里,我遇到了以下错误:

Could not convert argument 0 for call to Open.

我该怎么解决它?

可能是因为你的FirstDocx不包含有效的路径/文件名。没有看到FirstDocxSecondDocx的值,很难确定。 - Kevin
第一个和第二个Docx是字符串(例如:D:\str.docx) - Ali Ahmadi
2个回答

0

这是一个数据类型的问题。当分析并将COM类型库转换为C#中的(PIA)时,数据类型必须调整为C#所理解的数据类型。C#在本质上不支持可选参数 - 它使用重载代替。因此,VBA可选参数必须作为对象通过引用传递。但是要求的参数保留数据类型。

参数FileName不是可选的,并且其类型为字符串。所以你需要:

string filename = FirstDocX;

0

替代

var doc = app.Documents.Open(ref filename, ref missing, ref readonlyobj, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

简单尝试

var doc = app.Documents.Open(@filename);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接