2014-05-09 10 views
6

Ho un file * .xlsm che contiene 20 fogli. Desidero salvare pochi fogli come * .csv (la perdita di formattazione va bene) individualmente. Già provato con le librerie xlrd-xlwt e win32com ma non riuscivo a passare. Qualcuno può fornire uno snippet di codice che esegue l'elaborazione di cui sopra in Python? Ho altre dipendenze Python quindi nessun altro linguaggio potrebbe funzionare. GrazieCome estrarre il foglio da * .xlsm e salvarlo come * .csv in Python?

+0

Per quanto mi ricordo, tutti gli ultimi formati di Microsoft Office XML erano confezionati in contenitori di Zip. Quindi probabilmente potresti dare un'occhiata alle fonti di file .xlsm, chiarire la sua struttura XML e quindi estrarre i campi richiesti. – user3159253

risposta

4

xlrd dovrebbe funzionare bene anche sui file xlsm. Ho testato il codice con un file xlsm casuale e ha funzionato perfettamente.

import csv 
import xlrd 

workbook = xlrd.open_workbook('test.xlsx') 
for sheet in workbook.sheets(): 
    with open('{}.csv'.format(sheet.name), 'wb') as f: 
     writer = csv.writer(f) 
     writer.writerows(sheet.row_values(row) for row in range(sheet.nrows)) 

Se hai codifica problemi, prova il codice qui sotto:

import csv 
import xlrd 

workbook = xlrd.open_workbook('test.xlsm') 
for sheet in workbook.sheets(): 
    if sheet.name == "Sheet_name_from_xlsm_file": 
     with open('{}.csv'.format(sheet.name), 'wb') as f: 
      writer = csv.writer(f) 
      for row in range(sheet.nrows): 
       out = [] 
       for cell in sheet.row_values(row): 
        try: 
         out.append(cell.encode('utf8')) 
        except: 
         out.append(cell) 
       writer.writerow(out) 
+0

Se questo non funziona, dovresti caricare il tuo file di dati se possibile. –

+0

Grazie per il frammento! Viene visualizzato questo errore: writer.writerows (sheet.val_values ​​(riga) per riga nell'intervallo (sheet.nrows)) UnicodeEncodeError: il codec 'ascii' non può codificare il carattere u '\ xb5' nella posizione 0: ordinale non compreso nel range (128) C'è un modo per specificare la codifica qui? Siamo spiacenti, non è possibile caricare il file qui. – iPirate

+0

@iPirate Penso che sia necessario codificare le stringhe con utf8 o qualcosa di simile. Prova cp1252 se non funziona. Ho aggiornato la mia risposta. –

Problemi correlati