[gelöst]Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 17:37

Hallo zusammen,

ich hab mir das WhitePaper von MS zu den Style Sheets heruntergeladen und die Übungsbeispiele gut nachvollziehen können.
Um eine neues Style Sheet zu erzeugen, habe ich als Basis ContactLetterToWord.xslt verwendet. Anhand dieser Datei und
dem WhitePaper konnte ich herausfinden, wie neue Felder in XML Schreibweise dem neuen Style Sheet hinzugefügt werden
müssen.

Großes Problem: ausser der Standardvorlage NavisionFormToExcel.xslt gibt es leider keine speziellen, an eine Form angespassten
Style Sheets. Und deswegen hab ich keine Ahnung, wie die Syntax bei einem neuen Style Sheet für Excel sein müsste,
um Felder zu definieren.

Wisst ihr, ob es irgendein Style Sheet, z.B für Form 21,das auch schon in der CU 403 ausprogrammiert ist,
zum downloaden gibt, um so die Style Sheet Technik für Excel etwas studieren zu können?
Zuletzt geändert von Gollum83 am 29. Januar 2009 18:32, insgesamt 1-mal geändert.

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 17:54

Hast du das Stylesheet Tool von MS schon mal ausprobiert? Ist evtl. einfacher ...

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 18:04

geht nur für word. das ist das große problem.
wenn ich bei excel wüsste, wie ich die felder hinzufügen kann, würds passen.
ich bin nicht editorscheu....

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 18:08

Gollum83 hat geschrieben:ich bin nicht editorscheu....


Dann erstell dir am besten in Excel eine Vorlage mit Platzhaltern, speichere Sie als XML-Dokument und schau da rein.

Du musst dann eigentlich nur den Kopf so umbauen, dass aus dem XML-Dokument ein XSL-Stylesheet wird und an den fraglichen Stellen z.B. mit <xsl:value-of ... /> und ggf. XSL-Schleifen die Platzhalter befüllen.

Beste Grüße
Falk

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 18:22

Hallo Falk

das klingt interessant.
Danke für den Tip.
Sobald ich näheres weiß, werd ichs posten.

Gruß
Gollum

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 18:36

Hallo Gollum83,

wenn du bei der Gelegenheit auch noch herausfindest wie man dem Stylesheet beibringt Numerische- und Datums- Felder auch als solche an Excel zu übergeben wäre das sehr schön. Denn mit den Standard Stylesheets, weder aus der Addon-DB noch aus der Standard-DB ( die bringt noch lustigere Ergebnisse) funktioniert das leider nicht wirklich :roll:.

Gruß, Fiddi

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 19:47

fiddi hat geschrieben:Hallo Gollum83,

wenn du bei der Gelegenheit auch noch herausfindest wie man dem Stylesheet beibringt Numerische- und Datums- Felder auch als solche an Excel zu übergeben wäre das sehr schön. Denn mit den Standard Stylesheets, weder aus der Addon-DB noch aus der Standard-DB ( die bringt noch lustigere Ergebnisse) funktioniert das leider nicht wirklich :roll:.

Gruß, Fiddi


Das grundsätzliche Problem dabei ist, dass NAV in das Daten-XML-Dokument keine Datentypen ausgibt, sondern nur die Feldtypen der Form, also z.B. TextBox, CheckBox, Label, etc. Man muss also ein Datum rein an seiner Notation erkennen, dazu aber mehr in "deinem" Fred.

EDIT:
Seit SP1 werden auch die Datentypen ausgegeben. Beachte aber diesen Beitrag von fiddi


Beste Grüße
Falk
Zuletzt geändert von FAFL am 29. Januar 2009 17:35, insgesamt 2-mal geändert.

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

28. Januar 2009 20:29

Hallo FAFL,

wenn du dir mal das Stylesheet der Addon-DB anschaust, dann wird du erkennen, das es dort einen subtype gibt,das auch den Wert 'number' kennt. Leider scheint NAV das Stylesheet nicht zu verstehen, geschweige denn den Wert zu füllen :roll:. Deine gepostete Änderung zu meinem Thread funktioniert jetzt nämlich jetzt genauso, wie das Stylesheet aus der Addon. Leider liefert es Dezimalwerte mit '.' als Dezimaltrenner, sodass Excel damit nicht rechnen kann.


Gruß, Fiddi

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 09:38

Hallo zusammen,

jetzt hab ich bei Euren Beiträgen was von einer Addon DB gelesen und hab mir diese voller Erwartungen angesehen,
leider auch hier keine anderen Excel Style Sheets....

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 09:46

Hallo Gollum83,

es gibt auch in der Addon nur ein Standard-Excel-Stylesheet. Das unterscheidet sich aber von der entsprechenden XSLT in der Standard DB, wie du in meinem Thread sehen kannst.

Gruß, Fiddi

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 10:02

Hallo fiddi

ok, verstehe.Danke

Gruß
Gollum

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 10:46

Hallo Natalie,

Danke für Deinen Heinweis.
Ich weiß, mach ich auch immer.
Nur ist das eigentliche Problem noch nicht gelöst.

Gruß
Gollum

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 11:12

Hallo Martin,

ein wirklich aussagekräftiges Demostylesheet für Excel scheint es ja nicht zu geben, aber es gibt für Office 2003 einige XML-Referenz-Schemata, die dir zumindest verraten können, wie ein XML-Dokument für Excel aufgebaut werden muss.

In der W3-Schule findest du außerdem eine kurze Referenz zu XSL(T) oder auch XPath.

Schau dir das mal an. Bei spezifische Fragen kann ich dir dann sicher weiterhelfen.

Beste Grüße
Falk
Zuletzt geändert von FAFL am 29. Januar 2009 17:45, insgesamt 1-mal geändert.

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 12:40

Hallo FAFL,

nochmals Danke.
Ich bin grad dabei die Tutorials bei w3schools durchzuschauen.
Ist sehr interessant, jedoch wollte ich gar nicht so tief einsteigen.

Bei den Wordvorlagen befindet sich der Datenteil in "output-section-properties".
Dieser Teil ist sowohl bei der allgemeinen Vorlage, als auch bei der Debitorvorlage.

Ich weiß jedoch nicht, wo der Datenteil in der Excel Vorlage ist.

Ich hab mir zum Test eine einfache Tabelle mit 2 Feldern gebaut, und mein Ziel wäre, dies in einer eigenen Vorlage
nach Excel zu bringen. in dieser Vorlage sollen die 2 Felder fest angegeben werden. Sonst ist kein Schnickschnack vonnöten.

Ich hab schön langsam so einen Hass auf MS....

Gruß
Gollum

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 14:45

Hallo Martin,

output-body und output-section-properties sind benannte Templates (vgl. Funktionen - nicht Trigger - in einem Report), die das Grundgerüst des XML-Word-Dokuments aufbauen:

Code:
   <xsl:template name="output-body">
      <w:body>
         <xsl:call-template name="output-section-properties"/>
      </w:body>
   </xsl:template>


Das Template "output-body" schreibt also ein Starttag "<w:body>" in das XML-Word-Dokument, ruft dann das Template "output-section-properties" und schreibt schließlich noch ein Endetag "</w:body>".

Da ein XML-Excel-Dokument einen anderen Aufbau hat als ein XML-Word-Dokument, kannst du dir diese beiden Templates schonmal sparen.

Dann fangen wir jetzt mal an, dein Stylesheet für Excel der Reihe nach aufzubauen und dabei gleich mit einem NAV-Report zu vergleichen:

1. Das Grundgerüst:
Code:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:o="urn:schemas-microsoft-com:office:office"
   xmlns:x="urn:schemas-microsoft-com:office:excel"
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
   xmlns:html="http://www.w3.org/TR/REC-html40">

   <xsl:output method="xml" encoding="UTF-8" standalone="yes" />
   ...
</xsl:stylesheet>

Die erste Zeile gehört grundsätzlich in jedes XML-, XSL(T)-, XSD- und sonstige Dokumente, die zur XML-Sprachfamilie gehören. Einzige Außnahme könnten DTDs sein. Das weiß ich nicht sicher, aber die benutzt auch fast niemand mehr, weil es dafür die XSDs gibt.
Das Attribut "version" ist immer anzugeben und die version ist bisher immer 1.0, denn es gibt zur Zeit noch kein XML in Version 2 oder sowas.
Das Attribut "encoding" ist optional.

Die "zweite Zeile" - hier Zeilen 2 bis 7 - eröffnen das Stylesheet und geben diverse Namespaces an, in denen die Menge der verwendbaren Elemente im Ergebnis-XML-Dokument definiert wird. Das hab ich mir natürlich aus den Standard-Stylesheets kopiert. Wenn man die Standard-Excel-Stalesheets mit denen für Word vergleicht, sieht man, dass es hier im Detail Unterschiede gibt, XML-Dokumente für Word und Excel also unterschiedlich aufgebaut sind.

Das Element <xsl:output> ist optional. Durch das method-Attribut kann z.B. die Ausgabe als Text angegeben werden. So ist es auch möglich, Daten via Stylesheet in z.B. ein EDIFACT-Format auszugeben. Wir verwenden natürlich als Ausgabe-Methode XML, was den Vorteil mit sich bringt, dass das resultierende XML-Dokument seine "<?xml version="1.0" ... ?>"-Deklaration automatisch bekommt.

An Stelle der drei Punkte werden im nächsten Schritt die Templates zur Verarbeitung des XML-Dokuments platziert.

Schließlich wird das Stylesheet beendet durch das schließende Tag </xsl:stylesheet>.

2. Das Basis-Template (OnInitReport)
Code:
   <xsl:template match="/">
      ...
   </xsl:template>

   ...
</xsl:stylesheet>

Das Basistemplate ist ein Template das in jedem Stylesheet enthalten sein sollte (oder auch muss, weiß ich grad nicht genau). Das Attribut match gibt an, für welches XML-Element ein Template greift, hier "/", also für das XML-Dokument an sich.

Innerhalb eines Template kann einfach Text ausgegeben aber auch XSL-Anweisungen ausgeführt werden. Im einfachsten Fall setzt man in das Basistemplate den Aufruf <xsl:apply-templates />, dadurch werden einfach alle Elemente des XML-Dokuments in Ihrer Rangfolge abgearbeitet, indem die Templates für die einzelnen Elemente aufgerufen werden. Ergänzt man diesen Aufruf um den Parameter select, so kann man gezielt die Rangfolge des XML-Dokuments ignorieren und die Abarbeitungsreihenfolge selbst steuern, wir sagen also
Code:
      <xsl:apply-templates select="Object" />


3. Das Template für das Wurzelelement "Object" (OnPreReport)

Nachdem wir im Basistemplate ein Template aufrufen, welches das Wurzelelement "Objekt" triggert, müssen wir dieses Template nun auch bauen:
Code:
   <xsl:template match="Object">
      ...
   </xsl:template>

Jetzt ist der Zeitpunkt gekommen, da wir uns mit der Struktur eines für Excel verständlichen XML-Dokuments auseinandersetzen müssen. Dazu können wir uns entweder das Standard-Dokument ansehen und raten oder wir sehen uns die passende XML-Schema-Definition an, die wir in der excelss.xsd des o.g. Pakets finden. Da steht im Wesentlichen folgendes drin:
Code:
   <xsd:element name="Workbook">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element ref="o:SmartTagType" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element ref="o:DocumentProperties" minOccurs="0" />
            <xsd:element ref="o:CustomDocumentProperties" minOccurs="0" />
            <xsd:element ref="o:OfficeDocumentSettings" minOccurs="0" />
            <xsd:element ref="x:ExcelWorkbook" minOccurs="0" />
            <xsd:element name="Styles" minOccurs="0">
               ...
            </xsd:element>
            <xsd:element name="Names" type="NamesType" minOccurs="0">
               ...
            </xsd:element>
            <xsd:element name="Worksheet" type="WorksheetType" minOccurs="0" maxOccurs="unbounded">
               ...
            </xsd:element>
            <xsd:element ref="x:PivotCache" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element ref="x:Name" minOccurs="0" />
            <xsd:element ref="x2:MapInfo" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element ref="x2:Binding" minOccurs="0" maxOccurs="unbounded" />
            <xsd:element ref="c:ComponentOptions" minOccurs="0" />
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>

Das Wurzelelement des Zieldokuments heißt also "Workbook" und beinhaltet eine Sequenz aus verschiedenen Kindelementen. Diese Kindelemente haben alle die Eigenschaft minOccurs="0", sind also optional. Aus dem Standard-Dokument lässt sich herauslesen, dass für uns zunächst das Element "Worksheet" interessant ist. Ebenfalls erkennen wir, dass ein Worksheet für jedes TAB der Form erzeugt werden soll, also für jedes XML-Element Control mit dem Attribut type='TabControl'. Also werden auch wir zunächst nur das Workbook erzeugen und die Worksheets für jedes TAB in eigenen Templates generieren:
Code:
    <xsl:template match="Object">
      <Workbook
         xmlns="urn:schemas-microsoft-com:office:spreadsheet"
         xmlns:o="urn:schemas-microsoft-com:office:office"
         xmlns:x="urn:schemas-microsoft-com:office:excel"
         xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
         xmlns:html="http://www.w3.org/TR/REC-html40">
         
         <xsl:apply-templates select="./Control" />
      </Workbook>
   </xsl:template>

Das Standard-Stylesheet verwendet zwar <xsl:call-template ... />, aber das kann man sich selbst überlegen, was wohl eleganter ist.

... Fortsetzung folgt ...
Zuletzt geändert von FAFL am 29. Januar 2009 18:13, insgesamt 3-mal geändert.

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 15:31

Hallo FAFL,

einfach genial. Woher weisst Du das alles....?

Es muss ja eigentlich auch sein, dass Excel eine andere Struktur hat, als Word.
Also wenn ich Dir richtig folgen konnte, sind wir jetzt bei dem Bereich, wo durch die Tabs gegengen wird?

Danke Dir vielmals an dieser Stelle.
Wenn Du mit dem Rest fertig bist, wäre doch dieser Thread etwas für die Navision24.de Seite.

Gruß
Gollum

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 17:09

4. Worksheets und TabControls
Code:
   <xsl:template match="Control[@type='TabControl']">
      <xsl:apply-templates select="./Control" />
   </xsl:template>

Die Elemente des von NAV erzeugten Daten-XML-Dokuments heißen meistens einfach Control und werden durch das Attribut type unterschieden. Dem tragen wir Rechnung, indem wir unserem Template zwar sagen, dass es Elemente mit Namen Control triggern soll, aber mit der Einschränkung, dass das Attribut Type den Wert "TabControl" haben soll.
Code:
match="Control[@type='TabControl']"

Da die einzelnen TABs in diesem Control zusammengefasst sind, muss unser TabControl-Template nichts weiter tun, als die Templates für die Kindelemente aufzurufen, die wir im nächsten Schritt "entwickeln".

Code:
   <xsl:template match="Control[@type='TabPage']" >
      <Worksheet xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <Table>
            <xsl:apply-templates select="Row" />
         </Table>
      </Worksheet>
   </xsl:template>


5. Die Tabellenzeilen oder Felder in der Form
Die Felder einer (Karten-)Form sind ja bekanntlich in Zeilen und Spalten angeordnet, also werden sie von NAV als Zeilen und Zellen (Spalten in der Zeile) ausgegeben.
Code:
   <xsl:template match="Row">
      <Row xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:apply-templates select="Control" />
      </Row>
   </xsl:template>

Wir schreiben also für jede NAV-Zeile eine Excel-Zeile, also ein XML-Element mit Namen Row und überlassen wieder die weitere Verarbeitung den speziellen Templates (Triggern).

Jetzt unterscheiden wir wieder die Control-Elemente anhand des Attributes Type und zwar unterscheiden wir Type='Label' und Type='TextBox'. Es gibt zwar noch weitere Werte für Type wie z.B. Checkbox aber da die Templates analog aufzubauen sind, verzichte ich hier auf diese Vollständigkeit.
Code:
   <xsl:template match="Control[@type='Label']">
      <Cell xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:attribute name="ss:StyleID">Label</xsl:attribute>
         <Data>
            <xsl:attribute name="ss:Type">String</xsl:attribute>
            <xsl:value-of select="@value"/>
         </Data>
      </Cell>
   </xsl:template>
   
   <xsl:template match="Control[@type='TextBox']">
      <Cell xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:attribute name="ss:StyleID">TextBox</xsl:attribute>
         <Data>
            <xsl:attribute name="ss:Type">String</xsl:attribute>
            <xsl:value-of select="@value"/>
         </Data>
      </Cell>
   </xsl:template>

Wir sehen, dass die Templates im wesentlichen das gleiche tun, sie schreiben jeweils eine Zelle (Cell), geben dieser ein Style-Attribut und schreiben die Daten (Data) widerum mit einem Style-Attribut, das die Formatierung (Standard, Zahl, Datum) festlegt.

Der einzige Unterschied zwischen den Templates ist das Style-Attribut der Zelle.

6. Die Styles
An dieser Stelle fällt uns unser Leichtsinn auf die Füße, optionale Elemente erstmal wegzulassen.

Wir unterscheiden zwar die einzelnen Zellen durch ihr Style-Attribut, haben Excel aber noch garnicht verraten, wie die Styles aussehen sollen, was wir im Element Styles (Kindelement von Workbook) hätten tun sollen. Also holen wir das jetzt nach und erstellen ein benanntes Template. Weil wir faul sind, kopieren wir uns einfach die passenden Zeilen aus dem Standard-Stylesheet:
Code:
   <xsl:template name="output-Styles">
      <Styles xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <Style ss:ID="Label">
            <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
            <Font ss:FontName="Verdana" x:Family="Swiss" ss:Size="8" ss:Bold="1"/>
            <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
         </Style>
         <Style ss:ID="TextBox">
            <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
            <Font ss:FontName="Verdana" x:Family="Swiss"/>
         </Style>
      </Styles>
   </xsl:template>

Dieses Template müssen wir nur noch an der passenden Stelle ansprechen, also erweitern wir das Template für Object um den Aufruf:
Code:
    <xsl:template match="Object">
      <Workbook
         xmlns="urn:schemas-microsoft-com:office:spreadsheet"
         xmlns:o="urn:schemas-microsoft-com:office:office"
         xmlns:x="urn:schemas-microsoft-com:office:excel"
         xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
         xmlns:html="http://www.w3.org/TR/REC-html40">
         
         <xsl:call-template name="output-Styles" />
         
         <xsl:apply-templates select="./Control" />
      </Workbook>


7. Import und Test
Ein erster Import und Test wirft uns erneut unsere Nachlässigkeit vor die Füße.

Denn offenbar verlangt Excel für ein Worksheet zwingend einen Namen, so sagt es das Fehler-Protokoll, welches Excel erstellt. Also müssen wir das Template für die TabPages auch noch erweitern:
Code:
   <xsl:template match="Control[@type='TabPage']" >
      <Worksheet xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:attribute name="ss:Name">
            <xsl:value-of select="@caption"/>
         </xsl:attribute>
         <Table>
            <xsl:apply-templates select="Row" />
         </Table>
      </Worksheet>
   </xsl:template>


Damit sieht unser (ganz einfaches) Stylesheet wie folgt aus:
Code:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:o="urn:schemas-microsoft-com:office:office"
   xmlns:x="urn:schemas-microsoft-com:office:excel"
    xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
   xmlns:html="http://www.w3.org/TR/REC-html40">

   <xsl:output method="xml" encoding="UTF-8" standalone="yes" />
   
   <xsl:template match="/">
      <xsl:apply-templates select="Object" />
   </xsl:template>

    <xsl:template match="Object">
      <Workbook
         xmlns="urn:schemas-microsoft-com:office:spreadsheet"
         xmlns:o="urn:schemas-microsoft-com:office:office"
         xmlns:x="urn:schemas-microsoft-com:office:excel"
         xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
         xmlns:html="http://www.w3.org/TR/REC-html40">
         
         <xsl:call-template name="output-Styles" />
         
         <xsl:apply-templates select="./Control" />
      </Workbook>
   </xsl:template>
   
   <xsl:template match="Control[@type='TabControl']">
      <xsl:apply-templates select="./Control" />
   </xsl:template>

   <xsl:template match="Control[@type='TabPage']" >
      <Worksheet xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:attribute name="ss:Name">
            <xsl:value-of select="@caption"/>
         </xsl:attribute>
         <Table>
            <xsl:apply-templates select="Row" />
         </Table>
      </Worksheet>
   </xsl:template>

   <xsl:template match="Row">
      <Row xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:apply-templates select="Control" />
      </Row>
   </xsl:template>

   <xsl:template match="Control[@type='Label']">
      <Cell xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:attribute name="ss:StyleID">Label</xsl:attribute>
         <Data>
            <xsl:attribute name="ss:Type">String</xsl:attribute>
            <xsl:value-of select="@value"/>
         </Data>
      </Cell>
   </xsl:template>
   
   <xsl:template match="Control[@type='TextBox']">
      <Cell xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:attribute name="ss:StyleID">TextBox</xsl:attribute>
         <Data>
            <xsl:attribute name="ss:Type">String</xsl:attribute>
            <xsl:value-of select="@value"/>
         </Data>
      </Cell>
   </xsl:template>

   <xsl:template name="output-Styles">
      <Styles xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <Style ss:ID="Label">
            <Alignment ss:Horizontal="Left" ss:Vertical="Bottom" ss:WrapText="1"/>
            <Font ss:FontName="Verdana" x:Family="Swiss" ss:Size="8" ss:Bold="1"/>
            <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
         </Style>
         <Style ss:ID="TextBox">
            <Alignment ss:Horizontal="Left" ss:Vertical="Bottom"/>
            <Font ss:FontName="Verdana" x:Family="Swiss"/>
         </Style>
      </Styles>
   </xsl:template>
   
</xsl:stylesheet>


8. Forms mit Kopf und Zeilen
Bei Forms mit Kopf und Zeilen, wie z.B. Gebuchte Rechnungen fallen wir wieder auf die Nase, denn die Zeilen werden in einem Control vom Type "TableBox" abgelegt. Hier ist die Struktur nicht ganz so tief, wie bei TabControls. Anstelle von TabPages finden wir hier sofort die Zeilen. Da wir aber erst die TabPage-Elemente in Worksheet-Elemente übersetzen und in der Verarbeitung der TabControl-Elemente lediglich die Verarbeitung der Kindelemente aufrufen, wird das Stylesheet die Zeilen einer TableBox direkt in das Workbook und nicht in ein Worksheet schreiben. Da meckert Excel aber. Klingt jetzt erstmal sehr kompliziert, aber wenn man es sich ein wenig durchdenkt, wird es recht schnell klar.

Wir müssen also noch ein weiteres Template schreiben, um dieses Problem abzufangen:
Code:
   <xsl:template match="Control[@type='TableBox']">
      <Worksheet xmlns="urn:schemas-microsoft-com:office:spreadsheet">
         <xsl:attribute name="ss:Name">
            <xsl:variable name="TableBoxCaption">
               <xsl:value-of select="//Object/@caption"/>   
            </xsl:variable>
            <xsl:value-of select="substring($TableBoxCaption,1,30)"/>
         </xsl:attribute>
         <Table>
            <xsl:apply-templates select="Row" />
         </Table>
      </Worksheet>      
   </xsl:template>

Den Namen des Worksheet müssen wir in diesem Fall etwas anders ermitteln, da die TableBox kein Attribut "caption" besitzt. Auch hier kopieren wir einfach aus den Standard-Stylesheets.
Zuletzt geändert von FAFL am 29. Januar 2009 17:55, insgesamt 1-mal geändert.

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 17:40

Sehr schöner Beitrag bzw. Beiträge - Hut ab!!

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 18:31

Ich kann mich Natalie nur anschließen.
FAFL: Herzlichen Dank.

Nun weiß ich, was ich morgen machen werde : :mrgreen:

Gruß
Gollum

Re: [gelöst]Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 19:45

@FAFL

auch von mir noch mal herzlichen Dank für deinen Tip mit dem Abspeichern der XML-Daten in der Codeunit 403, sonst würde ich wahrscheinlich immer noch nach einer Lösung suchen, den 'Senden an' mit Excel zum laufen zu bringen.

Gruß, Fiddi

Re: Eigenes Excel Style Sheet für benutzerdef. Formular

29. Januar 2009 23:12

Gollum83 hat geschrieben:Hallo FAFL,

einfach genial. Woher weisst Du das alles....?


Erstmal danke für die Blumen. Um nun noch deine Frage zu beantworten, woher ich das alles weiß:

Ich weiß davon nicht allzu viel, die Sache ist nur, dass ich vor einigen Jahren mal eine Diplomarbeit geschrieben habe, die damit zu tun hatte. Seither hat sich zwar einiges geändert, aber das Konzept (version="1.0") ist ebenso geblieben wie die Quellen (w3schools.com). Daher fällt es mir leicht, die Standard-Stylesheets zu analysieren.

Re: [gelöst]Eigenes Excel Style Sheet für benutzerdef. Formular

30. Januar 2009 11:28

verstehe. Dann hattest Du quasi ein Heimspiel...
Ich wollte eigentlich gar nicht so tief in XML einsteigen,
aber ich muss schon sagen, dass es auf jeden Fall ein interessantes Gebiet ist.

Und die Tutorials bei w3schools sind echt gut, um sich in kurzer Zeit einen Überblick
über die jeweiligen Gebiete zu schaffen