我试图通过来自c#应用程序的ole自动化来自动化openoffice。我要打开一份文件再保存一次。代码大部分是从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# & OLE的文档还不够丰富。所有文档都是用Java编写的,我不得不将Java与很少的ole示例进行比较,以找到关于对象模型的薄弱线索。
我希望能够在保存之前修改一个单元格的值,如果您也能指导我这一点,我将不胜感激。
发布于 2014-01-12 13:10:35
我用c# SDK而不是OLE解决了我的问题,所以这不能完全回答关于OLE的问题。
我建议使用SDK,因为您可以使用官方API的预定义对象模型,而在com互操作中没有这样的指南。
必须在系统上安装Openoffice,然后在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
https://stackoverflow.com/questions/20924695
复制相似问题