使用 python 将段从一个 Excel 文件复制到另一个文件:xlrd 和 xlsxwriter
Copying the segment from one Excel file to another with python: xlrd and xlsxwriter
我正在尝试将 Excel sheet 的整个片段复制到另一个文件。
段其实就是一个header/description,主要是描述文件的属性,创建日期等等...
所有这一切都需要一些单元格在前五行和前三列,比如 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()
计数器、数据、列表值 - 根据打印命令,一切似乎都是正确且准时的,但是,当我 运行 这段代码时,在新创建的文件中只有第 3 行得到已填充,第 1 行和第 2 行为空。不明白为什么...
为了测试这个问题,做了另一个 example-a 非常不优雅的 - 没有循环,控制列表,etc-just 直截了当的方法:
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()
在这种情况下,一切正常,所有需要的数据都已传输。
任何人都可以向我解释第一个有什么问题?谢谢。
我遇到的另一个麻烦是,如果我在放置 header 之后开始填充列,header 值变为 NULL。尽管有我,但从 "header" 单元格下方的单元格开始列填充(在代码中,我在其下方提供第 1 列,从单元格 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()
更新:这是修改后的代码,经过 Mike 的更正:
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(最近一次调用最后一次):
文件 "C:/Users/Michael/PycharmProjects/untitled/cleaner.py",第 28 行,位于
worksheet.write_row(row_header_list[i], 数据)
IndexError:列表索引超出范围
Exception Exception: Exception('Exception caught in workbook destructor. Explicit close() may be required for workbook.',) in > ignored”。
"line 28"指的是:
worksheet.write_row(row_header_list[i], data)
运行从开始到结束循环的整个段似乎都很好并且提供了正确的输出,因此问题在下面。
如果我按照建议使用显式关闭方法,我将无法再次使用 add_sheet 方法,因为它将 运行 覆盖我当前的 sheet。在提供的文档中有 "sheet.activate" 和 "sheet.select" 方法,但它们似乎是出于外观改进的原因。我试图将 xlsxwriter 的工作放入不同的变量中(尽管如果我将所有 "copying" 过程放在顶部,我不会认为 "workbook" 被 运行 结束) - 没有帮不上忙
您在每个循环中创建了同名的新输出文件:
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()
我正在尝试将 Excel sheet 的整个片段复制到另一个文件。 段其实就是一个header/description,主要是描述文件的属性,创建日期等等... 所有这一切都需要一些单元格在前五行和前三列,比如 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()
计数器、数据、列表值 - 根据打印命令,一切似乎都是正确且准时的,但是,当我 运行 这段代码时,在新创建的文件中只有第 3 行得到已填充,第 1 行和第 2 行为空。不明白为什么... 为了测试这个问题,做了另一个 example-a 非常不优雅的 - 没有循环,控制列表,etc-just 直截了当的方法:
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()
在这种情况下,一切正常,所有需要的数据都已传输。 任何人都可以向我解释第一个有什么问题?谢谢。
我遇到的另一个麻烦是,如果我在放置 header 之后开始填充列,header 值变为 NULL。尽管有我,但从 "header" 单元格下方的单元格开始列填充(在代码中,我在其下方提供第 1 列,从单元格 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()
更新:这是修改后的代码,经过 Mike 的更正:
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(最近一次调用最后一次): 文件 "C:/Users/Michael/PycharmProjects/untitled/cleaner.py",第 28 行,位于 worksheet.write_row(row_header_list[i], 数据) IndexError:列表索引超出范围 Exception Exception: Exception('Exception caught in workbook destructor. Explicit close() may be required for workbook.',) in > ignored”。 "line 28"指的是:
worksheet.write_row(row_header_list[i], data)
运行从开始到结束循环的整个段似乎都很好并且提供了正确的输出,因此问题在下面。 如果我按照建议使用显式关闭方法,我将无法再次使用 add_sheet 方法,因为它将 运行 覆盖我当前的 sheet。在提供的文档中有 "sheet.activate" 和 "sheet.select" 方法,但它们似乎是出于外观改进的原因。我试图将 xlsxwriter 的工作放入不同的变量中(尽管如果我将所有 "copying" 过程放在顶部,我不会认为 "workbook" 被 运行 结束) - 没有帮不上忙
您在每个循环中创建了同名的新输出文件:
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()