我正在尝试从c#应用程序中通过ole自动化自动化openoffice calc。我正在打开文档并再次保存。代码主要是从Apache网站下载的,几乎没有任何修改。
private void OpenSave(string FileAddress)//format: "file:///C:/Untitled1.ods"
{
Type t_OOo= Type.GetTypeFromProgID("com.sun.star.ServiceManager");
Object objServiceManager= System.Activator.CreateInstance(t_OOo);
// arguments for IDispatch-call
Object[] parameters = new Object[1];
parameters[0] = "com.sun.star.frame.Desktop";
// arguments for document
Object[] args = new Object[4];
//args[0] = "private:factory/scalc";
args[0] = FileAddress;
args[1] = "_blank";
args[2] = 0;
args[3] = new Object[] { };
Object desktop;
Object doc;
try
{
desktop = (Object)t_OOo.InvokeMember("createInstance",BindingFlags.InvokeMethod, null,objServiceManager, parameters);
doc = desktop.GetType().InvokeMember("loadComponentFromUrl",BindingFlags.InvokeMethod, null, desktop, args);
if (doc == null)
{/*Error*/ }
object[] O = new object[3];
O[0] = FileAddress;
O[1] = new PropertyValue();
((PropertyValue)O[1]).Name = "";
((PropertyValue)O[1]).Value = true;
O[2] = new Object[] { };
desktop.GetType().InvokeMember("storeAsURL", BindingFlags.InvokeMethod, null, desktop,O);
}
catch (Exception e1)
{
Console.WriteLine(e1);
}
最后一行代码(saveTOURL)始终抛出“未知名称”的异常(确切异常:[System.Runtime.InteropServices.COMException] = {“未知名称。(HRESULT异常:0x80020006(DISP_E_UNKNOWNNAME))”}) 。愿有人帮忙吗?请考虑我主要用这个程序打开xls文件。
事实上关于c#& amp; OLE不够丰富。所有文档都是用Java编写的,我不得不将Java与几个可用的样本进行比较,以找到关于对象模型的弱线索。
我希望能够在保存之前修改单元格的值,如果您能指导我这个,我将不胜感激。
答案 0 :(得分:0)
我使用c#SDK而不是OLE解决了我的问题,所以这不是关于OLE问题的完全答案。
我建议使用SDK,因为您可以从官方API的预定义对象模型中受益,而在com interop中没有这样的指南。
您必须在系统上安装Openoffice SDK,然后在您的c#项目中添加对此目录中所有dll的引用:
... \ OpenOffice 4 \ sdk \ cli \ cli_basetypes.dll
这些页面包含使用c#:
API的实际示例http://suite101.com/a/creating-an-openoffice-calc-document-with-c-a124112(404) http://www.oooforum.org/forum/viewtopic.phtml?t=107055