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?

È stato utile?

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:

  1. Usa le barre anziché barre rovesciate (per esempio la sua C:/ non C:\)
  2. Il Filtername utilizzato deve essere impostato per il motore utilizzato per salvare il documento. I valori possibili sono writer8, calc8, MS Excel 97, quindi per i fogli di calcolo dovrete, ovviamente, per l'uso calc8
  3. Se non volete che OpenOffice apre nel forground e attendere che a riempirsi con i tuoi dati, quindi utilizzare il PropertyValue e set Hidden a true.
codifica

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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top