Question

J'ai trouvé jusqu'à présent deux sources qui traitent de la création de fichiers ODS: Comment créer des documents ODS en .Net Comment créer des fichiers .odt avec C # .NET?

Et le plus intéressant une explication pour l'ouverture fichiers calc . Cependant, cela ouvre OpenOffice en plein écran, ce que je cherche est un moyen d'écrire dans un fichier Calc (.ods) sans avoir à ouvrir Openoffice. Alors que je peux écrire une fonction qui ouvre juste un SaveFileDialog, obtient le nom de fichier et crée et enregistre le fichier .ods.

Est-ce que il y a des exemples de code C # disponible pour faire une telle chose?

Était-ce utile?

La solution

Alors j'ai finalement résolu ce problème et que vous voulez sauver d'autres le noisetier de passer par ce nouveau. les points de base de HEADACE pour moi sont:

  1. Utiliser 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 avec vos données, puis utilisez le PropertyValue et ensemble Hidden à true.

Happy codage 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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top