2017-07-13 3 views
1

ändern Ich verwende Python, um meine CSV-Datei in Xlsx-Dateien zu konvertieren, geschieht die Konvertierung erfolgreich. Zur gleichen Zeit möchte ich auch den Zellennummern-Typ ändern, z. B. wo immer Float-Typ xx.xxxx ist, der auf .xx (2 Dezimalstellen) -Werte reduziert wird.Python: wie man Zellennummer mit xlsxwriter

Eingang test.csv Blatt, getrennt durch ""

Name  Date  Total request sas rate 
rasta777 16062017 387865   89.3456 
rasta777 16062017 291293   67.675 
rasta777 16062017 256418   100 
rasta777 16062017 251558   98.98 

Ich habe bereits versucht, die folgenden Python-Skript xlsxwriter verwenden, aber ein Fehler.

import os 
import glob 
import csv 
from xlsxwriter.workbook import Workbook 

for csvfile in glob.glob(os.path.join('.', 'hourly.csv')): 
workbook = Workbook(csvfile + '.xlsx') 
worksheet = workbook.add_worksheet() 
format = workbook.add_format() 
format.set_bold() 
format.set_font_color('blue') 
format.set_num_format('0x02') 
format1 = workbook.add_format({'font_color': 'blue'}) 
with open(csvfile, 'rb') as f: 
    reader = csv.reader(f) 
    for r, row in enumerate(reader): 
     for c, col in enumerate(row): 
      worksheet.write(r, c, col) 
      worksheet.set_row(0, 20, format) 
      worksheet.set_column('A:P', format) 
workbook.close() 

immer Fehler, dass

"TypeError: unsupported operand type(s) for *: 'Format' and 'int'"

Mein zweites Problem Ausgang erzeugt wird (immer dann ausgegeben, wenn ich worksheet.set_column('A:P', format) entfernen) gibt Zelltyp als Text, während meine Daten alle numerischen Werte außer Header ist.

+0

Die erste Ausgabe wird wahrscheinlich verursacht durch einen Hex-Wert als String hinzugefügt wird. Versuchen Sie 0x2 statt oder nur 2. – jmcnamara

+0

Das zweite Problem ist aufgrund der Tatsache, dass das CSV-Modul alle Daten in Strings lesen, auch wenn sie wie Zahlen aussehen. Sie können dies umgehen, indem Sie die Konstruktoroption 'strings_to_numbers' in XlsxWriter verwenden: .http: //xlsxwriter.readthedocs.io/workbook.html#constructor – jmcnamara

+0

nach dem Hinzufügen strings_to_numbers, beide Probleme jetzt gelöst. Kann ich wissen, wie man float (.xx-Format) für nur bestimmte Spalte anwendet ??? Gemäß meiner Tabelle hat die 4. Spalte Gleitkommawerte. worksheet.set_column ('A: P', 18, format1) wendet format1-Parameter auf alle Spalten an. ich habe bereits ein format2 definiert, das 0x2 num type hat, wie fügt man das zur worksheet.set Zeile hinzu? – RNL

Antwort

1

Das letzte Mal, als ich überprüfte XlsxWriter worksheet unterstützt nicht die Änderung des Zelltyps, nachdem der Wert geschrieben wurde. Wenn Sie einen Wert von bestimmten Typs schreiben möchten, müssen Sie es schreiben unter Verwendung eines Verfahrens spezifisch, auf eine Art, wie so:

worksheet.write_datetime(idx, fld_idx, fld, date_format) 

Sie müssen auch Format angeben während schreiben, und ich glaube nicht, Es ist möglich, das Format nachträglich zu ändern.

Im Allgemeinen habe ich durch Erfahrung mit XlsxWriter gelernt, dass es besser ist, alles vorzubereiten, was Sie brauchen, bevor Sie schreiben und dann die Zelle einmal mit allen korrekten Werten schreiben. So z.B. Ich benutze die date_format vordefiniert die übliche Art und Weise beim Schreiben der datetime in die Zelle. Das funktioniert.

hier auf typspezifische Methoden Informieren Sie sich: http://xlsxwriter.readthedocs.io/worksheet.html, insbesondere:

write_string() 
write_number() 
write_blank() 
write_formula() 
write_datetime() 
write_boolean() 
write_url() 
Verwandte Themen