Используйте OpenOffice Uno CLI с C # для создания электронной таблицы - PullRequest
4 голосов
/ 20 января 2011

До сих пор я нашел несколько источников, которые обсуждают создание файлов ODS: Как создавать документы ODS в .Net и Как создавать файлы .odt с C # .NET?

И что самое интересное объяснение открытия файлов calc . Однако это открывает OpenOffice в полноэкранном режиме, и мне нужен какой-то способ записи в файл Calc (.ods) без фактического открытия Openoffice. Чтобы я мог написать функцию, которая просто открывает savefiledialog, получает имя файла, а затем создает и сохраняет файл .ods.

Есть ли примеры кода на C #, доступные для такой вещи?

1 Ответ

6 голосов
/ 21 января 2011

Итак, я наконец-то решил эту проблему и хочу избавить других от необходимости повторять это.Базовые точки для HEADACE для меня были:

  1. Использовать прямой слеш вместо обратного слеша (например, его C:/ не C:\)
  2. Используемое Filtername должно быть установлено на механизм, используемый для сохранения документа.Возможные значения включают writer8, calc8, MS Excel 97, поэтому для электронных таблиц вам, очевидно, нужно использовать calc8
  3. Если вы не хотите, чтобы OpenOffice всплывал в forground и ждалчтобы заполнить ваши данные, затем используйте 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);
        }
    }
}
...