我目前正在编写一个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语句检查行是否大于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
答案 0 :(得分:1)
xlwt是
供开发人员用于生成电子表格文件的库 兼容Microsoft Excel版本95到2003。 (见here)
在这些excel版本中,最大行数限制为65536.请参阅here。
尝试符合Excel 2007的XlsxWriter,行数最多可达1,048,576。
答案 1 :(得分:1)
您的解决方案的问题在于您尝试将rowi
(来自您的enumerate()
语句)重置为1,但会在下一个循环中重置。
我认为,实现您想要的最简单方法是更改引用行和表的方式。您可以使用floor division和modulo运算符分别为您提供表格编号和行号。
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)