我似乎无法找到一种方法来返回xlwt.Workbook()中工作表中列数的值。我们的想法是在目录中获取一大堆.xls文件并将它们合并为一个。我遇到的一个问题是在编写下一个文件时更改列位置。这就是我到目前为止所做的工作:
import xlwt, xlrd, os
def cbc(rd_sheet, wt_sheet, rlo=0, rhi=None,
rshift=0, clo=0, chi=None, cshift = 0):
if rhi is None: rhi = rd_sheet.nrows
if chi is None: chi = 2#only first two cols needed
for row_index in xrange(rlo, rhi):
for col_index in xrange(clo, chi):
cell = rd_sheet.cell(row_index, col_index)
wt_sheet.write(row_index + rshift, col_index + cshift, cell.value)
Dir = '/home/gerg/Desktop/ex_files'
ext = '.xls'
list_xls = [file for file in os.listdir(Dir) if file.endswith(ext)]
files = [Dir + '/%s' % n for n in list_xls]
output = '/home/gerg/Desktop/ex_files/copy_test.xls'
wbook = xlwt.Workbook()
wsheet = wbook.add_sheet('Summary', cell_overwrite_ok=True)#overwrite just for the repeated testing
for XLS in files:
rbook = xlrd.open_workbook(XLS)
rsheet = rbook.sheet_by_index(0)
cbc(rsheet, wsheet, cshift = 0)
wbook.save(output)
list_xls返回:
['file2.xls', 'file3.xls', 'file1.xls', 'copy_test.xls']
文件返回:
['/home/gerg/Desktop/ex_files/file2.xls', '/home/gerg/Desktop/ex_files/file3.xls', '/home/gerg/Desktop/ex_files/file1.xls', '/home/gerg/Desktop/ex_files/copy_test.xls']
我的问题是如何每次将每个写入xlwt.workbook的文件扫描2次。此代码为我提供了保存到.../copy_test.xls
的第一个文件。文件列表也有问题吗?我有一种感觉可能会有。
这是Python2.6,我在windows和linux之间反弹。
感谢您的帮助, GM
答案 0 :(得分:1)
您只使用每个输入电子表格中的前两列。您不需要“xlwt.Workbook()中工作表中的列数”。您的代码中已经有cshift
机制,但您没有使用它。您需要做的就是更改外部块中的循环,如下所示:
for file_index, file_name in enumerate(files):
rbook = xlrd.open_workbook(file_name)
rsheet = rbook.sheet_by_index(0)
cbc(rsheet, wsheet, chi = 2, cshift = file_index * 2)
一般情况下,更改行
if chi is None: chi = 2
在你的功能中
if chi is None: chi = rsheet.ncols
并按照我在上面的代码中所做的那样将chi=2
作为arg传递。
我不明白你覆盖覆盖检查的理由......当然在您的应用程序中,覆盖现有的单元格值是不正确的?
你说“这段代码给了我第一个保存到... / copy_test.xls的文件”。输入顺序中的第一个是file2.xls。您显示的代码是覆盖以前的输入,并将为您提供LAST文件(按输入顺序),而不是第一个...也许您错了。注意:最后一个输入文件'copy_test.xls'很可能是以前的OUTPUT文件;也许你的输出文件应放在一个单独的文件夹中。