需求:我要在指定的excel文件中追加写入数据,分成按行追加与按列追加2种方式。文件中原有数据的行数与列数未知,原有数据不可被覆盖。
这里记录一下我用openpyxl实现的方法。
条件:test.xlsx是已存在的文件,'sample1'这个sheet页是数据写入的目标页。
此方法使用worksheet.max_row获取指定sheet中的最大行数,接着使用append将一个list类型的值添加到最大行数的下一行。
import openpyxl
if __name__ == '__main__':
# 指定文件路径
file_full_path = r'D:\Test\test.xlsx'
# sheet名称
sheet_name = 'sample1'
# 获取指定的文件
wb = openpyxl.load_workbook(file_full_path)
# 获取指定的sheet
ws = wb[sheet_name]
# 获得最大行数
max_row_num = ws.max_row
# 获得最大列数
max_col_num = ws.max_column
# 将当前行设置为最大行数
ws._current_row = max_row_num
# 使用append方法,将行数据按行追加写入
values = ['Jack', '12', '2023/11/12', 'Failed']
ws.append(values)
# 保存文件
wb.save(file_full_path)
打开文件确认,新的数据已按行追加写入,结果符合预期。
这个方法是我在发现append之前调试成功的,作为参考也放上来,最终效果一样。
import openpyxl
if __name__ == '__main__':
# 指定文件路径
file_full_path = r'D:\Test\test.xlsx'
# sheet名称
sheet_name = 'sample1'
# 获取指定的文件
wb = openpyxl.load_workbook(file_full_path)
# 获取指定的sheet
ws = wb[sheet_name]
# 获得最大行数
max_row_num = ws.max_row
# 获得最大列数
max_col_num = ws.max_column
values = ['Lisa', '35', '2023/11/27', 'Passed']
# 追加一行数据
for i in range(1, max_col_num + 1, 1):
ws.cell(max_row_num + 1, i).value = values[i - 1]
# 保存文件
wb.save(file_full_path)
for i in range(1, max_col_num + 1, 1)指的是以1为起点,max_col_num+1终点,1为步长递增。按照C语言的方式理解,就是for(uint8 i = 1; i < max_col_num+1, i++)。
values是一个list类型的变量,从索引0开始依次取值,将值添加到(3行,1列)、(3行,2列)、(3行,3列)、(3行,4列)单元格中。
最后打开文件确认,确认行数据被成功写入excel文件中。
条件:test.xlsx是已存在的文件,'sample2'这个sheet页是数据写入的目标页。
以下是运行成功的代码,往指定sheet页中追加1列数据。
import openpyxl
if __name__ == '__main__':
# 指定文件路径
file_full_path = r'D:\Test\test.xlsx'
# sheet名称
sheet_name = 'sample2'
# 获取指定的文件
wb = openpyxl.load_workbook(file_full_path)
# 获取指定的sheet
ws = wb[sheet_name]
# 获得最大行数
max_row_num = ws.max_row
# 获得最大列数
max_col_num = ws.max_column
values = ['Jack', '17', '2023/10/2', 'Failed']
for each in values:
# 通过row关键字指定行,colunm关键字指定列,均从1开始
ws.cell(row=values.index(each) + 1, column=max_col_num+1, value=each)
# 保存文件
wb.save(file_full_path)
打开工作簿确认,列数据被追加写入,结果符合预期。
使用openpyxl处理单元格数据时,起始坐标从(1,1)开始,不是(0,0)。
假如把cell(3,1)写成cell(3,0) ,会报错ValueError: Row or column values must be at least 1
※参考文章
https://blog.csdn.net/Gsdxiaohei/article/details/82048180
https://fishc.com.cn/thread-144721-1-1.html