Mit Hilfe von PHP-COM-Objekt mit Office 2010 (Excel.Anwendung)
Ich vor kurzem codiert ein Skript in PHP über das COM-Objekt zu Streifen Daten aus Zellen in einer Excel 2007-Tabelle in ein array. Dies wurde alles getan, die lokal auf einem XP-system mit Office 2007. Nachdem ich aktiviert den Apache-server mit dem desktop interagieren die script funktionierte wie ein Traum, dass ich zum Auffüllen meiner HTML mit der array-Werte mittels PHP.
Jetzt haben wir nur ein Upgrade auf Win 7 x64 und Office 2010 32bit - Das gleiche Skript nun wirft mir einen COM_exception:
'Microsoft Excel kann keine access" die xml/xmlx Datei (es funktionierte für beide bisher). "Es gibt mehrere mögliche Gründe:
- Der name der Datei oder Pfad nicht vorhanden ist.
- Die Datei wird von einem anderen Programm verwendet.
- Die Arbeitsmappe, die Sie zu speichern versuchen, hat denselben Namen wie aktuell geöffneten Arbeitsmappe"... anscheinend.
Ich habe die Benutzerkontensteuerung deaktiviert denken, dass der übeltäter war und natürlich durfte der Apache mit dem desktop interagieren, aber ein Excel-Prozess nicht einmal den Versuch zu starten. Ich vermute, Windows 7 ist nicht so dass das Skript für die Interaktion mit Excel überhaupt. Es gibt weitere Skripte zur Verfügung, mit Hilfe von Klassen (z.B. PHPExcel) allerdings würde ich eher vermeiden, schreiben Sie die Empfänger-code, plus ich weiß gar nicht, ob die Klassen, die funktionieren würde für Excel 2010.
Wie kann ich das umgehen com_exception?
Code:
<?php
error_reporting(E_ALL);
function getDataFromExcel($file, $sheet, $rows, $cols)
{
//COM CREATE
fwrite(STDOUT, "----------------------------------------\r\n");
$excel = new COM("Excel.Application") or die ("ERROR: Unable to instantaniate COM!\r\n");
$excel->Visible = true; //so that we see the window on screen
fwrite(STDOUT, "Application name: {$excel->Application->value}\r\n") ;
fwrite(STDOUT, "Loaded version: {$excel->Application->version}\r\n");
fwrite(STDOUT, "----------------------------------------\r\n\r\n");
//DATA RETRIEVAL
$Workbook = $excel->Workbooks->Open($file) or die("ERROR: Unable to open " . $file . "!\r\n");
$Worksheet = $Workbook->Worksheets($sheet);
$Worksheet->Activate;
$i = 0;
foreach ($rows as $row)
{
$i++; $j = 0;
foreach ($cols as $col)
{
$j++;
$cell = $Worksheet->Range($col . $row);
$cell->activate();
$matrix[$i][$j] = $cell->value;
}
}
//COM DESTROY
$Workbook->Close();
unset($Worksheet);
unset($Workbook);
$excel->Workbooks->Close();
$excel->Quit();
unset($excel);
return $matrix;
}
//define inputs
$xls_path = "D:\\xampp\\htdocs\\path_to_document\\test.xls"; //input file
$xls_sheet = 1; //sheet #1 from file
$xls_rows = range(3, 20, 1); //I want extract rows 3 - 20 from test.xls with 1 row stepping
$xls_cols = array("B", "D", "E", "G"); //I want to extract columns B, D, E and G from the file
//retrieve data from excel
$data = getDataFromExcel($xls_path, $xls_sheet, $xls_rows, $xls_cols);
?>
<html>
<pre>
<?php print_r ($data);?>
</pre>
</html>
- Wie eine Allgemeine Punkt, wenn auch nicht unbedingt eine Lösung, PHPExcel kann Lesen/schreiben von xlsx-Dateien (generiert, ob die von Excel 2007 oder Excel 2010).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dein problem ist wahrscheinlich, dass der Apache keine Rechte für den DCOM-Komponente. Als admin öffnen DCOMCNFG.EXE. Browser für Computer -> Arbeitsplatz -> DCOM-Konfiguration und suchen Sie den "Microsoft Excel-Anwendung" - Komponente. Rechtsklick auf diese und wählen Sie "Eigenschaften", dann gehen Sie auf die Registerkarte "Sicherheit".
Bin ich ein bisschen fauler als ich wahrscheinlich sollte, so Neige ich dazu denenjenigen httpd Berechtigungen für alle drei Optionen zur Verfügung gestellt, anstatt die Mühe zu verstehen, wenn jeweils gilt. Setzen Sie den radio-button auf "Anpassen", und drücken Sie die Schaltfläche "Bearbeiten", Folgen Sie der Windows-standard-Dialogen für das hinzufügen von Berechtigungen für den Benutzer/die Rolle Ihrer httpd läuft.