Excel XML Dateiaufbau und Beschreibung ...

Von Ausgaben mit der Gra-Engine über Generatoren bis zum Export in diversen Formaten

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Excel XML Dateiaufbau und Beschreibung ...

Beitrag von brandelh »

Hallo,

ich habe jetzt eine Exportroutine für EINE EXCEL XML Datei erstellt:
1. Mit Excel die Datei formatiert und als XML gespeichert
2. die TEXT Datei mit meinem MED aufgeteilt in
  • Außendokument mit Platzhalter für WorkSheets
  • Worksheetmuster mit Platzhalter für Name und Tabelle
  • Tabellenmuster mit Platzhalter für Zeilen
  • Zeilenmuster mit Platzhalter für Variablen
  • mit StrTran() die Platzhalter mit den Daten überschreiben und zusammen speichern.
Nun möchte ich aber die Formatierung anpassen und das geht etwas umständlich,
da bei Versuch und Irrtum dauernd XML Parserfehlermeldungen in ein geschütztes Systemverzeichnis gestellt werden...

Weiß jemand wo man eine Beschreibung für die einzelnen Anweisungen und Formate finden kann ?
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Excel XML Dateiaufbau und Beschreibung ...

Beitrag von brandelh »

Hi,

ich hatte das fälschlicherweise unter ActiveX, da hat es aber nichts zu suchen ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Excel XML Dateiaufbau und Beschreibung ...

Beitrag von AUGE_OHR »

hi,

kannst du damit was anfangen ?

Code: Alles auswählen

FUNC CopyToXls( cFile, aFieldNames, bFor, bWhile, nNext, aHeader, aColWidth, aTotal, aEmptyNumber, aFooter, lStart )
   LOCAL aSource, aFieldPos, nCount, nRecords, i := 0
   LOCAL aStyleNumber, aStyleDate, aStyleFields, aStyleFooter, aStyleHeader
   LOCAL nFile, xField, cType, cValue, aFieldHeader

   IF Valtype( aFieldNames ) <> "A"
      aFieldNames := {}
   ENDIF
   IF nNext == NIL
      nNext := LastRec()
   ENDIF
   aStyleNumber := { "s21", "Right",   "Standard" }
   aStyleDate   := { "s22", "Center",  "Short Date" }
   aStyleFields := { "s31", "#FFFF99", "Solid" }
   aStyleHeader := { "s41", "#0000FF", "1" }
   aStyleFooter := { "s42", "#0000FF", "6" }
   aSource := DbStruct()
   IF Len( aFieldNames ) == 0
      nCount    := Len( aSource )
      aFieldPos := Array( nCount )
      WHILE ++i <= nCount
         AAdd( aFieldNames, FieldName( i ) )
         aFieldPos[i] := i
      ENDDO
   ELSE
      nCount    := Len( aFieldNames )
      aFieldPos := Array( nCount )
      WHILE ++i <= nCount
         aFieldPos[i] := FieldPos( aFieldNames[i] )
      ENDDO
   ENDIF
   IF aFooter == NIL
      aFooter := { "" }
   ENDIF

   nFile := FCreate( cFile )
   IF nFile == -1
      RETURN NIL
   ENDIF
   FWrite( nFile,;
      '<?xml version="1.0" encoding="windows-1252"?>'+CRLF+;
      '<?mso-application progid="Excel.Sheet"?>'+CRLF+;
      '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"'+CRLF+;
      ' xmlns:o="urn:schemas-microsoft-com:office:office"'+CRLF+;
      ' xmlns:x="urn:schemas-microsoft-com:office:excel"'+CRLF+;
      ' xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"'+CRLF+;
      ' xmlns:html="http://www.w3.org/TR/REC-html40">'+CRLF )
   FWrite( nFile,;
      ' <Styles>'+CRLF+;
      '  <Style ss:ID="Default" ss:Name="Normal">'+CRLF+;
      '   <Alignment ss:Vertical="Bottom"/>'+CRLF+;
      '   <Borders/>'+CRLF+;
      '   <Font/>'+CRLF+;
      '   <Interior/>'+CRLF+;
      '   <NumberFormat/>'+CRLF+;
      '   <Protection/>'+CRLF+;
      '  </Style>'+CRLF+;
      '  <Style ss:ID="'+aStyleNumber[1]+'">'+CRLF+;
      '   <Alignment ss:Horizontal="'+aStyleNumber[2]+'"/>'+CRLF+;
      '   <NumberFormat ss:Format="'+aStyleNumber[3]+'"/>'+CRLF+;
      '  </Style>'+CRLF+;
      '  <Style ss:ID="'+aStyleDate[1]+'">'+CRLF+;
      '   <Alignment ss:Horizontal="'+aStyleDate[2]+'"/>'+CRLF+;
      '   <NumberFormat ss:Format="'+aStyleDate[3]+'"/>'+CRLF+;
      '  </Style>'+CRLF+;
      '  <Style ss:ID="'+aStyleFields[1]+'">'+CRLF+;
      '   <Interior ss:Color="'+aStyleFields[2]+'" ss:Pattern="'+aStyleFields[3]+'"/>'+CRLF+;
      '  </Style>'+CRLF+;
      '  <Style ss:ID="'+aStyleHeader[1]+'">'+CRLF+;
      '   <Font ss:Color="'+aStyleHeader[2]+'" ss:Bold="'+aStyleHeader[3]+'"/>'+CRLF+;
      '  </Style>'+CRLF+;
      '  <Style ss:ID="'+aStyleFooter[1]+'">'+CRLF+;
      '   <Font ss:Size="'+aStyleFooter[3]+'" ss:Color="'+aStyleFooter[2]+'"/>'+CRLF+;
      '  </Style>'+CRLF+;
      ' </Styles>'+CRLF )
   FWrite( nFile,;
      ' <Worksheet ss:Name="Folha1">'+CRLF+;
      '  <Table>'+CRLF )
   IF ValType( aColWidth ) == "A"
      FOR i := 1 TO Len( aColWidth )
         cType := ValType( FieldGet( aFieldPos[i] ) )
         FWrite( nFile,;
            '   <Column '+IIf(cType=="N",'ss:StyleID="'+aStyleNumber[1]+'" ',IIf(cType=="D",'ss:StyleID="'+aStyleDate[1]+'" ',''))+;
                          IIf(aColWidth[i]==NIL,'','ss:Width="'+LTrim(Str(aColWidth[i]))+'"')+'/>'+CRLF )
      NEXT
   ENDIF
   IF ValType( aHeader ) == "A"
      FOR i := 1 TO Len(aHeader)
         IF ValType( aHeader[i] ) == "C"
            FWrite( nFile,;
               '   <Row ss:StyleID="'+aStyleHeader[1]+'">'+CRLF+;
               '    <Cell><Data ss:Type="String">'+XmlEncode(ConvToAnsiCP(aHeader[i]))+'</Data></Cell>'+CRLF+;
               '   </Row>'+CRLF )
         ELSE
            aFieldHeader := aHeader[i]
         ENDIF
      NEXT
      FWrite( nFile,;    // Blank line
         '   <Row>'+CRLF+;
         '   </Row>'+CRLF )
   ENDIF
   FWrite( nFile, '   <Row'+IIf(Empty(aStyleFields),'',' ss:StyleID="'+aStyleFields[1]+'"')+'>'+CRLF )
   IF aFieldHeader == NIL
      aFieldHeader := aFieldNames
   ENDIF
   FOR i := 1 TO nCount
      FWrite( nFile, '    <Cell><Data ss:Type="String">'+ConvToAnsiCP(aFieldHeader[i])+'</Data></Cell>'+CRLF )
   NEXT
   nRecords := 0
   FWrite( nFile, '   </Row>'+CRLF )
   WHILE !EOF() .AND. nRecords <= nNext .AND. ( bWhile == NIL .OR. EVal( bWhile ) )
      IF bFor == NIL .OR. EVal( bFor )
         FWrite( nFile, '   <Row>'+CRLF )
         FOR i := 1 TO nCount
            xField := FieldGet( aFieldPos[i] )
            cType := ValType( xField )
            DO CASE
            CASE cType == "C"
               cType  := "String"
               cValue := XmlEncode( ConvToAnsiCP( xField ) )
            CASE cType == "N"
               IF xField <> 0.0 .OR. aEmptyNumber == NIL .OR. AScan( aEmptyNumber, i ) == 0
                  cType := "Number"
                  cValue := LTrim( Str( xField ) )
               ELSE
                  cType := "String"
                  cValue := ""
               ENDIF
            CASE cType == "D"
               cValue := DToS( xField )
               IF Empty( cValue )
                  cType := "String"
                  cValue := ""
               ELSE
                  cType := "DateTime"
                  cValue := Substr(cValue,1,4)+"-"+Substr(cValue,5,2)+"-"+Substr(cValue,7,2)+"T00:00:00.000"
               ENDIF
            CASE cType == "L"
               cType  := "String"
               cValue := IIf( xField, "T", "F" )
            OTHERWISE
               cType  := "String"
               cValue := "#ERRO#"
            ENDCASE
            FWrite( nFile, '    <Cell><Data ss:Type="'+cType+'">'+cValue+'</Data></Cell>'+CRLF )
         NEXT
         ++nRecords
         FWrite( nFile, '   </Row>'+CRLF )
      ENDIF
      DbSkip()
   ENDDO
   IF ValType( aTotal ) == "A"
      FWrite( nFile,;
         '   <Row>'+CRLF+;
         '    <Cell><Data ss:Type="String"></Data></Cell>'+CRLF+;
         '   </Row>'+CRLF )
      ++nRecords
      FWrite( nFile, '   <Row>'+CRLF )
      FOR i := 1 TO Len( aTotal )
         FWrite( nFile, '    <Cell ss:Index="'+LTrim(Str(aTotal[i]))+;
                        '" ss:Formula="=SUM(R[-'+LTrim(Str(nRecords))+']C:R[-2]C)"></Cell>'+CRLF )
      NEXT
      FWrite( nFile, '   </Row>'+CRLF )
   ENDIF
   FWrite( nFile,;    // Blank line
      '   <Row>'+CRLF+;
      '   </Row>'+CRLF )
   FOR i := 1 TO Len(aFooter)
      FWrite( nFile,;
         '   <Row ss:StyleID="'+aStyleFooter[1]+'">'+CRLF+;
         '    <Cell><Data ss:Type="String">'+XmlEncode(ConvToAnsiCP(aFooter[i]))+'</Data></Cell>'+CRLF+;
         '   </Row>'+CRLF )
   NEXT
   FWrite( nFile,;
      '  </Table>'+CRLF+;
      ' </Worksheet>'+CRLF+;
      '</Workbook>'+CRLF )
   FClose( nFile )
   IF lStart == NIL .OR. lStart
      StartFile( cFile )
   ENDIF
RETURN NIL

FUNC XmlEncode( cStr )
RETURN StrTran( StrTran( StrTran( Trim(cStr), "&", "&" ), "<", "<" ), ">", ">" )

PROC StartFile( cFile, cParam, cDir )
   IF cParam == NIL; cParam := ""; ENDIF
   IF cDir   == NIL; cDir   := ""; ENDIF
*  IF M->terminalServices
*     AlertaOk( "Em acesso remoto nÆo ‚ possivel abrir"+CR+cFile )
*     RETURN
*  ENDIF
   DllCall( "SHELL32.DLL", DLL_STDCALL, "ShellExecuteA",;
            AppDesktop():GetHWND(), "open", cFile, cParam, cDir, 1 )
RETURN
p.s. gibt es für oExcel:SaveAs() in der Office 2007 nicht eine XlFileFormat Konstante ?
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Excel XML Dateiaufbau und Beschreibung ...

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Weiß jemand wo man eine Beschreibung für die einzelnen Anweisungen und Formate finden kann ?
meinst du die XlFileFormat Konstanten ? wenn ja unter "FileFormat-Eigenschaft"
XlFileFormat kann eine der folgenden XlFileFormat-Konstanten sein.
xlCSV
xlCSVMSDOS
xlCurrentPlatformText
xlDBF3
xlDIF
xlExcel2FarEast
xlExcel4
xlAddIn
xlCSVMac
xlCSVWindows
xlDBF2
xlDBF4
xlExcel2
xlExcel3
xlExcel4Workbook
xlExcel5
xlExcel7
xlExcel9795
xlHtml
xlIntlAddIn
xlIntlMacro
xlSYLK
xlTemplate
xlTextMac
xlTextMSDOS
xlTextPrinter
xlTextWindows
xlUnicodeText
xlWebArchive
xlWJ2WD1
xlWJ3
xlWJ3FJ3
xlWK1
xlWK1ALL
xlWK1FMT
xlWK3
xlWK3FM3
xlWK4
xlWKS
xlWorkbookNormal
xlWorks2FarEast
xlWQ1
xlXMLSpreadsheet

Ausdruck.FileFormat

Hinweise
Einige dieser Konstanten stehen Ihnen, abhängig von der ausgewählten oder installierten Sprachunterstützung (z. B. Deutsch), möglicherweise nicht zur Verfügung.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Excel XML Dateiaufbau und Beschreibung ...

Beitrag von brandelh »

Hi,

die letzte Tabelle sagt mir nichts (für ActiveX ?), aber oben drüber, das sieht gut aus.
Allerdings vermisse ich einige Werte die bei mir hier für Ärger gesort haben:
z.B. was bedeutet das:

<Column ... ::ExpandedColumnCount das scheint keine Fehler zu verursachen, aber normalerweise steht hier die Anzahl der Spalten.
<Column ... ::ExpandedRowCount wenn hier weniger Zeilen stehen, als im Dokument sind, gibt es eine Fehlermeldung (Strukturfehler).
<Column ... ss:Span=... scheint die folgende Zeilen mit ::Index zu beeinflussen ... aber wie genau ?
<Column ... ss:AutoFitWidth="0"... schaltet wohl die Autofit für die Spalte aus, ob ="1" ein bedeuted ?

deine Funktion oben scheint das alles nicht zu brauchen, also muss man dies wohl nicht angeben.
Genau diese Infos (was braucht man, was nimmt man für was etc.), das ist es was ich wissen wollte.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Excel XML Dateiaufbau und Beschreibung ...

Beitrag von brandelh »

Hi,

google hilft mal wieder weiter ;-) 'urn:schemas-microsoft-com:office:excel' findet ...

http://msdn.microsoft.com/en-us/library ... e.10).aspx
http://msdn.microsoft.com/en-us/library ... e.10).aspx
Gruß
Hubert
Antworten