使用python将段从一个Excel文件复制到另一个文件:xlrd和xlsxwriter

我正在尝试将Excel工作表的整个部分复制到另一个文件。 该段实际上是一个头/描述,主要描述文件的属性,创build的date等…所有这些需要一些细胞在前五行和前三列,从A1:C3说。 这里是我写的代码(为了举例,只做了3行):

import xlsxwriter import xlrd #### open original excelbook workbook = xlrd.open_workbook('hello.xlsx') sheet = workbook.sheet_by_index(0) # list of populated header rows row_header_list = ['A1','A2','A3','A4','A5'] i = 0 c = 0 while c <= 2: #### read original xcel book 3 rows by loop - counter is futher below data = [sheet.cell_value(c, col) for col in range(sheet.ncols)] #print data #### write rows to the new excel book workbook = xlsxwriter.Workbook('tty_header.xlsx') worksheet = workbook.add_worksheet() worksheet.write_row(row_header_list[i], data) print i,c,row_header_list[i], data i+=1 c+=1 print "new i is", i, "new c is", c, "list value", row_header_list[i],"data is", data workbook.close() 

计数器,数据,列表值 – 一切似乎是正确的,按照打印命令,然而,当我运行这个代码,在新创build的文件中,只有第3行被填充,行1和2是空的。 不明白为什么……为了testing这个问题,又举了一个例子 – 一个非常不雅的例子 – 没有循环,控制列表等等 – 只是简单的方法:

 import xlsxwriter import xlrd # open original excelbook workbook = xlrd.open_workbook('hello.xlsx') sheet = workbook.sheet_by_index(0) data1 = [sheet.cell_value(0, col) for col in range(sheet.ncols)] data2 = [sheet.cell_value(1, col) for col in range(sheet.ncols)] data3 = [sheet.cell_value(2, col) for col in range(sheet.ncols)] data4 = [sheet.cell_value(3, col) for col in range(sheet.ncols)] ### new excelbook workbook = xlsxwriter.Workbook('tty_header2.xlsx') worksheet = workbook.add_worksheet() worksheet.write_row('A1', data1) worksheet.write_row('A2', data2) worksheet.write_row('A3', data3) worksheet.write_row('A4', data4) workbook.close() 

在这种情况下,一切都很好,所有需要的数据都被转移了。 任何人都可以解释我第一个错在哪里? 谢谢。

我有的额外的麻烦是如果我,放置标题后,开始填充列,标题值变为NULL。 尽pipe如此,从“标题”单元格下面的单元格开始列的人口(在代码中,我提供了下面的第一列,从单元格6开始。关于如何解决它的任何想法?

 workbook = xlrd.open_workbook('tty_header2.xlsx.xlsx') sheet = workbook.sheet_by_index(0) data = [sheet.cell_value(row, 2) for row in range(23, sheet.nrows)] print data ##### writing new file with xlswriter workbook = xlsxwriter.Workbook('try2.xlsx') worksheet = workbook.add_worksheet('A') worksheet.write_column('A6', data) workbook.close() 

更新:这是修改后的代码,在迈克纠正之后:

 import xlsxwriter import xlrd # open original excelbook and access first sheet workbook = xlrd.open_workbook('hello_.xlsx') sheet = workbook.sheet_by_index(0) # define description rows row_header_list = ['A1','A2','A3','A4','A5'] i = 0 c = 0 #create second file, add first sheet workbook2 = xlsxwriter.Workbook('try2.xlsx') worksheet = workbook2.add_worksheet('A') # read original xcel book 5 rows by loop - counter is futher below while c <= 5: data = [sheet.cell_value(c, col) for col in range(1,5)] #print data # write rows to the new excel book worksheet.write_row(row_header_list[i], data) # print "those are initial values",i,c,row_header_list[i], data i+=1 c+=1 # print "new i is", i, "new c is", c, "list value", row_header_list[i],"data is", data ####### works !!! xlrd - copy some columns, disclaiming 23 first rows and writing data to the new file columnB_data = [sheet.cell_value(row, 2) for row in range(23, 72)] print columnB_data ##### writing new file with xlswriter - works, without (!!!) converting data to tuple worksheet.write_column('A5', columnB_data) columnG_data = [sheet.cell_value(row, 6) for row in range(23, 72)] #worksheet = workbook.add_worksheet('B') print columnG_data worksheet.write_column('B5', columnG_data) worksheet = workbook.add_worksheet('C') columnC_dta = [sheet.cell_value(row, 7) for row in range(23, 72)] print columnC_dta worksheet.write_column('A5', columnC_dta) #close workbook2 workbook2.close() 

运行这个后,我得到了以下错误“Traceback(最近调用最后一个):工作表中的第28行的文件”C:/Users/Michael/PycharmProjects/untitled/cleaner.py“,在worksheet.write_row(row_header_list [i],data) IndexError:列表索引超出范围Exception Exception:Exception('Exception catch in workbook destructor。Explicit close()may be required for workbook。',)in> ignored“。 “第28行”是指:

 worksheet.write_row(row_header_list[i], data) 

从头到尾循环运行整个段似乎都很好,并提供正确的输出,因此问题在下面。 如果我使用显式closures方法,build议,我将无法再使用add_sheet方法,因为它会运行在我目前的工作表。 在提供的文件中有“sheet.activate”和“sheet.select”方法,但它们似乎是出于美观的改进原因。 我试图把xlsxwriter的工作放在一个不同的variables中(尽pipe如果我把所有的“复制”过程放在最前面的话,我都不会“运行”) – 没有帮助

在每个循环中创build具有相同名称的新输出文件:

 while c <= 2: #... workbook = xlsxwriter.Workbook('tty_header.xlsx') worksheet = workbook.add_worksheet() 

因此,在每个循环中覆盖文件,只保存最后一行。

只要将其移出循环即可:

 workbook = xlsxwriter.Workbook('tty_header.xlsx') worksheet = workbook.add_worksheet() while c <= 2: #... workbook.close()