Используйте OpenOffice Uno CLI с C # для создания электронной таблицы

StackOverflow https://stackoverflow.com/questions/4743738

  •  13-10-2019
  •  | 
  •  

Вопрос

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

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

Существуют ли какие-либо примеры кода на C #, доступные для выполнения такой задачи?

Это было полезно?

Решение

Итак, я наконец-то решил эту проблему и хочу избавить других от необходимости проходить через это снова.Основные моменты ГОЛОВНОЙ УБОР для меня были:

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