Archiv 9. Februar 2012

Donnerstag, 9. Februar 2012

SAP Spreadsheet-Exporte parsen

… ist leider nicht so einfach.

SAP bietet die Möglichkeit, Reports zu exportieren. Zur Auswahl steht unter anderem auch ein „Spreadsheet“-Format, für welches die Endung .xls vorgeschlagen wird. Dabei handelt es sich aber nicht etwa um das Excel-Binärformat, welches heute durch OOXML abgelöst wurde, sondern um das ältere XLL-Format, was auch immer das genau sein soll. Betrachtet man die aus SAP generierte Datei in einem Text-Editor, ist offensichtlich, dass es sich hierbei nicht um ein Binär- sondern um ein Plaintext-Format mit Tabulator getrennten Spalten handelt.

Wenn diese Datei aber mit Python eingelesen wird und verarbeitet werden soll, ergeben sich Probleme. Die Zeichen sind auf der cygwin-Kommandozeile von einem Leerzeichen getrennt. Es handelt sich also nicht um eine ASCII-Ausgabe.

Ein Blick mit Notepad++ auf die Datei zeigt, dass die Encodierung der Datei UCS-2 Little Endian sein soll. Auf Stackoverflow ist erwähnt, dass diese Encodierung in Python wie UTF-16 behandelt werden kann, und zwar folgendermassen:

file = codecs.open(filenameInput,'Ur',encoding='utf-16be')

Leider führt das aber nicht zum Erfolg, was nachfolgende Fehlermeldung einem schmerzlich vor Augen führt:

Traceback (most recent call last):
  File "./<script>.py", line 140, in 
    data = file.read()
  File "C:\Python27\lib\codecs.py", line 671, in read
    return self.reader.read(size)
  File "C:\Python27\lib\codecs.py", line 477, in read
    newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf16' codec can't decode bytes in position 1082-1083: illegal encoding

Tags: , ,
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 9. Februar 2012

Mit openpyxl .xlsx-Dateien ausgeben

Mit dem Python-Modul openpyxl ist es möglich, Excel-Dateien im Microsoft OOXML-Format (.xlsx) zu lesen und zu schreiben.

Da das Erstellen einer solchen Datei im Netz verständlich erklärt ist und hier nicht näher beleuchtet werden soll, ist das Styling von Tabellenzeilen leider kaum dokumentiert.

Hier einige Ansatzpunkte in Form von Code-Schnipseln aus einem meiner Python-Scripts:

from openpyxl.reader.excel import load_workbook
from openpyxl.writer.excel import ExcelWriter

from openpyxl.workbook import Workbook
from openpyxl.worksheet import ColumnDimension
from openpyxl.cell import get_column_letter, column_index_from_string
from openpyxl.style import Color, Fill

# Eigenschaften von Zelle in Reihe 4 und Spalte 3
cellCoord = get_column_letter(3) + "4"

# Fettschrift
sheetResult.cell(cellCoord).style.font.bold = True

# Textausrichtung
sheetResult.cell(cellCoord).style.alignment.horizontal = 'left'
sheetResult.cell(cellCoord).style.alignment.vertical = 'top'

# Textumbruch
sheetResult.cell(cellCoord).style.alignment.wrap_text = True

# Zellfüllung
sheetResult.cell(cellCoord).style.fill.fill_type = Fill.FILL_SOLID 
sheetResult.cell(cellCoord).style.fill.start_color.index = Color.GREEN

# Für Zellfüllung verfügbare Farben
BLACK = 'FF000000'
WHITE = 'FFFFFFFF'
RED = 'FFFF0000'
DARKRED = 'FF800000'
BLUE = 'FF0000FF'
DARKBLUE = 'FF000080'
GREEN = 'FF00FF00'
DARKGREEN = 'FF008000'
YELLOW = 'FFFFFF00'
DARKYELLOW = 'FF808000'

Tags: ,
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen

Donnerstag, 9. Februar 2012

Python-Scripts unter Windows in ausführbare .exe-Dateien umwandeln

Mit Python-Scripts kann man auch in einer Grossfirma wie meinem Arbeitgeber Arbeitsabläufe automatisieren, so beispielsweise das parsen einer Excel-Datei mit dem Modul openpyxl. Ich suche in der Excel-Datei in einer bestimmten Spalte nach Parametern und in derselben Zeile dann nach den auf dem produktiven System eingestellten Werten.

Doch was macht man nun mit dem Python-Script, wenn es als stabil empfunden und zur Distribution unter den Arbeitskollegen freigegeben wurde? Man kann nicht erwarten, dass nur ein einziger Mitarbeiter Python auf seinem Windows-Rechner installiert hat und das Script so ausführen kann.

Zum Glück gibt es eine einfache Möglichkeit, um Python-Scripts in eine .exe-Datei umzuwandeln, welche ausschliesslich aus dieser Datei bestehen und deshalb problemlos herumgereicht werden können.

Hierfür benötigt man den pyinstaller (kompatibel mit Python 2.7), welchen man folgendermassen aufruft:

python C:\Source\pyinstaller-1.5.1\pyinstaller.py C:\Source\emeidi\<script>.py -F

Der Switch -F sagt pyinstaller, dass er das Script in eine einzige, grosse .exe-Datei umwandeln und auf den sonst ebenfalls nötigen .dll-Plunder verzichtet.

Anschliessend findet sich die .exe-Datei unter C:\Source\pyinstaller-1.5.1\<script>\dist\<script>.exe, welche man beispielsweise auf den Desktop kopieren und von dort ausführen kann.

Tags: , , ,
Labels: Allgemein

1 Kommentar | neuen Kommentar verfassen

Donnerstag, 9. Februar 2012

Microsoft Word nervt mit der ständigen Frage „Open as read-only?“

Wenn Microsoft Word beim Öffnen einer bestimmten Word-Datei partout immer wieder mit der Frage „<dateiname> should be opened as read-only unless changes to it need to be saved. Open as read-only? “ nervt, muss die Datei neu gespeichert werden.

Hierbei ist aber zu beachten, dass man den Schreibschutz der neu zu erstellenden Datei folgendermassen entfernt:

  1. Microsoft Office Button
  2. Save as
  3. Tools
  4. General Options
  5. [ ] Read-only recommended

Wird die Datei so neu abgelegt, erscheint das nervende Dialogfenster beim Öffnen der Datei nicht mehr.

Tags:
Labels: Allgemein

Keine Kommentare | neuen Kommentar verfassen