2016-02-02 41 views
0

我正在编写一个简单的代码,将python上的csv与Tablib转换回xls。Tablib导出损坏的文件

据我所知,如果您导入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无法读取编码数据?

回答

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

+0

这工作,但**只是改变扩展名。我所拥有的是一个csv文件,其中每行都存储在一个单元格中,我希望那些分隔在不同列中的文件。 Tablib导入不会自行分割,我不认为你的代码可以以任何方式编辑文件的内容。 –

+0

输出文件应该是真正的XLS格式。如果你在Excel中打开它,它看起来是一样的,但如果你在记事本中打开它,你应该看到不同之处。代码可以修改以满足您的需求,我会快速查看。你可以添加一个样本到你的问题? –

+0

垃圾文件提供程序没有指定分隔符,所以由于区域设置,CSV文件未正确显示。我会将此标记为正确的,对于混淆抱歉。 如果将来有人阅读,CSV文件的第一行应为 'sep =,'或其他一些分隔符。 –

1

这两个功能允许您从CSV导入,导出后的Excel文件

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) 
+0

我改变了'开(FILE_NAME)''来开(FILE_NAME,编码=“utf-8)'来让它正确地读取我的文件,但现在我迎来了'ValueError:int()的无效字面值,其基数为10:'VALČIUKAS''。我假设它读取一个字符串作为一个数字? –

0

如果您使用的是新的openpyxl 2.5,这将不起作用。你需要删除2.5,而不是pip安装2.4.9。

import tablib 

取决于它是否是一个数据集(1页)或数据手册(多),你需要申报:(这里的变化)

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()