2016-08-01 15 views
4

Kann jemand umgehen, ein Problem von OpenOffice Calc nicht neue Zeilen in Zellen richtig behandeln?openoffice calc - newline verursacht doppelten Wert in Zellen (Pandas/openpyxl)

Ich habe ein Python-Skript, das dynamisch eine Excel-Arbeitsmappe mit OpenPyxl über Pandas generiert.

Das Skript funktioniert gut, aber wenn ich Zellen in OpenOffice anzeigen, die Zeilenumbrüche enthalten, werden alle Werte mehrfach dupliziert. Wenn ich dieselbe Datei mit dem Microsoft Excel Viewer öffne, wird alles korrekt angezeigt, und wenn ich ein anderes Zeichen als eine neue Zeile verwende (z. B. Komma, # usw.), wird es auch in beiden angezeigt.

Ich habe eine Problemumgehung, in die Excel zu gehen und das zufällige Zeichen mit einem Makro zu ersetzen, aber das möchte ich vermeiden, wenn der Prozess wirklich vollständig automatisiert werden muss. Auch weil die Datei von einem anderen internen Tool verarbeitet wird, müssen diese Zellen mit einer neuen Zeile verarbeitet werden und ich kann das Zeichen nicht ändern.

Ich habe auch versucht, mit chr (10) und/oder chr (13), aber im ersten Fall wird es nur in der Ausgabe durch '\ n' wie erwartet ersetzt.

Der Code, den ich zur Zeit bin mit ähnelt:

test_list = [] 
for x in range(1,18): 
    test_list.append([ 
     "value1", 
     "\n".join(['element1', 'element2', 'element3']), 
     "value3" 
    ]) 

data_df = pd.DataFrame(test_list) 

fn = r'/path/to/excel/file.xlsx' 

writer = pd.ExcelWriter(fn, engine='xlsxwriter') 
data_df.to_excel(writer, sheet_name='Data', index=False, header=0) 
workbook = writer.book 
worksheet = writer.sheets['Data'] 
worksheet.set_column('A:ZZ',50, 
        workbook.add_format({'text_wrap': True})) 
writer.save() 

Was mit dem Element Daten geschieht, ist, dass es wie in der Openoffice Calc Zelle als etwas zeigt:

Openoffice Cells

Seltsamerweise scheint das letzte Element korrekt zu sein

Die gleichen Daten, die als Liste oder über DataFrame.head() angezeigt werden, erscheinen in Ordnung:

pprint(test_list) 
[['value1', 'element1\nelement2\nelement3', 'value3'], 
['value1', 'element1\nelement2\nelement3', 'value3'], 
['value1', 'element1\nelement2\nelement3', 'value3'], 
['value1', 'element1\nelement2\nelement3', 'value3'], 
['value1', 'element1\nelement2\nelement3', 'value3'], 
['value1', 'element1\nelement2\nelement3', 'value3'], 
... 
['value1', 'element1\nelement2\nelement3', 'value3']] 

data_df.head(18): 
     0        1  2 
0 value1 element1\nelement2\nelement3 value3 
1 value1 element1\nelement2\nelement3 value3 
2 value1 element1\nelement2\nelement3 value3 
... 
15 value1 element1\nelement2\nelement3 value3 
16 value1 element1\nelement2\nelement3 value3 

Es ist nur, wenn es an die openpyxl-Bibliothek übergeben und in OpenOffice angezeigt wird.

Dank

+0

Was ist Ihr Betriebssystem und die Version von Office? –

+0

Windows 10, nur der Excel-Viewer, aber wie gesagt in Excel gut funktioniert nur nicht OpenOffice (4.1.2) – GuHuka

Antwort

2

Der Code für mich mit Openoffice 4.1.2 unter Windows funktionierte gut:

enter image description here

Aus diesem Screenshot, ich Doppelklicken Sie auf den unteren Rand der zweiten Zeile, um sie zu erweitern. Vorher zeigte es nur element3 mit einem roten Dreieck. Aber das scheint anders zu sein als das Verhalten, das Sie beschrieben haben.

EDIT:

Ok, ich das Problem jetzt bestätigen kann.Wie du gesagt hast, tritt es mit der mysteriösen Zahl von 18 Gegenständen auf. Es sieht aus wie ein Fehler in OpenOffice, weil es keinen großen Unterschied in den XML-Dateien gibt, die durch das Entpacken von file.xlsx angezeigt werden.

Ich habe auch versucht, CR und LF Zugabe direkt in den XML-Dateien, aber dies nur in Folge:

enter image description here

, die uns drei Lösungen lassen:

  1. Verwenden Libreoffice statt, die hat dieses Problem nicht (getestet LO 5.1.0.3).
  2. Report the bug und warten Sie auf eine neue Version.
  3. Verwenden Sie das bevorzugte Format .ods von OpenOffice anstelle des bevorzugten Formats von MS Office.
+1

Entschuldigung, beim Entfernen von sensiblen Daten würde ich den Code zu stark vereinfacht (Aktualisierter Originalbeitrag). Für einen einzelnen Artikel scheint es gut zu funktionieren, aber wenn mehr als 17 Artikel verarbeitet werden, dann ist es falsch. Das ursprüngliche Skript erstellt eine Liste von 100 Elementen. – GuHuka

+0

bestätigt. LibreOffice 5.2.0.4 installiert und der Code hat erfolgreich mit 3000+ Elementen gearbeitet. – GuHuka

0

Wenn ich dein Beispiel mit einer aktuellen Pandas und XlsxWriter ich die erwartete Ausgabe in Excel erhalten laufen:

enter image description here

wird jedoch automatisch Excel in diesem Fall die Höhe der Zeile Einstellung 2 zu kompensieren. Das kann in OpenOffice nicht passieren.

In diesem Fall können Sie es explizit festgelegt wie folgt aus:

worksheet.set_row(1, 45) 
+0

Das Problem war nicht in Excel, nur in OpenOffice Calc – GuHuka