Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: DeveloperTalk. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

Timon L.

Anfänger

  • »Timon L.« ist der Autor dieses Themas

Beiträge: 45

Registrierungsdatum: 12.08.2012

Wohnort: GM

Danksagungen: 9

  • Private Nachricht senden

1

06.06.2014, 19:32

OpenOffice Calc-CLI - Probleme mit dem Beschreiben von Zellen

Hallo! Ist schon länger her, dass ich hier mal zu sehen war, ich hoffe, ihr verzeiht mir diesen Umstand :)

Ich arbeite gerade wegen einer Physikhausaufgabe an einem kleinen Programm, das mir eine Formel einige Male ausrechnen soll und damit ein OpenOffice-Dokument beschreiben soll. Klingt ja schonmal nicht so kompliziert.
Ich habe dafür auch ein Tutorial gefunden, mit dem ich OpenOffice per VS ansprechen konnte: Super! Klappt alles, ich kann Dokumente erstellen und Zellen setzen.

Jetzt habe ich allerdings ein kleines Problem, welches sich eigentlich eher auf OpenOffice bezieht, aber ich wusste nicht, wo ich sonst posten sollte.

Ich möchte anfangs basierend auf Nutzereingaben Zellen füllen lassen - was codetechnisch eigentlich mit Strings machbar sein sollte. Dafür hab ich mir den Code zusammengesucht, mit dem ich zugriff auf ein Sheet bekomme, und kann jetzt die einzelnen Zellen ansprechen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// BEGIN Initialisation
 XComponentContext oStrap = uno.util.Bootstrap.bootstrap();
 XMultiServiceFactory oServMan = (XMultiServiceFactory)oStrap.getServiceManager();
 XComponentLoader oDesk = (XComponentLoader)oServMan.createInstance("com.sun.star.frame.Desktop");
 string url = @"private:factory/scalc";
 PropertyValue[] propVals = new PropertyValue[0];
 XComponent oDoc = oDesk.loadComponentFromURL(url, "_blank", 0, propVals);
 // END Initialisation

 // BEGIN Get Spreadsheet Access
 XSpreadsheets oSheets = ((XSpreadsheetDocument)oDoc).getSheets();
 XIndexAccess oSheetsIA = (XIndexAccess)oSheets;
 XSpreadsheet oSheet = (XSpreadsheet)oSheetsIA.getByIndex(0).Value;
 // END Get Spreadsheet Access


Wie zu sehen, nichts zu kompliziertes. Jetzt kann ich auf die Zellen zugreifen mit der Funktion getCellByPosition (int nColumn, int nRow), welche sich auf das Sheet bezieht. Logisch.
Ich habe dann drei mögliche Funktionen: setString, setFormula und setValue. Ich möchte möglichst über setFormula gehen, damit man sich alles recht einfach anschauen kann und das ganze auch im Nachhinein modifizierbar ist.

Wenn ich da aber beispielsweise G setzen lasse ( oSheet.getCellByPosition(0, 1).setFormula("=" + inputGBase.Text + "*10^" + inputGExponent.Text + " ");), kommt in OpenOffice der Fehler "#NAME?", der eigentlich nur kommen sollte, wenn man eine nicht vorhandene Zelle referenziert. Das merkwürdige ist: Da ist gar kein Name drinnen! Die Werte, die da standardmäßig genutzt werden, sind
inputGBase = 6,67
inputGExponent = -11
(Wenn ich Punkte benutze, kommt in der deutschen Calc-Version intelligenterweise ein Fehler)

Wenn ich selber dann auf die Zelle und auf bestätigen drücke, bleibt der Fehler, aber sobald ich beispielsweise bei dem -11 die zweite 1 lösche und wieder hinschreibe, ist der Fehler weg.

Versteht das jemand und hat eine Ahnung, was ich da machen könnte/was ich falsch mache?

Hier mein ganzer Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.bridge;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.text;
using unoidl.com.sun.star.beans;
using unoidl.com.sun.star.sheet;
using unoidl.com.sun.star.container;
using unoidl.com.sun.star.table;

namespace Mond_Berechnung
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            initialiseInputFields();
        }

        private void buttonReset_Click(object sender, EventArgs e)
        {
            initialiseInputFields();
        }

        private void initialiseInputFields()
        {
            inputGBase.Text = "6,67";
            inputGExponent.Text = "-11";

            inputMondBase.Text = "7,35";
            inputMondExponent.Text = "22";

            inputErdeBase.Text = "5,976";
            inputErdeExponent.Text = "24";

            inputR.Text = "384000000";

            inputTime.Text = "1";
        }

        private void writeIntoSpreadsheet()
        {
            // BEGIN Initialisation
            XComponentContext oStrap = uno.util.Bootstrap.bootstrap();
            XMultiServiceFactory oServMan = (XMultiServiceFactory)oStrap.getServiceManager();
            XComponentLoader oDesk = (XComponentLoader)oServMan.createInstance("com.sun.star.frame.Desktop");
            string url = @"private:factory/scalc";
            PropertyValue[] propVals = new PropertyValue[0];
            XComponent oDoc = oDesk.loadComponentFromURL(url, "_blank", 0, propVals);
            // END Initialisation

            // BEGIN Get Spreadsheet Access
            XSpreadsheets oSheets = ((XSpreadsheetDocument)oDoc).getSheets();
            XIndexAccess oSheetsIA = (XIndexAccess)oSheets;
            XSpreadsheet oSheet = (XSpreadsheet)oSheetsIA.getByIndex(0).Value;
            // END Get Spreadsheet Access

            // BEGIN Write strings
            // Set G String
            ((XText)oSheet.getCellByPosition(0, 0)).setString("Gravitationskonstante G");
            // Set G Formula
            oSheet.getCellByPosition(0, 1).setFormula("=" + inputGBase.Text + "*10^" + inputGExponent.Text + " ");

            // Set Mond String
            ((XText)oSheet.getCellByPosition(1, 0)).setString("Masse Mond");
            // Set Mond Value
            oSheet.getCellByPosition(1, 1).setFormula("=7,35*10^22");

            // Set Erde String
            ((XText)oSheet.getCellByPosition(2, 0)).setString("Masse Erde");
            // Set Erde Value
            oSheet.getCellByPosition(2, 1).setFormula("=5,976*10^24");
        }

        private void buttonCalc_Click(object sender, EventArgs e)
        {
            writeIntoSpreadsheet();
        }
    }
}


Wie man sieht, ist der noch in Arbeit - ich hab erst konstante Werte benutzt, bis mir eingefallen ist, dass ich die am Besten dynamisch machen sollte.

€dit: Mein Bruder hat den Fehler gefunden. Wenn man setValue() benutzt, darf man keine Punkte benutzen, aber wenn man setFormula() benutzt, muss man das sogar :huh: sehr inkosistent.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Timon L.« (06.06.2014, 20:38)


Ähnliche Themen