Utiliser la CLI OpenOffice Uno avec C # pour créer une feuille de calcul

Jusqu’à présent, j’ai trouvé quelques sources qui traitent de la création de fichiers ODS: Comment créer des documents ODS en .Net et Comment créer des fichiers .odt avec C # .NET?

Et le plus intéressant, une explication pour l’ouverture de fichiers calc . Cependant, OpenOffice est ouvert en plein écran. Ce que je cherche, c’est un moyen d’écrire dans un fichier Calc (.ods) sans ouvrir Openoffice. Pour que je puisse écrire une fonction qui ouvre simplement un fichier savefiledialog, obtient le nom du fichier, puis crée et enregistre le fichier .ods.

Y at-il des exemples de code C # disponibles pour faire une telle chose?

Donc, j’ai finalement résolu ce problème et je veux sauver aux autres le noisetier de le subir à nouveau. Les points fondamentaux de HEADACE pour moi étaient:

  1. Utilisez des barres obliques au lieu de barres obliques (par exemple, C:/ pas C:\ )
  2. Le nom de Filtername utilisé doit être défini sur le moteur utilisé pour enregistrer le document. Les valeurs possibles incluent writer8 , calc8 , MS Excel 97 Vous devez donc évidemment utiliser calc8 pour les feuilles de calcul .
  3. Si vous ne voulez pas qu’OpenOffice apparaisse à l’avant-plan et attendez qu’il soit rempli de vos données, utilisez PropertyValue et définissez Hidden sur true .

Bon codage et n’oubliez pas d’installer le SDK OpenOffice pour pouvoir append les références 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 ssortingng 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"); ssortingng 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).setSsortingng("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); } } }