Zum Inhalt springen

Wikipedia:Technik/Text/Basic/Excel2Wiki

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 4. September 2006 um 08:54 Uhr durch Physikr (Diskussion | Beiträge) (zusätzliche Version). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Hinweis: Diese Seite stammt ursprünglich von hier [1]. Damit eine schnellere Entwicklung möglich wird, die im Interesse aller Wikipedianer / Mediawiki-Benutzer ist, habe ich es getrost hier herkopiert. Ausserdem bin ich selbst Urheber des Makro. --AlrikOhnegrund

Nicht ganz mitgekriegt, daß die WP verlassen wird, so daß meine Version mit Umwandeln, Drehen und Umdrehen hier steht. Kann aber hierher verändert und kopiert werden. --Physikr 08:54, 4. Sep 2006 (CEST)

Beschreibung

Das ist eine Vorversion eines VBA-Makro für Excel. Damit kann jede Excel-Tabelle sofort ohne Umwege in eine Textdatei geschrieben werden, welche dann im Wiki einfach nur eingefügt werden muss.

Anleitung zum VBA-Makro

Im Prinzip: Einfach in einem Modul im VBA-Editor einfügen und starten.
Die folgende Anleitung kann für andere Excel-Versionen leicht abweichen:

  1. Mit Excel die Datei öffnen, die umgewandelt werden soll
  2. Den VBA-Editor öffnen (Menü: Extras/Makro/Visual-Basic-Editor) oder 'Alt-F11'
  3. In der linken Spalte sind die geöffnetet Dokumente angezeigt
  4. Dort auf 'VBA-Projekt' (mit dem Namen des aktuellen Dokuments, also nicht bei Eurotools!) mit der rechten Maustaste hinklicken
  5. Im Kontextmenü Einfügen/Modul wählen
  6. Im rechten grossen Fenster erscheint eine leere weisse Seite (evtl. steht oben Option Explicit)
  7. Den gesamten Quelltext unten kopieren und auf diese leere weisse Seite einfügen
  8. Das Makro ausführen (Die Variablen Startspalte, Startzeile, Endspalte, Endzeile und Dateiname werden automatisch bei jedem Start abgefragt)


VBA-Makro

VORSICHT: Dies hier ist eine veraltete Version! auf [2] gibt es eine überarbeitete Version.
Schau auch bitte unter Diskussion dort wird es bald mehr Infos geben.
14:21Uhr 07.07.2005

'Delimeter & Formatierungstags
Const TabellenBeginn = "{|"
Const TabellenEnde = "|}"
Const ZeilenStartDelimeter = "|"
Const ZeilenEndDelimeter = ""
Const ZeilenTrennzeichen = "|-"
Const Delimeter = "||"  'SpaltenTrennzeichen
Const Formatierungstags = ""  'bisher noch nicht eingebaut
'-----------------------------------------------------

Sub Tabelle2Wiki()
  Dim fHandle, i, j As Integer
  Dim StartZeile, StartSpalte, EndZeile, EndSpalte As Integer
  Dim ZeilenText, ZellInhalt, zeichenkette As String
  
  fHandle = FreeFile()
  StartZeile = Val(InputBox("Ab welcher Zeile soll umgewandelt werden ?", _
                            "Startzeile - Schritt 1 von 5", "1"))
  'nach belieben als Zahl eintragen a=1, z=26
  StartSpalte = Val(InputBox("Ab welcher Spalte soll umgewandelt werden ?" + _
                    vbCrLf + "(z.B. A=1, Z=26, AG=33)", _
                    "Startspalte - Schritt 2 von 5", "1"))
  EndZeile = Val(InputBox("Bis zu welcher Zeile soll umgewandelt werden ?", _
                            "Endzeile - Schritt 3 von 5", "100"))
  
  'nach belieben als Zahl eintragen a=1, z=26, Spalte AG = z+7=33
  EndSpalte = Val(InputBox("Bis zu welcher Spalte soll umgewandelt werden ?" + _
                    vbCrLf + "(z.B. A=1, Z=26, AG=33)", _
                    "Endspalte - Schritt 4 von 5", "26"))
  DateiName = InputBox("Wie soll die Ausgabedatei heissen (bitte ggf. den Pfad ergänzen) ?", _
                            "Dateiname - Schritt 5 von 5", "wiki-tabelle.txt")
  ZeilenText = ""
  
  Open DateiName For Output As #fHandle
   Print #fHandle, TabellenBeginn      'Beginn der Tabelle
   For i = StartZeile To EndZeile
    ZeilenText = ZeilenText + ZeilenStartDelimeter  'Beginn der zeile
    For j = StartSpalte To EndSpalte
     ZellInhalt = ZelleLesen(i, j)
     
     'leere Zellen mit " " füllen (sonst keine richtige Darstellung im wiki)
     If ZellInhalt = "" Then ZellInhalt = " "
     
      If ZellInhalt = Val(ZellInhalt) Then ZellInhalt = Format(ZellInhalt)
      
      If Formatierungstags <> "" Then
       ZeilenText = ZeilenText + "|" + Formatierungstags + "|"
      ElseIf j > StartSpalte Then                  'Die erste Spalte umgehen
       ZeilenText = ZeilenText + Delimeter
      End If
      ZeilenText = ZeilenText + ZellInhalt
    Next j
    If j < EndSpalte Then
      Print #fHandle, ZeilenText + Delimeter
    Else
      Print #fHandle, ZeilenText + ZeilenEndDelimeter
    End If
    ZeilenText = ""
    Print #fHandle, ZeilenTrennzeichen
   Next i
  Print #fHandle, TabellenEnde      'Ende der Tabelle
  Close #fHandle

End Sub

Function ZelleLesen(Zeile,Spalte)
  'OfficeTyp=OfficeHerauskriegen()
  'If OfficeTyp= "Excel" Then
   'Das geht bisher nur mit Excel, noch nicht mit Staroffice/OpenOffice.org
    ZelleLesen = Cells(Zeile, Spalte)
  'Else if OfficeTyp = "OpenOffice.org" Then
  ' Staroffice / OpenOffice.org - Code bitte hierher 
  'End If 
End Function

'Function OfficeHerauskriegen()
 'Das müsste auch noch entwickelt werden
'End Function

Entwicklung

Verbesserungsvorschläge

Was noch verbessert werden könnte:

  • Es findet noch keine Prüfung des Zellinhalts auf ungültige Zeichen statt
  • Durch eine führende Zeile könnten Formatierungsanweisungen angegeben werden, die dann automatisch eingetragen werden
  • eine weitere führende Zeile könnte ein Flag enthalten, ob diese Spalte überhaupt übernommen werden soll
  • Es fehlt noch das Kopieren der gesamten umgewandelten Tabelle ins Clipboard
    • vermutlich sollte ein erneutes einlesen der gesamten Datei und dann eine Kopierfunktion ausreichen
  • Verwendung von Option Explicit und überprüfung der Variablennamen :-)

Das hier ist schon relativ konkret durchdacht, aber noch nicht umgesetzt:

  • Zellinhalt wird (bisher nur) auf "|" überprüft und ggf. mit <nowiki> umklammert
  • Einbau von Formatierungsinformationen:
    • Das Makro überprüft das Vorhandensein von 3 Kopfzeilen in der gewählten Exceltabelle.
    • Falls die Kopfzeilen noch nicht existieren, werden sie automatisch eingetragen.
    • Tabellen-Zeile 1:
      • "Mediawiki-Tabelle, diese Zeile ist eine Markierung und dient zur Erkennung des Makros. In den folgenden 2 Zeilen befinden sollten Formatierungsangeben eingetragen werden."
    • Tabellen-Zeile 2, mit den Formatierungsanweisungen, ob und wie die Zelle formatiert werden soll
      • ist die Zelle leer, wird die Spalte nicht mitübernommen
      • "L" =Zellendaten in dieser Spalte werden als [Link] umgewandelt
      • "LX" =Zellendaten in dieser Spalte werden als [Link|(Inhalt von Spalte X)] umschrieben, z.B. "L4" macht dann aus "A122" [Abenteuer:Die_Dunkle_Halle|A122], sofern in Spalte 4 derselben Zeile "Die_Dunkle_Halle" steht.
    • Tabellen-Zeile 3, mit den Farbinformationen, die dann für jede Zelle dieser Spalte gelten:
      • z.B. bgcolor=#aabbaa
      • Mit einem Zusatzbuchstaben kann alternierende Farbe erreicht werden (=jede 2.Zeile etwas dunkler),
      • z.B. Abgcolor=#ffbbee (=1 Farbwert dunkler) bzw. Bbgcolor=#22aaff (=2 Farbwerte dunkler) ergibt dann
alternierend #ffbbee bzw. #22aaff
und #eeaacc mit Farbwechsel zu: #0088cc
alternierend #ffbbee oder #22aaff
und #eeaacc mit Farbwechsel zu: #0088cc


Portierung auf OpenOffice / StarOffice

Anscheinend ist die Funktion "Cells()" das einzige, was umgeschrieben werden müsste, damit der Makro unter OpenOffice bzw. StarOffice funktioniert.
So weit ich das bisher überblicke, müsste es mit einem UnoService programmiert werden.

Vielleicht kann jemand mal das Handbuch zu OpenOffice-Basic durchschauen und das Problem lösen.

Das hier ist schon mal lauwarm, glaube ich:


Sheet is the module that contains spreadsheet services. It is used like the text service, since it needs a document to work with:

 Global oDesktop As Object
 Global oDocument As Object

 Sub sheetdoc_init
   Dim mNoArgs()
   REM Empty Sequence
   Dim sUrl As String

   oDesktop = createUnoService("com.sun.star.frame.Desktop")
   sUrl = "private:factory/scalc"
   REM Or: sUrl = "file:///home/testuser/Office52/work/table.sdc"
   oDocument = oDesktop.LoadComponentFromURL(sUrl,"_blank",0,mNoArgs)
 End Sub

In the following examples, we will assume you have opened the document as described. 
You ll learn how to address cells and ranges of cells, how to navigate through sheets, and how to draw a chart from sheet data.

bzw.


A single cell is adressed like this: 
Function GetCell (oDocument As Object, _ nSheet As Long, nColumn As Long ,_ nRow As Long) As com.sun.star.table.XCell
 Dim oSheets As Object
 Dim oSheet As Object

 oSheets = oDocument.Sheets()
 oSheet = oSheets.getByIndex(nSheet)
 GetCell = oSheet.getCellByPosition (nColumn , nRow)
End Function

bzw.


If you have a range of cells, you might want to work with a single cell. This can be achieved with 
      getCellByPosition(): oCell = oCellRange.getCellByPosition(0,0) 
would return the cell at the top left corner of the range. All values passed to getCellByPosition() are relative to the range. 

To get the right bottom cell, you d use 
      nCols = oCellRange.Columns.Count
      nRows = oCellRange.Rows.Count
      oCell = oCellRange.getCellByPosition(nCols - 1, nRows -1) 

Note that we subtract 1 from the number of rows and columns here, because the numbering starts at zero.

bzw.


To summarize: 
To set the content of a cell to text, you use the String property, to enter a value in a cell, you set the Value property. 
If you want to put a formula in a cell, you assign it (including the equals sign) to the Formula property. 
Note that function names must be English if you use the Formula property. T
o use functions in your local language, you must use the FormulaLocal property. 
If you want to know what a cell contains, you can retrieve its Type property: 

Sub Printinfo (oCell As Object)
 Dim eType as Long
 eType = oCell.Type

 If eType = com.sun.star.table.CellContentType.VALUE Then
   Print CStr(oCell.Value)
 Elseif eType = com.sun.star.table.CellContentType.TEXT Then
   Print oCell.String
 Elseif eType <> com.sun.star.table.CellContentType.EMPTY Then
   Print oCell.Formula + "..." + oCell.FormulaLocal
 Else
   Print "Cell Is empty"
 End If
End Sub

This piece of code simply outputs the content of a cell as a string. If it is a formula, it is shown in the English and the local variant.

Wär schön, wenn sich das mal jemand vornimmt, der sich schon mit OpenOffice / Staroffice auskennt.


Bugs

  • "zeichenkette" ist eigentlich überflüssig.
    • Bei mir kommt allerdings ein Laufzeitfehler, falls keine zusätzliche Variable deklariert wird.
    • Woran das wohl liegt ?
  • Die folgende Zeile funktioniert nicht unter Excel 97 und sollte besser so lauten:
      'If ZellInhalt = Val(ZellInhalt) Then
      ZellInhalt = Format(ZellInhalt)