到目前为止,我找到了几个讨论 ODS 文件创建的来源:How to create ODS documents in .Net
How to create .odt files with C#.NET?

最有趣的是 an explanation for opening calc files 。然而,这会以全屏方式打开 OpenOffice,我正在寻找的是某种无需实际打开 Openoffice 即可写入 Calc 文件 (.ods) 的方法。这样我就可以编写一个函数来打开一个 savefiledialog,获取文件名,然后创建并保存 .ods 文件。

是否有任何 C# 代码示例可用于执行此类操作?

最佳答案

所以我终于解决了这个问题,并希望让其他人免于再次经历这个问题。 HEADACE 对我来说的基本要点是:

  • 使用 正斜杠 而不是反斜杠(例如,它的 C:/ 不是 C:\ )
  • 使用的 Filtername 应设置为用于保存文档的引擎。可能的值包括 writer8calc8MS Excel 97 ,因此对于电子表格,您显然需要使用 calc8
  • 如果您不希望 OpenOffice 在前台弹出并等待它填充您的数据,则使用 PropertyValue 并将 Hidden 设置为 true

  • 快乐编码,不要忘记安装 OpenOffice SDK 以便能够添加 unoidl 引用:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using unoidl.com.sun.star.uno;
    using unoidl.com.sun.star.lang;
    using unoidl.com.sun.star.frame;
    using unoidl.com.sun.star.beans;
    using unoidl.com.sun.star.sheet;
    using unoidl.com.sun.star.container;
    using unoidl.com.sun.star.table;
    using unoidl.com.sun.star.text;
    
    namespace TimeScanner {
        class ReportGenerator {
            private const string fileName =
                @"file:///C:/Documents and Settings/My Documents/Hours Report.ods";
    
            //Concrete Methods
            internal XComponent openCalcSheet() {
                XComponentContext oStrap = uno.util.Bootstrap.bootstrap();
                XMultiServiceFactory oServMan = (XMultiServiceFactory)oStrap.getServiceManager();
                XComponentLoader desktop = (XComponentLoader)oServMan.createInstance("com.sun.star.frame.Desktop");
                string url = @"private:factory/scalc";
                PropertyValue[] loadProps = new PropertyValue[1];
                loadProps[0] = new PropertyValue();
                loadProps[0].Name = "Hidden";
                loadProps[0].Value = new uno.Any(true);
                //PropertyValue[] loadProps = new PropertyValue[0];
                XComponent document = desktop.loadComponentFromURL(url, "_blank", 0, loadProps);
                return document;
            }
    
            public void writeToSheet(XComponent document) {
                XSpreadsheets oSheets = ((XSpreadsheetDocument)document).getSheets();
                XIndexAccess oSheetsIA = (XIndexAccess) oSheets;
                XSpreadsheet sheet = (XSpreadsheet) oSheetsIA.getByIndex(0).Value;
                XCell cell = sheet.getCellByPosition( 0, 0 ); //A1
                ((XText)cell).setString("Cost");
                cell = sheet.getCellByPosition( 1, 0 ); //B1
                cell.setValue(200);
                cell = sheet.getCellByPosition( 1, 2 ); //B3
               cell.setFormula("=B1 * 1.175");
            }
    
            public void saveCalcSheet(XComponent oDoc) {
                PropertyValue[] propVals = new PropertyValue[1];
                propVals[0] = new PropertyValue();
                propVals[0].Name = "FilterName";
                propVals[0].Value = new uno.Any("calc8");
                ((XStorable)oDoc).storeToURL(fileName, propVals);
            }
        }
    }
    

    关于c# - 使用 OpenOffice Uno CLI 和 C# 创建电子表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4743738/

    10-11 22:26