每日出货都记录在一张excel表格中,月底对账需要一张汇总的清单,手动复制粘贴太繁琐了,写个小工具自动将所有数据提取出来汇总到新的文件中
一、思路(因为是自己用,所以简单想了,能用就行)
1、先找到出货记录的文件夹,因为一份出货就是一张excel文件,所以文件夹下有很多excel文件,首先能遍历出文件夹下所有excel文件,这个直接os.listdir(“文件夹路径”)就可以了
2、将遍历出来的excel文件名组合成绝对路径
3、有了excel文件的绝对路径,就可以用openpyxl一个个的读取内容
4、每个excel文件中不止一个产品,所以需要循环读取,读到某一行一列是空格,就说明当前excel文件读完了,再读下一个excel文件
5、汇总写入新的excel文件,我是读一行写一行,一行7列内容,所以又需要在每行写完7列后换行写
二、代码
import openpyxl
import os
import re
import time
def excel_mk_dir(mk_name):
desktop_dir = "C:\\Users\\Administrator\\Desktop\\" # 桌面地址
path = desktop_dir + mk_name # 文件夹在桌面的全路径
excel_dir = os.listdir(path) # 获取文件夹下面的所有文件
excel_dir_new = []
# 判断文件夹下面是否有”~$“的临时文件,没有~$的提取出来做成新的文件列表
for k in range(0, len(excel_dir)):
if '~$' not in excel_dir[k]:
excel_dir_new.append(excel_dir[k])
# 循环取出文件夹下面的文件名,并将文件名组合到绝对路径下面
excel_path_list = []
for i in range(0, len(excel_dir_new)):
aaaa = re.findall(".*?xlsx", str(excel_dir_new[i]))
# print(aaaa)
excel_path = path + aaaa[0]
excel_path_list.append(excel_path)
return excel_path_list # 返回某文件夹下面所有文件的全路径
def manage_excel_file_content_1(mk_name):
row_i = 2 # 新文件第2行开始写,每次写完一行后+1,好换行写
excel_file_path = excel_mk_dir(mk_name)
# print(excel_file_path)
new_file = openpyxl.Workbook() # 使用openpyxl写入新的excel文件中
new_file_sheet = new_file.active # openpyxl写入对象
t = time.localtime()
t1 = time.strftime("%Y-%m-%d", t) # 取年月日作为文件名
new_file_name = "XXX客户名称%s" % t1
# 文件循环
for i in range(0, len(excel_file_path)):
excel_file = openpyxl.load_workbook(excel_file_path[i]) # 使用openpyxl循环打开excel文件
# print(excel_file)
excel_sheet = excel_file['Sheet1']
# 做个循环判断,当第1列某行数据为空时,说明当前文件里面的数据已取到最后一个了,跳出取值循环,进文件循环里
for k in range(8, 200): # k表示行数,这里从第八行开始取,数据不多,所以最大取200
excel_data = excel_sheet.cell(row=k, column=1).value
# 第k行第1列数据为空,结束当前循环
if excel_data is None:
break
else:
for j in range(1, 8): # 这里是列数,每行只取1-7列的值
data = excel_sheet.cell(row=k, column=j).value # 取出读文件的值
new_file_sheet.cell(row_i, j).value = data # 将读文件值写入新文件,openpyxl读写都是用cell()方法
row_i += 1 # 记录已写入多少行了,循环结束+1
new_file.save(new_file_name + ".xlsx") # 新文件保存
if __name__ == '__main__':
mk_name_wksyh_1 = "XXX客户\\" # 文件夹名称
manage_excel_file_content_1(mk_name_wksyh_1)