Tablib导出损坏文件

时间:2016-02-02 10:58:54

标签: python excel csv

我正在编写一个简单的代码,用python上的Tablib将csv转换回xls。

据我了解,如果您导入csv,Tablib会为您进行转换。

import tablib
imported_data = tablib.import_set(open('DB.csv',encoding='utf8').read())
f = open('workfile.xls', 'wb')
f.write(imported_data.xls)
f.close()

此代码处理数据库的小样本,但在一点(约600行)失败意味着成功编译但Excel无法在此时打开文件。

我不确定如何继续 - 这个tablib是否失败或者Excel无法读取编码数据?

3 个答案:

答案 0 :(得分:1)

这两个函数允许您在导出到excel文件后从csv导入

import csv 
from xlsxwriter import Workbook
import operator
# This function for import from csv 
def CSV2list_dict(file_name):
     with open(file_name) as f:
        a = [{k: int(v) for k, v in row.items()}
        for row in csv.DictReader(f, skipinitialspace=True)]
     return a

# file_name must be end with .xlsx
# The second parameter represente the header row of data in excel,
# The type of header is a list of string, 
# The third paramater represente the data in list dictionaries form
# The last paramater represente the order of the key 
def Export2excel(file_name, header_row, list_dict, order_by):
    list_dict.sort(key=operator.itemgetter(order_by))
    wb=Workbook(file_name)
    ws=wb.add_worksheet("New Sheet") #or leave it blank, default name is "Sheet 1"
    first_row=0
    for header in header_row:
         col=header_row.index(header) # we are keeping order.
         ws.write(first_row,col,header) # we have written first row which is the header of worksheet also.
    row=1
    for art in list_dict:
        for _key,_value in art.items():
            col=header_row.index(_key)
            ws.write(row,col,_value)
        row+=1 #enter the next row
    wb.close()

csv_data = CSV2list_dict('DB.csv')
header = ['col0','col1','col2']
order = 'col0' # the type of col0 is int
Export2excel('workfile.xlsx', header, csv_data, order)

答案 1 :(得分:0)

作为替代方法,您可以让Excel按如下方式进行转换:

import win32com.client as win32
import os

excel = win32.gencache.EnsureDispatch('Excel.Application')

src_filename = r"c:\my_folder\my_file.csv"
name, ext = os.path.splitext(src_filename)
target_filename = name + '.xls'

wb = excel.Workbooks.Open(src_filename)
excel.DisplayAlerts = False
wb.DoNotPromptForConvert = True
wb.CheckCompatibility = False
wb.SaveAs(target_filename, FileFormat=56, ConflictResolution=2) 

excel.Application.Quit()

Microsoft有一个File formats的列表供您使用,其中56用于xls

答案 2 :(得分:0)

如果您使用的是新的openpyxl 2.5,则无法使用。你需要删除2.5而不是pip install 2.4.9。

    import tablib

根据是数据集(一页)还是数据手册(多个),您需要声明:(此处更改)

    imported_data = tablib.Dataset()

    imported_data = tablib.Databook()

然后您可以导入数据。(此处更改)

    imported_data.csv = tablib.import_set(open('DB.csv', enconding='utf8').read())

未指定示例中的.csv tablib不知道格式。

    imported_data = tablib.import_set(open('DB.csv',encoding='utf8').read())

然后你可以打印以查看你拥有的各种选项。

    print(imported_data)
    print(imported_data.csv)
    print(imported_data.xlsx)
    print(imported_data.dict)
    print(imported_data.db)

然后写下你的文件。(这里没有变化)

    f = open('workfile.xls', 'wb')
    f.write(imported_data.xls)  # or .xlsx
    f.close()