2016-02-02 72 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()