[英]Using xlwt, create a new sheet anytime xls row limit is reached
我目前正在編寫一個python腳本,該腳本將使用任意數量的csv文件並從中創建.xls文件。 不幸的是,其中某些csv文件的行數大於65536,這意味着它們不能存在於一個.xls工作表中。 我想做的是想出一種當達到該行數時生成新工作表的方法。 供參考,這是我當前正在使用的代碼:
import csv, xlwt, glob, ntpath
files = glob.glob("C:/Users/waldiesamuel/326/*.csv")
bold = xlwt.easyxf('font: bold on')
for i in files:
org_file = open(i, 'r')
reader = csv.reader((org_file), delimiter=",")
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("SQL Results")
path = ntpath.dirname(i)
file = ntpath.basename(i)
for rowi, row in enumerate(reader):
for coli, value in enumerate(row):
if coli == 0:
sheet.write(rowi,coli,value,bold)
else:
sheet.write(rowi,coli,value)
workbook.save(path + file + '.xls')
我的想法是周圍
for rowi, row in enumerate(reader):
我可以使用if語句來檢查row是否大於65536,但是我不確定如何從那里創建一個新變量。
編輯:
我找到了一個可能的解決方案,但失敗了,並給出了答案。 我將其作為編輯內容包括在內,以便每個人都可以遵循以下思想過程:
如此看來,由於xlwt進行檢查以明確確保您添加的行不超過65536行,因此這可能不可行。 通過將工作表變量更改為dict,我想出了一個我認為是聰明的解決方案,如下所示:
sheet = {1: workbook.add_sheet("SQL Results")}
然后初始化兩個變量以用作計數器:
sheet_counter = 1
dict_counter = 2
然后將其用於第一個for循環中的條件,該條件將重置行索引並允許xlwt繼續寫入新工作表:
if rowi == 65536:
sheet[dict_counter] = workbook.add_sheet("SQL Results (" + str(dict_counter) + ")")
sheet_counter += 1
dict_counter += 1
rowi = 1
else:
pass
不幸的是,即使這樣做仍然會導致xlwt row
變量的增量超過65536時引發以下錯誤:
Traceback (most recent call last):
File "xlstest.py", line 35, in <module>
sheet[sheet_counter].write(rowi,coli,value,bold)
File "C:\Users\waldiesamuel\AppData\Local\Programs\Python\Python35-32\lib\site-packages\xlwt\Worksheet.py", line 1088, in write
self.row(r).write(c, label, style)
File "C:\Users\waldiesamuel\AppData\Local\Programs\Python\Python35-32\lib\site-packages\xlwt\Worksheet.py", line 1142, in row
self.__rows[indx] = self.Row(indx, self)
File "C:\Users\waldiesamuel\AppData\Local\Programs\Python\Python35-32\lib\site-packages\xlwt\Row.py", line 43, in __init__
raise ValueError("row index was %r, not allowed by .xls format" % rowx)
ValueError: row index was 65537, not allowed by .xls format
xlwt是
供開發人員用來生成與Microsoft Excel版本95至2003兼容的電子表格文件的庫。(請參見此處 )
在那些excel版本中,最大行數受65536限制。請參見此處 。
嘗試使用與Excel 2007兼容的XlsxWriter ,並且行數最多可以為1,048,576。
解決方案的問題在於,您試圖將rowi
(來自enumerate()
語句)重置為1,但是在下一個循環中將其重置。
我認為,實現所需目標的最簡單方法是更改引用行和工作表的方式。 您可以使用樓層除法和模運算符分別為您提供工作表號和行號。
if rowi % 65536 == 0:
sheet[dict_counter] = workbook.add_sheet("SQL Results (" + str(dict_counter) + ")")
sheet_counter += 1 # Not sure if you use this anywhere else - it can probably go
dict_counter += 1
else:
pass
sheetno = rowi // 65536
rowno = rowi %% 65536
sheet[sheetno].write(rowno,coli,value,bold)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.