2011-04-18 31 views
17

Tengo pocos archivos csv que me gustaría volcar como nuevas hojas de trabajo en un libro de Excel (xls/xlsx). ¿Cómo logro esto?python: creación de libros de Excel y volcado de archivos csv como hojas de cálculo

Google buscó y encontró 'pyXLwriter' pero parece que el proyecto se detuvo. Mientras estoy probando 'pyXLwriter' me gustaría saber si hay alguna alternativa/sugerencia/módulo?

Muchas gracias.

[Editar]

Aquí está mi solución: (alguien tiene mucha solución mucho más delgado, Pythonic hacer comentarios THX?.)

import glob 
import csv 
import xlwt 
import os 

wb = xlwt.Workbook() 


for filename in glob.glob("c:/xxx/*.csv"): 
    (f_path, f_name) = os.path.split(filename) 
    (f_short_name, f_extension) = os.path.splitext(f_name) 
    ws = wb.add_sheet(str(f_short_name)) 
    spamReader = csv.reader(open(filename, 'rb'), delimiter=',',quotechar='"') 
    row_count = 0 
    for row in spamReader: 
     for col in range(len(row)): 
      ws.write(row_count,col,row[col]) 
     row_count +=1 

wb.save("c:/xxx/compiled.xls") 

print "Done" 
+0

cuidado. Xlwt limita el número de entradas a 65,556. Pero si tiene más filas, vaya a xlsxwriter –

+0

Pruebe Sikuli. Es un proyecto de Jython, pero puede usarlo para automatizar cualquier tarea de GUI. – Patrick

Respuesta

27

No está seguro de lo que decir con "mucho más ágil, mucho Pythonic", pero ciertamente se podría arreglarlo un poco:

import glob, csv, xlwt, os 
wb = xlwt.Workbook() 
for filename in glob.glob("c:/xxx/*.csv"): 
    (f_path, f_name) = os.path.split(filename) 
    (f_short_name, f_extension) = os.path.splitext(f_name) 
    ws = wb.add_sheet(f_short_name) 
    spamReader = csv.reader(open(filename, 'rb')) 
    for rowx, row in enumerate(spamReader): 
     for colx, value in enumerate(row): 
      ws.write(rowx, colx, value) 
wb.save("c:/xxx/compiled.xls") 
3

Siempre acaba de escribir el formato XML de Office 2003 a través de cadenas. Es bastante fácil de hacer y mucho más fácil de administrar que escribir y comprimir lo que constituye un documento xlsx. Tampoco requiere ninguna biblioteca externa. (aunque uno podría rodar fácilmente el suyo)

Además, Excel admite la carga de archivos CSV. Ambos espacios delimitados o delimitados por caracteres. Puede cargarlo directamente, o tratar de copiar & pegarlo, luego presione el botón Text-To-Columns en las opciones. Esta opción no tiene nada que ver con Python, por supuesto.

+0

gracias ... pero no si tengo 20 sobre csv que voy a abrir uno por uno y hago el corte y pegado ... jeje :) – siva

+0

Para obtener un archivo de plantilla en blanco con el que puedo jugar, abro Excel, intro Test en A1, luego use save como en la hoja de cálculo en blanco, seleccione XML Spreadsheet 2003 como el tipo de archivo, luego dele un nombre. Sabrá qué hacer cuando vea la estructura XML para él. – adorablepuppy

+0

¡Esto suena muy interesante! – Sergio

12

Encontrará todo lo que necesita en este xlwt tutorial. Estas bibliotecas (xlrd and xlwt) son las opciones más populares para administrar la interacción de Excel en Python. La desventaja es que, por el momento, solo son compatibles con el formato binario de Excel (.xls).

+0

sí, mirando a fondo el tutorial pdf. Se hizo clic en una idea donde pude crear un archivo xls con muchas hojas y usar el módulo/método lector de csv python para volcar línea por línea en las hojas. :) – siva

+0

Sí, esta es más o menos la idea. Te aconsejaría que crees las hojas cuando las necesites, no de antemano. – Sergio

+5

xlwt el enlace del tutorial está roto –

3

También disponible en GitHub repo "Kampfmitexcel" ...

import csv, xlwt, os 

def input_from_user(prompt): 
    return raw_input(prompt).strip() 

def make_an_excel_file_from_all_the_txtfiles_in_the_following_directory(directory): 
    wb = xlwt.Workbook() 
    for filename in os.listdir(data_folder_path): 
     if filename.endswith(".csv") or filename.endswith(".txt"): 
      ws = wb.add_sheet(os.path.splitext(filename)[0]) 
      with open('{}\\{}'.format(data_folder_path,filename),'rb') as csvfile: 
       reader = csv.reader(csvfile, delimiter=',') 
       for rowx, row in enumerate(reader): 
        for colx, value in enumerate(row): 
         ws.write(rowx, colx, value) 
    return wb 

if __name__ == '__main__': 
    path_to_data = input_from_user("Where is the data stored?: ") 
    xls = make_an_excel_file_from_all_the_txtfiles_in_the_following_directory(path_to_data) 
    xls_name = input_from_user('What do you want to name the excel file?: ') 
    xls.save('{}\\{}{}'.format(data_folder_path,xls_name,'.xls')) 
    print "Your file has been saved in the data folder." 
3

Use xlsxwriter para crear y escribir en un archivo de Excel en python.

Instalarlo por: pip instalar xlsxwriter

import xlsxwriter 


# Create an new Excel file and add a worksheet. 
workbook = xlsxwriter.Workbook('demo.xlsx') 
worksheet = workbook.add_worksheet() 

# Widen the first column to make the text clearer. 
worksheet.set_column('A:A', 20) 

# Add a bold format to use to highlight cells. 
bold = workbook.add_format({'bold': True}) 

# Write some simple text. 
worksheet.write('A1', 'Hello') 

# Text with formatting. 
worksheet.write('A2', 'World', bold) 

# Write some numbers, with row/column notation. 
worksheet.write(2, 0, 123) 
worksheet.write(3, 0, 123.456) 

# Insert an image. 
worksheet.insert_image('B5', 'logo.png') 

workbook.close() 
1

Esto se basaba en la respuesta su respuesta en sí. Pero la razón por la que estoy usando xlsxwriter es porque acepta más datos en formato xlsx. Donde como xlwt te limita a 65556 filas y formato xls.

import xlsxwriter 
import glob 
import csv 
workbook = xlsxwriter.Workbook('compiled.xlsx') 
for filename in glob.glob("*.csv"): 
    ws = workbook.add_worksheet(str(filename.split('.')[0])) 
    spamReader = csv.reader(open(filename, 'rb'), delimiter=',',quotechar='"') 
    row_count = 0 
    print filename 
    for row in spamReader: 
     for col in range(len(row)): 
      ws.write(row_count,col,row[col]) 
     row_count +=1 

workbook.close() 
Cuestiones relacionadas