Excel schreiben/lesen

Hallo alle zusammen,

ich habe hier in den letzten Wochen viel gelesen, gestöbert, gelernt und erfragt. An dieser Stelle nochmals besten Dank für eure Hilfe.

Ich habe meine Visu fast fertig und werde sie euch in den nächsten Wochen vorstellen. Ich denke das ist das mindeste was man als „Rookie“ in Sachen IPS machen kann um wenigstens ein bisschen zurück zu geben.

Ich habe hier öfters gelesen das Interesse besteht eine Anbindung zu Excel zu haben um Daten zu schreiben oder zu lesen. Ich habe zwei Funktionen geschrieben die genau das machen. Die beiden Scripe sind nur Beispiel wie man eine Verbindung zu Excel erstellt. Sie beinhalten lediglich das lesen / schreiben einer Zelle. Das Script kann natürlich dementsprechend „ausgerollt“ werden.

aktualisiert am 09.11.2009 Schablone

Als erstes die Funktion „write_to_excel“


function write_to_Excel($filename, $Worksheet, $raw, $column, $string)
			{
			   //Einbinden der COM-Klasse für Excel
            $excel_app = new COM("Excel.application") or Die ("Did not connect");

				//Kontrolle der Datei
				if (file_exists($filename))
				{
					//öffnen einer bestehenden Excel-Datei
   	         $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
				}
				else
				{
					//Sonst -> Meldung
					echo "The file $filename does not exist";
					//und neu anlegen
					$Workbook = $excel_app->Workbooks->Add(); //neu
				}

				//zusammensetzen der Zelle
				$cell = $column.$raw;

				//Auswahl des Worksheet
				$Worksheet = $Workbook->Worksheets($Worksheet);
				//Aktivieren des Worksheet
				$Worksheet->activate;
				//Auswahl der Zelle
				$excel_cell = $Worksheet->Range($cell);
				//Aktivieren der Zelle
				$excel_cell->activate;
				//Schreiben der Stringinformation in die aktive Zelle
            $excel_cell->value = $string;

				//Kontrolle der Datei
				if (file_exists($filename))
				{
					//Speichern der bestehenden Datei
					$Workbook->Save;
				}
				else
				{
				   //Speichern der neuen Datei
					$Workbook->SaveAs($filename);
				}

				//Schliessen der Excel-Instanz und freigeben des Speichers
				//Willi wichtig!!!
				$Workbook->Close;
				unset($Worksheet);
				unset($Workbook);
				$excel_app->Workbooks->Close();
				$excel_app->Quit();
				unset($excel_app);
			}

Nun die Funktion „read_from_excel“

aktualisiert am 09.11.2009 Schablone


function read_from_Excel($filename, $Worksheet, $raw, $column)
			{
				//Kontrolle der Datei
				if (file_exists($filename))
				{
				   //Einbinden der COM-Klasse für Excel
	            $excel_app = new COM("Excel.application") or Die ("Did not connect");
					//öffnen einer bestehenden Excel-Datei
	            $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
					//Auswahl des Worksheets 1
					$Worksheet = $Workbook->Worksheets($Worksheet);
					//Aktivieren des Worksheet 1
					$Worksheet->activate;
					
					//zusammensetzen der Zelle
					$cell = $column.$raw;
					
					//Auswahl der Zelle
					$excel_cell = $Worksheet->Range($cell);
					//Aktivieren der Zelle
					$excel_cell->activate;
					//Lesen der Stringinformation aus der aktive Zelle
	            $string = $excel_cell->value;
					//Schliessen der Excel-Instanz und freigeben des Speichers
					//Willi wichtig!!!
					$Workbook->Close;
					unset($Worksheet);
					unset($Workbook);
					$excel_app->Workbooks->Close();
					$excel_app->Quit();
					unset($excel_app);

				}
				else
				{
					//Sonst -> Meldung
					$string = "The file $filename does not exist";
				}
				
				//Ausgeben der Information
				return $string;
			}

Beispiel schreiben (Einbindung der Funktionen)

aktualisiert am 09.11.2009 Schablone



$filename = IPS_GetKernelDir()."meldungen\\ereignisse\\Test.xls";
$Worksheet = "Tabelle1";            //Option 1 über die Bezeichnung
$Worksheet = 1;                     //Option 2 über die Nummer
$raw = 10;
$column = "B";
$string = "Das ist ein Test";

write_to_Excel($filename, $Worksheet, $raw, $column, $string);


Beispiel lesen (Einbindung der Funktionen)

aktualisiert am 09.11.2009 Schablone



$filename = IPS_GetKernelDir()."meldungen\\ereignisse\\Test.xls";
$Worksheet = "Tabelle1";            //Option 1 über die Bezeichnung
$Worksheet = 1;                     //Option 2 über die Nummer
$raw = 10;
$column = "B";

$string = read_from_Excel($filename, $Worksheet, $raw, $column);

echo $string;


Noch eins zum Schluss

Ich bin PHP-Anfänger → Also lass gnade walten.

Ansonsten bin ich verheiratet. Das heisst → 100% Kritikfähig

Bis dann

Martin

aktualisiert am 09.11.2009 Schablone

PS: aktualisierte Funktion print_from_Excel



function print_from_Excel($filename, $Worksheet)
			{
			   //Einbinden der COM-Klasse für Excel
            $excel_app = new COM("Excel.application") or Die ("Did not connect");
				//öffnen einer bestehenden Excel-Datei
            $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
				//Auswahl des Worksheets 1
				$Worksheet = $Workbook->Worksheets($Worksheet);
				//Aktivieren des Worksheet 1
				$Worksheet->activate;

				//Worksheet drucken
            $Worksheet->PrintOut;

				//für Leute die kein Geld
				//für einen Print-Server haben (so wie ich)
            IPS_Sleep(10);

				//Schliessen der Excel-Instanz und freigeben des Speichers
				//Willi wichtig!!!
				$Workbook->Close;
				unset($Worksheet);
				unset($Workbook);
				$excel_app->Workbooks->Close();
				$excel_app->Quit();
				unset($excel_app);

			}

Beispiel drucken (Einbindung der Funktionen)

aktualisiert am 09.11.2009 Schablone



$filename = IPS_GetKernelDir()."meldungen\\ereignisse\\Test.xls";
$Worksheet = "Tabelle1";            //Option 1 über die Bezeichnung
$Worksheet = 1;                     //Option 2 über die Nummer

print_from_Excel($filename, $Worksheet);


Das ist eine schöne Sache… Vielen Dank!.. werde ich mal ausprobieren übers WE (wenn ich dazu komme).

Ich habe da schon meine Ideeen in Zusammenarbeit mit Retiarius’s „Parameter-Heizungssteuerung“ :wink:
Vielen Dank auch dorthin!

Genau ungefähr so.

Bis dann

Martin

Temperaturen.zip (6.19 KB)

Nja, schon bisschen mehr PNP, weniger als Formblatt, aber ich denke mit Makros…
Mal schau’n was sich draus machen lässt… (Excel ist meine heimliche Leidenschaft und unendlich…)
Ich werde es hier wissen lassen, wenn was öffentlich Verwendbares dabei raus kommt… :slight_smile: :wink:

Wenn man dann mal was drucken will!


function print_from_Excel($filename)
			{
			   //Einbinden der COM-Klasse für Excel
            $excel_app = new COM("Excel.application") or Die ("Did not connect");
				//öffnen einer bestehenden Excel-Datei
            $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
				//Auswahl des Worksheets 1
				$Worksheet = $Workbook->Worksheets(1);
				//Aktivieren des Worksheet 1
				$Worksheet->activate;

				//Worksheet drucken
            $Worksheet->PrintOut;
            
				//für Leute die kein Geld
				//für einen Print-Server haben (so wie ich)
            IPS_Sleep(10);

				//Schliessen der Excel-Instanz und freigeben des Speichers
				//Willi wichtig!!!
				$Workbook->Close;
				unset($Worksheet);
				unset($Workbook);
				$excel_app->Workbooks->Close();
				$excel_app->Quit();
				unset($excel_app);

			}


Hi Martin,

mal noch eine Frage dazu:
Du schreibst…

Muss demzufolge Excel auf dem Rechner installiert sein?
Da wäre dann weniger praktisch für meine Idee:( , weil ich auf dem Server keine Office-Programme installieren möchte. Das gehört eben einfach nicht auf’n Server.
Wenn ja, würde ein Excel-Viewer ausreichen? Hast du das schon probiert?
Eine direkte Excel-File-Abfrage wäre natürlich schon schöner. Ansonsten müsste ich in CSV exportieren.

Hallo nancilla,

Das lesen/schreiben und drucken passiert aus Excel heraus. Mit dem COM-Interface bist Du in der Lage Windows-Anwendungen zu steuern.Die ganze Wahrheit ist, mit der Anweisung:


$excel_app = new COM("Excel.application") or Die ("Did not connect");

wird Excel im Hintergrund gestartet.

Also um es kurz zu machen „Ja“ Du brauchst Excel.

Das schöne an dem COM-Interface ist halt, das die meisten (angeblich sogar selbst geschriebenen) Programme darüber gesteuert werden können.

D.h.: Excel, Word, PowerPoint, Email-Programme usw.

Hier ein Beispiel für Word:


$filename = IPS_GetKernelDir()."meldungen\\ereignisse\\ereignisse.doc";

// Word starten
$word = new COM("word.application") or die("Konnte Word nicht instanziieren");

//ein leeres Dokument öffnen
$word->Documents->Add();

//irgendetwas damit tun
$word->Selection->TypeText("Dies ist ein Test...");
$word->Documents[1]->SaveAs($filename);

//Word schließen
$word->Quit();

//Objekt freigeben
$word = null;

Ich habe es so verstanden dass Du in Excel auch Formeln und Scripting hinterlegen willst. Ob das mit einem Excel-Viewer funktioniert wage ich zu bezweifeln. Ich habe es auf jeden fall noch nicht probiert einen Excel-Viewer über das COM-Interface anzusteuern. Das Problem ist, Du musst die entsprechenden API-Funktionen zur Steuerung kennen.

Bis dann

Martin

Ich will ja eigentlich nichts im Excel-File schreiben, sondern nur Zellwerte auslesen. Liest/gibt es mir das Ergebnis eine Zellformel aus, oder etwa die Formel, die in der Zelle steht? Das wäre dann natürlich nicht sinnvoll für meine Anwendung.

Hallo nancilla,

Ich habs gerade ausprobiert. Man bekommt das Ergebnis. Getestet habe ich:

Zelle A1 = 10
Zelle A2 = 1
Zelle A3 = =A1+A2

$result = read_from_excel($filename, „A3“);
echo $result;

Ausgespukt wurde „11“.

Bis dann

Martin

Ich habe gerade nochmals nachgelesen. Wenn ich das richtig verstehe braucht Excel auf deiner lokalen Maschine nicht installiert zu sein.

com COM::COM ( string $module_name [, mixed $server_name [, int $codepage [, string $typelib ]]] )

module_name

Kann eine ProgID, Klassen-ID oder der Moniker der zu ladenden Komponente sein. Eine ProgID ist typischerweise der Applikations- oder DLL-Name, gefolgt von einem Punkt, gefolgt vom Objektnamen, z.B. Word.Application Eine Klassen-ID ist die UUID, die eineindeutig eine bestimmte Klasse identifiziert. Ein Moniker ist eine spezielle Form der Benennung, konzeptähnlich dem URL-Schema, das eine Ressource identifiziert und angibt, wie sie geladen werden soll. Beispielsweise könnten Sie Word laden und ein Objekt erzeugen, das ein Worddokument repräsentiert, indem Sie den vollständigen Pfad zum Worddokument als Modulnamen angeben, oder Sie können LDAP: als einen Moniker verwenden, um das ADSI-Interface zu LDAP zu nutzen.

server_name

Name des DCOM-Servers, auf dem die Komponente geladen und ausgeführt werden soll. Ist NULL angegeben, wird das Objekt auf dem Standardwert dieser Applikation ausgeführt. Der Standardwert ist typischerweise die Ausführung auf der lokalen Maschine, obwohl der Administrator die Applikation so konfiguriert haben kann, dass sie auf einer anderen Maschine startet. Wenn Sie einen Nicht-NULL-Wert für den Server angeben, wird PHP das Laden des Objekts zurückweisen, wenn nicht auch die Konfigurationsoption Laufzeit-Konfiguration auf TRUE gesetzt ist.

Wenn server_name ein Array ist, sollte es die folgenden Elemente enthalten (Groß- und Kleinschreibung wird unterschiedlich interpretiert!). Beachten Sie, dass alle Elemente optional sind (obwohl Sie bei der Angabe eines Usernamens auch ein Passwort angeben müssen). Wenn Sie die Server-Einstellung weglassen, wird der Standardserver verwendet (wie oben beschrieben), und die Instanziierung des Objekts ist nicht von der Laufzeit-Konfiguration-Direktive betroffen.

hier der Link zum nachlesen:

PHP: COM - Manual

Bis dann

Martin

Hmm… habe gerade mal einen Test gemacht…

<?
function read_from_Excel($filename, $cell)
            {
               //Einbinden der COM-Klasse für Excel
            $excel_app = new COM("Excel.application") or Die ("Did not connect");
                //öffnen einer bestehenden Excel-Datei
            $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
                //Auswahl des Worksheets 1
                $Worksheet = $Workbook->Worksheets(1);
                //Aktivieren des Worksheet 1
                $Worksheet->activate;
                //Auswahl der Zelle
                $excel_cell = $Worksheet->Range($cell);
                //Aktivieren der Zelle
                $excel_cell->activate;
                //Lesen der Stringinformation aus der aktive Zelle
            $string = $excel_cell->value;
                //Schliessen der Excel-Instanz und freigeben des Speichers
                //Willi wichtig!!!
                $Workbook->Close;
                unset($Worksheet);
                unset($Workbook);
                $excel_app->Workbooks->Close();
                $excel_app->Quit();
                unset($excel_app);

                //Ausgeben der Information
                return $string;
            }

$filename = IPS_GetKernelDir()."\\ip-symcon_v2\\daten\	est\	est.xls";

$String = read_from_excel($filename, "B4");
echo $String;
?>

Raus kam:

Fatal error:  Uncaught exception 'com_exception' with message 'Failed to create COM object `Excel.application': Ungültige Syntax
' in H:\IP-Symcon_V2\scripts\Test5:8
Stack trace:
#0 H:\IP-Symcon_V2\scripts\Test5(8): com-&gt;com('Excel.applicati...')
#1 H:\IP-Symcon_V2\scripts\Test5(36): read_from_Excel('H:\IP-Symcon_V2...', 'B4')
#2 {main}
  thrown in H:\IP-Symcon_V2\scripts\Test5 on line 8

Ich meine, man braucht doch ein installiertes Excel.
Woher sollte das System auch wissen, was Excel ist, wenn es nicht installiert ist.:o

Das Excel muss natürlich da installiert sein, wo PHP ausgeführt wird, also auf dem IPS bzw. Webserver. Aber nicht mehr auf dem PC, wo der Browser/Console läuft.
Tommi

@ Martin,

vielen Dank für deine EXCEL-Funktion - funktioniert.

Nun möchte ich z.B. meine Verbrauchwerte in eine Tabelle schreiben:

Zeile = letzteZeile +1
Spalte = 5 'Zählerstand
Sheets(„Strom-Verbrauch“).Cells(Zeile, Spalte).value = kWh

Wie muss der Funktionsaufruf dann aussehen?

MST

Hallo Herr Steiner, :wink:

ja OK…

Die erste Version ist etwas aus der Hüfte geschossen.

Also hier Version 2:


function write_to_Excel($filename, $Worksheet, $raw, $column, $string)
			{
			   //Einbinden der COM-Klasse für Excel
            $excel_app = new COM("Excel.application") or Die ("Did not connect");

				//Kontrolle der Datei
				if (file_exists($filename))
				{
					//öffnen einer bestehenden Excel-Datei
   	         $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
				}
				else
				{
					//Sonst -> Meldung
					echo "The file $filename does not exist";
					//und neu anlegen
					$Workbook = $excel_app->Workbooks->Add(); //neu
				}

				//zusammensetzen der Zelle
				$cell = $column.$raw;

				//Auswahl des Worksheet
				$Worksheet = $Workbook->Worksheets($Worksheet);
				//Aktivieren des Worksheet
				$Worksheet->activate;
				//Auswahl der Zelle
				$excel_cell = $Worksheet->Range($cell);
				//Aktivieren der Zelle
				$excel_cell->activate;
				//Schreiben der Stringinformation in die aktive Zelle
            $excel_cell->value = $string;

				//Kontrolle der Datei
				if (file_exists($filename))
				{
					//Speichern der bestehenden Datei
					$Workbook->Save;
				}
				else
				{
				   //Speichern der neuen Datei
					$Workbook->SaveAs($filename);
				}

				//Schliessen der Excel-Instanz und freigeben des Speichers
				//Willi wichtig!!!
				$Workbook->Close;
				unset($Worksheet);
				unset($Workbook);
				$excel_app->Workbooks->Close();
				$excel_app->Quit();
				unset($excel_app);
			}

In deinem Fall dann die Einbindung ins Programm:


include("Com_Excel.php");

$filename = IPS_GetKernelDir()."meldungen\\ereignisse\\Verbrauch.xls";
$Worksheet = "Strom-Verbrauch";  //Option 1 -> Bitte sei Sicher das das Worksheet auch so heisst
$Worksheet = 1;  						//Option 2
$column = "E";                   //entspricht der Spalte 5
$raw = 10;
$string = "10kWh";               //oder $Verbrauch."kWh" -> oder einfach nur $Verbrauch

write_to_Excel($filename, $Worksheet, $raw, $column, $string);

Wie Du siehst bin ich angefangen die Funktionen für das COM-Interface zu Excel in einen separaten Script zu sammeln. Die Funktion read_from_excel werde ich nachreichen.

Ich war gestern feiern und meine Gedankengänge sind noch rech zähflüssig.
Wenn da noch Fehler sind -> Bitte mekkern -> wie gesagt bin verheiratet :wink:

Bis dann

Martin

Hallo alle zusammen,

wie versprochen das Gegenstück zu write_to_excel:


function read_from_Excel($filename, $Worksheet, $raw, $column)
			{
				//Kontrolle der Datei
				if (file_exists($filename))
				{
				   //Einbinden der COM-Klasse für Excel
	            $excel_app = new COM("Excel.application") or Die ("Did not connect");
					//öffnen einer bestehenden Excel-Datei
	            $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
					//Auswahl des Worksheets 1
					$Worksheet = $Workbook->Worksheets($Worksheet);
					//Aktivieren des Worksheet 1
					$Worksheet->activate;
					
					//zusammensetzen der Zelle
					$cell = $column.$raw;
					
					//Auswahl der Zelle
					$excel_cell = $Worksheet->Range($cell);
					//Aktivieren der Zelle
					$excel_cell->activate;
					//Lesen der Stringinformation aus der aktive Zelle
	            $string = $excel_cell->value;
					//Schliessen der Excel-Instanz und freigeben des Speichers
					//Willi wichtig!!!
					$Workbook->Close;
					unset($Worksheet);
					unset($Workbook);
					$excel_app->Workbooks->Close();
					$excel_app->Quit();
					unset($excel_app);

				}
				else
				{
					//Sonst -> Meldung
					$string = "The file $filename does not exist";
				}
				
				//Ausgeben der Information
				return $string;
			}

Ich habe es oben schon mal gesagt. Die beiden Funktionen lesen/schreiben nur eine Zelle. Um mehrere Zellen zu lesen/schreiben können die Funktionen sicherlich benutzt werden. Es macht aber kein Sinn!!!

Als Beispiel:

Schreiben von Ereignissen Datum / Uhrzeit / Ereignis → also 3Zellen.

Als erstes write_event (Beispiel zum schreiben mehrere Zellen)


function write_event($string)
			{

				//Ort der Datei (Ereignisse)
            $filename = IPS_GetKernelDir()."meldungen\\ereignisse\\ereignisse.xls";
				//Laden der letzten Meldenummer
				$raw = GetValueInteger(37387 /*[.Meldungen\iEventCountMax]*/);
				//Meldenummer inkrementieren und ablegen
				$raw++;
				SetValueInteger(37387 /*[.Meldungen\iEventCountMax]*/, $raw);

				//Zelle für das Datum
				$CellDate = "A".(string) $raw;
				//Zelle für die Uhrzeit
				$CellTime = "B".(string) $raw;
				//Zelle für das Ereignis
				$CellString = "C".(string) $raw;

				//Generieren des aktuellen Datums
				$EventDate = Date("d.m.Y");
				//Generieren der aktuellen Zeit
				$EventTime = Date("H|i|s");

			   //Einbinden der COM-Klasse für Excel
            $excel_app = new COM("Excel.application") or Die ("Did not connect");

				//Kontrolle der Datei
				if (file_exists($filename))
				{
					//öffnen einer bestehenden Excel-Datei
   	         $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
				}
				else
				{
					//Sonst neu anlegen
					$Workbook = $excel_app->Workbooks->Add(); //neu
				}

				//Auswahl des Worksheets 1
				$Worksheet = $Workbook->Worksheets(1);
				//Aktivieren des Worksheet 1
				$Worksheet->activate;

				//############## Schreiben des Datum's ###################

				//Auswahl der Zelle
				$excel_cell = $Worksheet->Range($CellDate);
				//Aktivieren der Zelle
				$excel_cell->activate;
				//Schreiben der Stringinformation in die aktive Zelle
            $excel_cell->value = $EventDate;

				//############## Schreiben der Uhrzeit ###################

				//Auswahl der Zelle
				$excel_cell = $Worksheet->Range($CellTime);
				//Aktivieren der Zelle
				$excel_cell->activate;
				//Schreiben der Stringinformation in die aktive Zelle
            $excel_cell->value = $EventTime;

				//############ Schreiben des Ereignisses #################

				//Auswahl der Zelle
				$excel_cell = $Worksheet->Range($CellString);
				//Aktivieren der Zelle
				$excel_cell->activate;
				//Schreiben der Stringinformation in die aktive Zelle
            $excel_cell->value = $string;

				//Kontrolle der Datei
				if (file_exists($filename))
				{
					//Speichern der bestehenden Datei
					$Workbook->Save;
				}
				else
				{
				   //Speichern der neuen Datei
					$Workbook->SaveAs($filename);
				}

				//Schliessen der Excel-Instanz und freigeben des Speichers
				//Willi wichtig!!!
				$Workbook->Close;
				unset($Worksheet);
				unset($Workbook);
				$excel_app->Workbooks->Close();
				$excel_app->Quit();
				unset($excel_app);
				
				//Anzahl der Meldungen die gelesen werden sollen
				$counts = 25;
				//Startpunkt des Meldepointers
				$akt_Number = $raw - $counts +1;
				if($akt_Number <= 0)
				{
	  				$akt_Number = 1;
				}
				//Auslesen der Meldungen
            $EventAnzeige = read_Event($akt_Number, $counts);
            //Ausgeben der Meldungen
            SetValueString(24081 /*[.Meldungen\strEventAnzeige]*/, $EventAnzeige);
			}

Als zweite read_event (Beispiel zum lesen mehrere Zellen)


function read_Event($raw, $counts)
			{

				//Ort der Datei (Ereignisse)
            $filename = IPS_GetKernelDir()."meldungen\\ereignisse\\ereignisse.xls";

				//Kontrolle der Datei
				if (file_exists($filename))
				{

				   //Einbinden der COM-Klasse für Excel
	            $excel_app = new COM("Excel.application") or Die ("Did not connect");
					//öffnen einer bestehenden Excel-Datei
	            $Workbook = $excel_app->Workbooks->Open("$filename") or Die("Did not open $filename $Workbook");
					//Auswahl des Worksheets 1
					$Worksheet = $Workbook->Worksheets(1);
					//Aktivieren des Worksheet 1
					$Worksheet->activate;

					//aktuelle Fehlernummer die eingelesen werden soll
					$akt_Number = $raw;
					$max_Number = $raw + $counts - 1;

               $string = "";

					while($akt_Number <= $max_Number)
					{
						//Zelle für das Datum
						$CellDate = "A".(string) $akt_Number;
						//Zelle für die Uhrzeit
						$CellTime = "B".(string) $akt_Number;
						//Zelle für das Ereignis
						$CellString = "C".(string) $akt_Number;

						//############## Lesen des Datum's ###################

						//Auswahl der Zelle
						$excel_cell = $Worksheet->Range($CellDate);
						//Aktivieren der Zelle
						$excel_cell->activate;
						//Lesen der Stringinformation aus der aktive Zelle
		            $Datum = (string) $excel_cell->value;

						//############## Lesen der Uhrzeit ###################

						//Auswahl der Zelle
						$excel_cell = $Worksheet->Range($CellTime);
						//Aktivieren der Zelle
						$excel_cell->activate;
						//Lesen der Stringinformation aus der aktive Zelle
		            $Uhrzeit = (string) $excel_cell->value;

						//############ Lesen des Ereignisses #################

						//Auswahl der Zelle
						$excel_cell = $Worksheet->Range($CellString);
						//Aktivieren der Zelle
						$excel_cell->activate;
						//Lesen der Stringinformation aus der aktive Zelle
		            $Event = $excel_cell->value;

						//zusammensetzen der Meldung
						$string = $string.$Datum."  ".$Uhrzeit."   ".$Event."
";

						//aktuelle Nummer inkrementieren
                  $akt_Number++;
					}
					
					//Schliessen der Excel-Instanz und freigeben des Speichers
					//Willi wichtig!!!
					$Workbook->Close;
					unset($Worksheet);
					unset($Workbook);
					$excel_app->Workbooks->Close();
					$excel_app->Quit();
					unset($excel_app);

				}
				else
				{
					//Sonst -> Meldung
					$string = "The file $filename does not exist";
				}

				//Ausgeben der Information
				return $string;
			}

Wie gesagt -> wieder nur Beispiele die in diesem Fall auf das erste Worksheet zugreifen.

Und eines zum Schluss:

Excel ist weit verbreitet. Man kann einige Schandtaten damit anstellen.
Excel hat aber seine Grenzen. Eine professionelle Datenbank wie MySQL kann damit nicht ersetzt werden!

Wer sich aber gut mit Excel auskennt (und dazu zähle ich mich bestimmt nicht). Kann mithilfe des COM-Interface eine ganze Menge machen. Und ich bin mir sicher dass der eine oder andere das COM-Interface (zu mindestens zu den Office-Anwendungen) auf die Dauer lieb gewinnt.

Bis dann

Martin

@Martin,

vielen Dank - so weit so gut.

Logischerweise darf die Tabelle nicht geöffnet sein.
Meine „Notlösung für Helden“: ich habe mit ZWEI Tabellen angelegt.
Die erste dient der Kommunikation mit IP-Symcon: IPS_io.xlsm - diese bleibt geschlossen.
Die zweite „MeinHausVerbrauchswerte.xlsm“ - damit mache ich „all die schönen Sachen“ wie Tabellen, Statistiken, 3D-Grafiken usw.

Damit alles „frisch bleibt“:
ActiveWorkbook.UpdateLink Name:=„C:\Program Files\IPS_20\IPS_io.xlsm“, Type:=xlExcelLinks

Oder lässt sich es eleganter lösen?

MST

PS: leider können keine Verknüpfungen mit: read_from_excel gelesen werden

Hallo Steiner,

genau

hört sich gut an

kapier ich nicht. Steht das irgendwo in Excel? Kannst Du das genauer erklären? Möchte auch Held werden. :wink:

Eine Bitte zum Schluss:

Kannst Du mir als PHP-Experte mal auf die Sprünge helfen? Ich verstehe das Error-Handling in PHP noch nicht. Das Problem ist, wenn man ein Fehler bei der Parameterübergabe zu write_to_excel bzw. read_from_excel macht (als Beispiel falsches Worksheet) wird das Script abgebrochen. Ich muss aber in diesem Fall noch die Excel-Instanz schließen. Andernfalls kann es passieren dass dein Speicher mit Excel-Instanzen vollläuft.

Bis dann

Martin

„php error handler“ bei Google führt Dich zur korrekten Funktion: PHP: set_error_handler - Manual.

Du mir als PHP-Experte

da bist Du bei mir leider völlig falsch - vielleicht können ein gewisser „p“ oder „H“ :wink: aus diesem Forum Dir darauf eine Antwort geben helfen.

Eine Verknüpfung kann man mit o.g. Skript / Makro aktualisieren.

MST

PS: folgendes VB-Skript (Tabelle A) schaufelt Werte aus von eine Zelle (B7) der Tabelle A in fortlaufende Zellen (also immer eine neue Zeile) der Tabelle B (C > 2,3,4,5,6, usw)

Private Sub Worksheet_Change(ByVal Target As Excel.Range)
   If Target.Row = 7 And Target.Column = 2 Then
      vZlast = 0
      Do ' letzte Zeile finden
         vZlast = vZlast + 1
      Loop Until Sheets("B").Cells(vZlast + 1, 3) = ""
      Zeile = vZlast + 1   ' letzte plus 1
      ' // MsgBox "Zeile :" & Zeile
      wert = Sheets("A").Cells(7, 2)
      Sheets("B").Cells(Zeile, 3) = wert
   End If
End Sub

excel_verk_akt.png

Hallo Horst,

Ich hatte diesen Beitrag gefunden aber nicht verstanden.
Wenn ich nun mit „set_error_handler“ das Error-Handling umstelle,
wird dann bei jedem Fehler in das angegebene Script gesprungen?

Und was noch viel wichtiger ist, springen danach alle Skripte in den neuen Handler?

Wie stelle ich auf das ursprüngliche händling zurück?

Für deine Mühen besten Dank

Bis dann

Martin