python处理excel表格
批量生成表
对工作表中的出货记录按出货日期进行分类整理。这里使用字典来组织数据。字典的键是出货日期,值则是该日期对应的出货记录。因为一个出货日期可能对应多条出货记录,所以需要使用嵌套列表作为值的结构,即一个大列表的每个元素都是一个小列表,对应一条出货记录,小列表的元素则是要填写到出货清单中的4个数据——客户名、产品名称、出货数量、规格型号。
from openpyxl import load_workbook
workbook = load_workbook('F:\\代码文件\\第6章\\出货统计表.xlsx')
worksheet = workbook['Sheet1'] #确定读取哪个工作表
data = {} #创建一个空字典data。
for row in range(2, worksheet.max_row + 1):
date = worksheet['B' + str(row)].value.date() #读取出货日期、客户名、产品名称、出货数量和规格型号数据,
customer = worksheet['C' + str(row)].value
product = worksheet['D' + str(row)].value
number = worksheet['E' + str(row)].value
model = worksheet['G' + str(row)].value
info_list = [customer, product, number, model]
data.setdefault(date, [])
data[date].append(info_list)
for key, value in data.items():
print(key, value)
workbook_day = load_workbook('F:\\代码文件\\第6章\\出货清单模板.xlsx')
worksheet_day = workbook_day['出货清单模板']
for date in data.keys():
worksheet_new = workbook_day.copy_worksheet(worksheet_day)
worksheet_new.title = str(date)[-5:] #用出货日期中的月和日重命名工作表
worksheet_new.cell(row=2, column=5).value = date
i = 4 #逐行填写出货记录
for product in data[date]: worksheet_new.cell(row=i, column=2).value = product[0]
worksheet_new.cell(row=i, column=3).value = product[1]
worksheet_new.cell(row=i, column=4).value = product[2]
worksheet_new.cell(row=i, column=5).value = product[3]
i += 1
workbook_day.save('F:\\代码文件\\第6章\\产品出货清单.xlsx') #所有数据填写完毕后,另存工作簿。
因为range()函数有“左闭右开”的特性,为了取到worksheet.max_row的值,所以需要在worksheet.max_row上加1。本代码除了可以用于批量制作产品出货清单,还可以用于制作其他类型的固定格式工作表。
只需要注意根据实际处理的工作表修改第6~10行、第21行、第24~27行中的单元格位置。
批量替换工作簿的单元格数据
xlwings模块还能与Excel VBA结合使用,实现更加强大的数据输入和分析功能。
将6个工作簿中的单元格数据“背包”全部替换为“双肩包”。
from pathlib import Path import xlwings as XW
src_folder = Path('F:\\代码文件\\第6章\\月销售统计\\') #指定要打开的工作簿所在的文件夹路径 file_list = list(src_folder.g1ob('*.xlsx')) #获取该文件夹下所有扩展名为“.xlsx”的文件的路径列表 app = xW.App(visible=False, add_book=False) #启动Excel程序窗口,但不新建工作簿。
for i in file_list: #遍历列表中的路径 if i. name.startswith('~$'): #判断路径指向的文件的文件名是否以字符串'~$'开头 continue workbook = app.books.open(i) #打开路径指向的工作簿文件
for j in workbook.sheets: data = j['A2'].expand('table').value for index, val in enumerate(data): if val[2] == '背包': val[2]='双肩包' data[index]=val j['A2'].expand('table').value = data workbook.save() workbook.close() app.quit()如果用print()函数输出data的值,会发现它是一个嵌套列表,即一个大列表中的每个元素都是一个小列表,小列表对应一行数据,小列表中的每个元素则对应该行中每个单元格的数据。
以上就是全部代码,相互之间的缩进如上文所示。
Excel会在打开一个工作簿的同时生成一个文件名以“~$”开头的临时文件,如果Excel非正常退出,该临时文件会在文件夹中保留下来。这里的判断操作就是为了跳过这类临时文件。
App()是xlwings模块中的一个函数,该函数有两个常用参数。
参数visible用于设置Excel程序窗口的可见性:如果为True,表示显示Excel程序窗口;如果为False,表示隐藏Excel程序窗口。
参数add_book用于设置启动Excel程序窗口后是否新建工作簿:如果为True,表示新建一个工作簿;如果为False,表示不新建工作簿。
enumerate()是Python的内置函数,用于将一个可遍历的数据对象(如列表、元组、字符串等)组合为一个索引序列,可同时得到数据对象的索引及对应的值,一般与for语句结合使用。
enumerate()是Python的内置函数,用于将一个可遍历的数据对象(如列表、元组、字符串等)组合为一个索引序列,可同时得到数据对象的索引及对应的值,一般与for语句结合使用。
如果要套用代码,除了修改第3行代码中的文件夹路径外,还要注意修改第13行和第14行代码中要替换的数据和替换为的数据,以及要替换的数据所在的列号。
python基础工程师 文章被收录于专栏
python基础语法+做算法题的应用+python自动化办公+pymysql+python网络爬虫