python - 使用 xlwt,在达到 xls 行限制时创建一个新工作表

标签 python xlwt

我目前正在编写一个 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 行,因此这可能不可行。我想出了一个我认为聪明的解决方案,将工作表变量更改为字典,如下所示:

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

不幸的是,即使这样做,当 row 变量增量超过 65536 时,仍然会导致 xlwt 抛出以下错误:

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

最佳答案

您的解决方案的问题是您试图将 rowi (来自您的 enumerate() 语句)重置回 1,但它在下一个循环。

我认为,实现您想要的效果的最简单方法是更改​​引用行和工作表的方式。您可以使用 floor divisionmodulo运算符分别为您提供工作表编号和行编号。

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)

关于python - 使用 xlwt,在达到 xls 行限制时创建一个新工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39086502/

相关文章:

python浮点错误

python - 以编程方式在 Python 中创建带有下拉单元格的 XLS

pandas - 是否可以使用 Python 将工作表插入到现有工作簿中?

Python:如何模拟类属性初始化函数

python - 用于建议的隐式 Python 库的空白结果

python - 如何使用特定的列索引对 numpy 2D 数组行进行降序或升序排序

python - 使用 numpy.fft 的自相关统计缩放

Python Excel (xlrd, xlwt) - 如何从一个单元格复制样式并将其放在另一个单元格上

python : Get Active Sheet in xlrd? 以及在 Python 中读取和验证 excel 文件的帮助

python - GAE/webapp2 : Serving Excel file created by script using xlwt