Laden...

XSLT: Leere Cells in Excel werden ignoriert

7 Antworten
1,642 Aufrufe
Letzter Beitrag: vor 15 Jahren
XSLT: Leere Cells in Excel werden ignoriert

verwendetes Datenbanksystem: <XSLT>

Hallo!

Folgendes Problem:
Ich exportiere Daten aus unerer Datenbank via XSLT in ein für Excel formatiertes xml. Dort soll der Benutzer dann Daten verändern/hinzufügen können.
Dieses XML lese ich dann wieder ein und mache die entsprechenden Änderungen in der Datenbank. Funktioniert auch alles, bis auf die Tatsache, dass beim anlegen einer neuen Row im Excel leere Zellen nicht ins xml übernommen werden...

Weiß jemand vielleicht wie/wo man das einstellen kann?

LG
empty

Hallo empty

die Frage wie man Excel (wenn überhaupt möglich) dazu bringt leere Zellen ebenfalls zu schreiben wäre wahrscheinlich im Office-Forum besser aufgehoben gewesen. Allerdings bezweifle ich dass man das Verhalten von Excel an der Stelle beeinflussen kann. Auch beim CSV Export lässt Excel leere Zellen grundsätzlich weg.

Warum handelst du das nicht selbst bei der Verarbeitung der Export-Datei?

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

Hi!
Ich habe gehoft, dass es im xslt irgendein Attribut gibt mit dem Excel dazu bringen kann...

Das Problem ist, dass ich keine Zuordnung der Daten zu meinen Variablen habe... nur die Reihenfolge in der die Nodes im XML stehen. Und wenn da nun welche fehlen kann ich nicht nachvollziehen welche das sind...

Hallo

Wie schon gesagt, ich glaube nicht dass sich Excel da beeinflussen lässt. Aber du kannst doch mit <xsl:if test="not(foo)">Do default handling</xsl:if> die Existenz eines Elements prüfen und entsprechend entscheiden ob du einen existierenden Wert verarbeitest oder ins Standard-Handling läufst.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

Der Export funktioniert, dh da bekomme ich das hinaus was ich haben will.

Das Problem ist nur das einlesen des XMLs nachdem es im Excel bearbeitet wurde.
Da habe ich dann kein xslt mehr sondern nur noch das XML wie es von Excel gespeichert wurde.


 <Table ss:ExpandedColumnCount="19" ss:ExpandedRowCount="3" x:FullColumns="1"
   x:FullRows="1" ss:StyleID="s62" ss:DefaultRowHeight="15">
   <Column ss:StyleID="s62" ss:Width="99.75" ss:Span="1"/>
   <Column ss:Index="3" ss:StyleID="s62" ss:Width="200.25" ss:Span="1"/>
   <Column ss:Index="5" ss:StyleID="s62" ss:Width="99.75"/>
   <Column ss:StyleID="s62" ss:Width="50.25" ss:Span="3"/>
   <Column ss:Index="10" ss:StyleID="s62" ss:Width="80.25"/>
   <Column ss:StyleID="s62" ss:Width="99.75" ss:Span="2"/>
   <Column ss:Index="14" ss:StyleID="s62" ss:Width="150"/>
   <Row ss:AutoFitHeight="0" ss:StyleID="s63" name="CaptionRow">
    <Cell ss:StyleID="s64"><Data ss:Type="String">ActionID</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">UserGivenActionID</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">ActionName</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">                   ActionName_en-GB</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">                   ActionName_de-AT</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">Code</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">StartDate</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">EndDate</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">CreationDate</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">LastModified</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">Status</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">ResponsibleUserName</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">CreatorName</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">LinkedActions</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">Date</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">Money</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">List</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">Text</Data></Cell>
    <Cell ss:StyleID="s64"><Data ss:Type="String">User</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0" ss:StyleID="s63">
    <Cell><Data ss:Type="String">itm00001</Data></Cell>
    <Cell><Data ss:Type="String"></Data></Cell>
    <Cell><Data ss:Type="String">InApp01</Data></Cell>
    <Cell><Data ss:Type="String">InApp01_englisch</Data></Cell>
    <Cell><Data ss:Type="String">InApp01_deutsch</Data></Cell>
    <Cell><Data ss:Type="String">imported</Data></Cell>
    <Cell><Data ss:Type="String">2010/01/11</Data></Cell>
    <Cell><Data ss:Type="String">2010/01/11</Data></Cell>
    <Cell><Data ss:Type="String">2010/01/11</Data></Cell>
    <Cell><Data ss:Type="String">2010/01/11</Data></Cell>
    <Cell><Data ss:Type="String">in Planung</Data></Cell>
    <Cell><Data ss:Type="String">Administrator</Data></Cell>
    <Cell><Data ss:Type="String">Administrator</Data></Cell>
    <Cell><Data ss:Type="String"></Data></Cell>
    <Cell><Data ss:Type="String">2010/01/11</Data></Cell>
    <Cell><Data ss:Type="String">2020.1</Data></Cell>
    <Cell><Data ss:Type="String">d;a;</Data></Cell>
    <Cell><Data ss:Type="String">imported</Data></Cell>
    <Cell><Data ss:Type="String">peter.müller;test2;</Data></Cell>
   </Row>
   <Row ss:AutoFitHeight="0">
    <Cell ss:Index="2"><Data ss:Type="String">1</Data></Cell>
    <Cell><Data ss:Type="String">a</Data></Cell>
   </Row>
  </Table>

Diese Datei lade ich mittels asp:uploader hoch und lese dann das Byte[] so ein:


var stream = new MemoryStream(file);
var xml = new XmlDocument();
xml.Load(stream);

Dann geh ich durch das XML und bau mir einen DataTable auf den ich befülle und dann auswerte.

Vielleicht gibt es da eine besser Lösung um das Problem zu umgehen...

LG

Hallo empty

Excel serialisiert immer alle Zellen einer Zeile bis innerhalb der Zeile keine Werte mehr kommen. Du kannst durch alle existierenden "Cell"-Elemente iterieren. Wenn du am Ende angekommen bist gelten alle Spalten welche nach der letzten vorhandenen Zelle Kommen als leer.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

Das mache ich auch.
Ich gehe durch alle Rows und pro Row durch alle Cells. Deren Text in Data schreibe in meinen "Buffer" DataTable.
Das Problem ist, dass die Zuordnung abhängig von der Reihenfolge ist...
Dh:
ActionID steht in der 1. Cell
UserGivenActionID in der 2.
... usw.

Wenn jetzt eines fehlt, verschiebt sich der rest und ich kann nicht nachvollziehen welches fehlt.

Habe aber jetzt entdeckt, dass Excel immer ein ss:Index Attribut setzt wenn etwas ausgelassen wird. Damit werde ich mir jetzt etwas bauen...