Usa OpenOffice Uno CLI con C # per creare un foglio di calcolo
-
13-10-2019 - |
Domanda
ho finora trovato un paio di fonti che discutono la creazione di file ODS: Come creare documenti ODS in .Net Come creare file con C # .NET? .odt
E più interessante una spiegazione per l'apertura file calc . Tuttavia, questo si apre OpenOffice a schermo intero, che cosa im cercando è un modo di scrivere in un file di Calc (.ods) senza in realtà l'apertura di OpenOffice. In modo che posso scrivere una funzione che appena si apre un SaveFileDialog, ottiene il nome del file e quindi crea e salva il file .ods.
Sono v'è alcun esempio di codice C # disponibili per fare una cosa del genere?
Soluzione
Così ho finalmente risolto questo problema e vuole salvare gli altri nocciolo di passare attraverso questo nuovo. punti di base di HEADACE per me erano:
- Usa le barre anziché barre rovesciate (per esempio la sua
C:/
nonC:\
) - Il
Filtername
utilizzato deve essere impostato per il motore utilizzato per salvare il documento. I valori possibili sonowriter8
,calc8
,MS Excel 97
, quindi per i fogli di calcolo dovrete, ovviamente, per l'uso calc8 - Se non volete che OpenOffice apre nel forground e attendere che a riempirsi con i tuoi dati, quindi utilizzare il
PropertyValue
e setHidden
atrue
.
Happy e non dimenticate di installare l'OpenOffice SDK per essere in grado di aggiungere i riferimenti 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);
}
}
}