Schick programmiert

Magento Fehler beim Öffnen des XML-Export

Ein Fehler, der beim Öffnen von bestimmten Magento-XML-Exporten auftritt, hat mich heute wieder beschäftigt.

Zuerst mal ein Beispiel, mit dem man das Problem nachvollziehen kann:

<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet">
	<Worksheet ss:Name="Sheet 1">
		<Table>
			<Row>
				<Cell>
					<Data ss:Type="String">sku</Data>
				</Cell>
				<Cell>
					<Data ss:Type="String">name</Data>
				</Cell>
			</Row>
			<Row>
				<Cell>
					<Data ss:Type="Number">40</Data>
				</Cell>
				<Cell>
					<Data ss:Type="String">Sample Product 40</Data>
				</Cell>
			</Row>
			<Row>
				<Cell>
					<Data ss:Type="Number"> 4021</Data>
				</Cell>
				<Cell>
					<Data ss:Type="String">Sample Product 4021</Data>
				</Cell>
			</Row>
		</Table>
	</Worksheet>
</Workbook>

In diesem Beispiel sieht man, dass der vorletzte Zellen-Inhalt als Nummer definiert ist, aber ein Leerzeichen enthält. Dies löst beim XML-Parser von Excel einen Fehler aus. Ist auch auf eine Weise ganz gut so – aber ich frag mich mehr warum das als Zahl definiert wurde …

Nach etwas Suchen kam ich auch bald dahinter, dass Magento diese Datei mit Hilfe des ConvertParsers Varien_Convert_Parser_Xml_Excel erzeugt.

 

        ...
        foreach ($row as $value) {
            $this->_xmlElement->row = htmlspecialchars($value);
            $value = str_replace($xmlHeader, '', $this->_xmlElement->asXML());
            $value = preg_replace($xmlRegexp, '\\1', $value);
            $dataType = "String";
            if (is_numeric($value)) {
                $dataType = "Number";
            }
            $value = str_replace("\r\n", '&#10;', $value);
            $value = str_replace("\r", '&#10;', $value);
            $value = str_replace("\n", '&#10;', $value);

            $xmlData[] = '<Cell><Data ss:Type="'.$dataType.'">'.$value.'</Data></Cell>';
        }
        ...

Nach der Definition auf php.net ist die ausgegebene XML-Datei auch vollkommen in Ordnung. Siehe: http://php.net/manual/de/function.is-numeric.php#16310

Nur erwartet Excel in der Zelle wirklich nur eine Nummer, wenn sie als Number definiert wurde.

Meine aktuelle Lösung besteht darin, dass ich die Zeile $dataType = “Number”; schlicht und ergreifend auskommentiere. Da ich nicht weiß, wie man diese Klasse überladen kann, hab ich den Core an dieser Stelle mal wieder abgeändert.

Eine bessere Lösung lässt sich aber vielleicht aus diesem Post erarbeiten: http://www.php.net/manual/de/function.is-int.php#95658
Bei diesem Post bin ich nur nicht damit einverstanden, dass eine Zahl wie 01233 auch als Number definert wird, da Excel die vorgestellte Null entfernen wird.

Dieses Problem habe ich bereits als Bug gepostet. Mal sehen wie lange diese Änderung braucht …
http://www.magentocommerce.com/bug-tracking/issue?issue=12209


Categorised as: Uncategorized


2 Comments

  1. Krunoslav sagt:

    Hallo,

    also ich war auch am Verzweifeln was diese Konvertierung angeht, nun ich habe bei meiner Magento Version 1.7.0.2 folgendes geändert: Ich habe einfach gesagt das alles in einen String Konvertiert werden soll –> Zahlen aller Art. DATEI:

    app/code/core/Mage/Dataflow/Model/Convert/Parser/Xml/Excel.php

    Zeile ca. 480

    Original:
    if (is_numeric($value)) {
    $value = trim($value);
    $dataType = ‘Number';
    } else {
    $dataType = ‘String';
    }

    Modifiziert:
    if (is_numeric($value)) {
    $value = (string)$value;
    $dataType = ‘String';
    } else {
    $dataType = ‘String';
    }

    • Simon Schick sagt:

      Vielen Dank für deine Rückmeldung und deine Problemlösung in Magento 1.7.0.2.

      Der Bug im Magento BugTracker konnte ich leider nicht mehr kommentieren. Ich habe leider nicht rechtzeitig geantwortet ;)

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>