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语句结合使用。

如果要套用代码,除了修改第3行代码中的文件夹路径外,还要注意修改第13行和第14行代码中要替换的数据和替换为的数据,以及要替换的数据所在的列号。


#Python#
python基础工程师 文章被收录于专栏

python基础语法+做算法题的应用+python自动化办公+pymysql+python网络爬虫

全部评论
这个工作中应该能用到
1 回复 分享
发布于 2022-08-22 08:06 陕西

相关推荐

2024-12-16 21:59
东北大学 Java
水杉1:我评估了仨月了
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务