Pregunta

he encontrado hasta ahora un par de fuentes que hablan de creación de archivos de SAO: Cómo crear documentos de SAO en .Net y Cómo crear archivos .odt con C # .NET

Y lo más interesante una explicación para la apertura calc archivos . Sin embargo, esto abre OpenOffice en pantalla completa, lo que estoy buscando es una manera de escribir en un archivo de Calc (ODS) y sin tener que abrir Openoffice. De modo que pueda escribir una función que solo se abre una SaveFileDialog, recibe el nombre de archivo y luego crea y guarda el archivo .ods.

¿Hay algún ejemplo es C # de código disponibles para hacer tal cosa?

¿Fue útil?

Solución

Así que finalmente han resuelto este problema y quiere salvar a otros de la avellana de pasar por esto otra vez. puntos básicos de HEADACE para mí fueron:

  1. Use barras diagonales en lugar de barras inclinadas hacia atrás (por ejemplo, su C:/ no C:\)
  2. El Filtername utilizado debe establecerse en el motor utilizado para guardar el documento. Los valores posibles son writer8, calc8, MS Excel 97, por lo que para las hojas de cálculo que, obviamente, necesita usar calc8
  3. Si no quieres que OpenOffice aparece en el primer plano y esperar a que se llenan con sus datos, a continuación, utilizar el conjunto PropertyValue y Hidden a true.

feliz de codificación y no se olvide de instalar el SDK de OpenOffice para ser capaz de añadir las referencias 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);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top