2013-07-15 65 views
26

Trong this post có một ví dụ Python để chuyển đổi từ csv thành xls.Python chuyển đổi csv thành xlsx

Tuy nhiên, tệp của tôi có hơn 65536 hàng nên xls không hoạt động. Nếu tôi đặt tên tập tin xlsx nó không tạo sự khác biệt. Có một gói Python để chuyển đổi sang xlsx không?

Trả lời

46

Dưới đây là một ví dụ sử dụng xlsxwriter:

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


for csvfile in glob.glob(os.path.join('.', '*.csv')): 
    workbook = Workbook(csvfile[:-4] + '.xlsx') 
    worksheet = workbook.add_worksheet() 
    with open(csvfile, 'rt', encoding='utf8') as f: 
     reader = csv.reader(f) 
     for r, row in enumerate(reader): 
      for c, col in enumerate(row): 
       worksheet.write(r, c, col) 
    workbook.close() 

FYI, đó cũng là một gói phần mềm được gọi là openpyxl, có thể đọc/ghi Excel 2007 xlsx/xlsm file.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn đoạn mã rất hữu ích này. Trong khi sử dụng các tệp lớn, tốt hơn nên sử dụng 'constant_memory' để sử dụng bộ nhớ được kiểm soát như: 'workbook = Workbook (csvfile + '.xlsx', {'constant_memory': True})'. Tham khảo: http://xlsxwriter.readthedocs.org/en/latest/working_with_memory.html – Ethan

+1

Đẹp ... Tuy nhiên, các tệp xlsx được tạo có đầy đủ tất cả các trường số có lỗi mà các trường được lưu dưới dạng văn bản thay vì số. – MrMobileMan

+1

Tìm thấy bản sửa lỗi cho các số dưới dạng văn bản ở đây: http://stackoverflow.com/questions/24971556/openpyxl-python-writing-csv-to-excel-gives-number-formatted-as-text – MrMobileMan

17

Với thư viện của tôi pyexcel, bạn có thể làm điều đó trong dòng một lệnh:

from pyexcel.cookbook import merge_all_to_a_book 
import pyexcel.ext.xlsx # needed to support xlsx format, pip install pyexcel-xlsx 
import glob 


merge_all_to_a_book(glob.glob("your_csv_directory/*.csv"), "output.xlsx") 

Mỗi csv sẽ có tờ riêng của mình và tên sẽ là tên tập tin của họ.

+1

Rất đẹp ... Cảm ơn! Tôi lên bầu chọn cái này. Tuy nhiên, một vấn đề mà tôi đang gặp phải là cả xlswriter và xlsx đều tạo ra các lỗi đầy đủ của xlsx mà các trường văn bản được định dạng dưới dạng văn bản thay vì số ... – MrMobileMan

+1

Tìm số sửa lỗi thành các số ở đây ... http: // stackoverflow.com/questions/24971556/openpyxl-python-writing-csv-to-excel-cung-số-định dạng-dưới dạng văn bản – MrMobileMan

+0

Nếu cần thêm định dạng, bạn không thể sử dụng merge_all_to_a_book nhưng sử dụng pyexcel.Sheet, mà bạn có thể sử dụng Hàm format() để [chuyển đổi float thành int] (https://github.com/chfw/pyexcel/issues/18) trước, sau đó sử dụng [sheet operations] (http://pyexcel.readthedocs.org/en/latest /tutorial04.html) để hợp nhất chúng và lưu dưới dạng csv. – chfw

2

Làm thế nào tôi làm điều đó với openpyxl lib:

import csv 
from openpyxl import Workbook 

def convert_csv_to_xlsx(self): 
    wb = Workbook() 
    sheet = wb.active 

    CSV_SEPARATOR = "#" 

    with open("my_file.csv" as f: 
     reader = csv.reader(f) 
     for r, row in enumerate(reader): 
      for c, col in enumerate(row): 
       for idx, val in enumerate(col.split(CSV_SEPARATOR)): 
        cell = sheet.cell(row=r+1, column=idx+1) 
        cell.value = val 

    wb.save("my_file.xlsx") 
0
from openpyxl import Workbook 
import csv 


wb = Workbook() 
ws = wb.active 
with open('test.csv', 'r') as f: 
    for row in csv.reader(f): 
     ws.append(row) 
wb.save('name.xlsx') 
0

Có một cách đơn giản

import os 
import csv 
import sys 

from openpyxl import Workbook 

reload(sys) 
sys.setdefaultencoding('utf8') 

if __name__ == '__main__': 
    workbook = Workbook() 
    worksheet = workbook.active 
    with open('input.csv', 'r') as f: 
     reader = csv.reader(f) 
     for r, row in enumerate(reader): 
      for c, col in enumerate(row): 
       for idx, val in enumerate(col.split(',')): 
        cell = worksheet.cell(row=r+1, column=c+1) 
        cell.value = val 
    workbook.save('output.xlsx') 
1

Thêm một câu trả lời rằng độc quyền sử dụng thư viện gấu trúc để đọc trong một. tệp csv và lưu dưới dạng tệp .xlsx. Ví dụ này sử dụng số pandas.read_csv (Link to docs) và pandas.dataframe.to_excel (Link to docs).

Ví dụ hoàn toàn có thể tái sử dụng sử dụng gọn gàng để chỉ tạo số ngẫu nhiên và điều này có thể bị xóa nếu bạn muốn sử dụng tệp .csv của riêng mình.

import pandas as pd 
import numpy as np 

# Creating a dataframe and saving as test.csv in current directory 
df = pd.DataFrame(np.random.randn(100000, 3), columns=list('ABC')) 
df.to_csv('test.csv', index = False) 

# Reading in test.csv and saving as test.xlsx 

df_new = pd.read_csv('test.csv') 
writer = pd.ExcelWriter('test.xlsx') 
df_new.to_excel(writer, index = False) 
writer.save() 
Các vấn đề liên quan