Используйте OpenOffice Uno CLI с C # для создания электронной таблицы
-
13-10-2019 - |
Вопрос
На данный момент я нашел пару источников, в которых обсуждается создание файлов ODS: Как создавать документы ODS в .Net и Как создавать файлы .odt с помощью C#.NET?
И что самое интересное объяснение для открытия файлов calc.Однако это открывает OpenOffice в полноэкранном режиме, то, что я ищу, - это какой-то способ записи в файл Calc (.ods) без фактического открытия Openoffice.Чтобы я мог написать функцию, которая просто открывает savefiledialog, получает имя файла, а затем создает и сохраняет файл .ods.
Существуют ли какие-либо примеры кода на C #, доступные для выполнения такой задачи?
Решение
Итак, я наконец-то решил эту проблему и хочу избавить других от необходимости проходить через это снова.Основные моменты ГОЛОВНОЙ УБОР для меня были:
- Использование косые черты вперед вместо обратных косых черт (например ,его
C:/
нетC:\
) - Тот Самый
Filtername
используемый должен быть установлен на движок, используемый для сохранения документа.Возможные значения включаютwriter8
,calc8
,MS Excel 97
, поэтому для электронных таблиц вам, очевидно, нужно использовать вычисление8 - Если вы не хотите, чтобы 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);
}
}
}