2011-01-20 3 views
4

J'ai trouvé jusqu'à présent deux sources qui traitent de la création de fichiers ODS: How to create ODS documents in .Net et How to create .odt files with C#.NET?Utiliser OpenOffice Uno CLI avec C# pour créer une feuille de calcul

Et le plus intéressant an explanation for opening calc files. Cependant, cela ouvre OpenOffice en plein écran, ce que je cherche est un moyen d'écrire dans un fichier Calc (.ods) sans réellement ouvrir Openoffice. Alors que je peux écrire une fonction qui ouvre juste un savefiledialog, obtient le nom de fichier, puis crée et enregistre le fichier .ods.

Y a-t-il des exemples de codes C# disponibles pour faire une telle chose?

Répondre

6

Donc, j'ai finalement résolu ce problème et je veux sauver les autres le noisetier d'y retourner. les points de base de HEADACE pour moi étaient:

  1. Utilisez des barres obliques au lieu de barres obliques inverses (par exemple son C:/ pas C:\)
  2. Le Filtername utilisé doit être réglé sur le moteur utilisé pour enregistrer le document. Les valeurs possibles sont writer8, calc8, MS Excel 97, donc pour les feuilles de calcul, vous devez évidemment utiliser calc8
  3. Si vous ne voulez pas que OpenOffice apparaît dans le forground et attendez qu'il se rempli de vos données, puis utilisez le PropertyValue et définir Hidden à true.

codage Heureux et ne pas oublier d'installer le SDK OpenOffice pour pouvoir ajouter 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 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); 
     } 
    } 
} 
Questions connexes