
1. 环境:
- mac os
- python3
操作表格需要openpyxl,只支持xlsx格式
pip install openpyxl
如果没有安装pip , 需要先下载安装
2.思路
假设姓名是A列,水果是B列,价格是C列。
把两列值作为字典的key, 价格作为value, 循环每行的时候,把value叠加起来。
- 保存数据到字典
假设表格在当前目录路径为y.xlsx
from openpyxl import Workbook
from openpyxl import load_workbook
wb = load_workbook("y.xlsx") #加载表格
sheetnames = wb.sheetnames #可能存在多个sheet
for sheetname in sheetnames:
sheet = wb[sheetname]
dic = {}
for cell in sheet["A"]:
bCell = sheet["B"][cell.row - 1]
cCell = sheet["C"][cell.row - 1]
name = cell.value + '+' + bCell.value #将A、B列的每一行合并成一个固定字符串:A+B,作为key
nameValue = cCell.value #C列的值,作为value
if name in dic:
nameValue = dic[name] + cCell.value
dic[name] = nameValue
- 输出结果到新表格
上一个步骤的dic中就已经保存了我们的所有答案了,就需要输出到新的表格
newb = Workbook()
neSheet = newb.create_sheet(sheetname,0)
index = 1
for key in dic:
value = dic[key]
aKey = key.split('+')[0] #拆分之前的字符串
bKey = key.split('+')[1]
neSheet['A'+str(index)] = aKey
neSheet['B'+str(index)] = bKey
neSheet['C'+str(index)] = value
index = index + 1
newb.save(targetFileNewPath) #写完之后保存到某一个路径
- 遍历文件夹
考虑到同事根本不会脚本,所以干脆把所有文件都遍历了,根据一定的命名规则找到他想要的表格。
他存放的目录结构,假设他想要处理的文件以BG开头的xlsx表格
|---excel.py
|---2020.2.9
| |--BGaa.xlsx
| |--BGbb.xlsx
| |--cc.xlsx
|---2020.2.10
| |--BGbb.xlsx
| |--cc.xlsx
将上面两个步骤一起封装成方法,像下面这样:
from openpyxl import Workbook
from openpyxl import load_workbook
import os,sys
# 目前只扩展3列
ONE_SHEET = 'A'
TWO_SHEET = 'B'
THREE_SHEET = 'C'
FILE_START = 'BG'
FILE_END = '.xlsx'
NEW_START = 'new' #对新生成的表格,在原表格名字前面加一个new
PWD = sys.path[0] #当前路径
newb = Workbook()
# 创建新的表格
def createNewSheet(sheetname,dic):
neSheet = newb.create_sheet(sheetname,0)
index = 1
for key in dic:
value = dic[key]
aKey = key.split('+')[0]
bKey = key.split('+')[1]
neSheet['A'+str(index)] = aKey
neSheet['B'+str(index)] = bKey
neSheet['C'+str(index)] = value
index = index + 1
# 多列值相同,求和
def sumAB(sheet, sheetname):
dic = {}
for cell in sheet[ONE_SHEET]:
bCell = sheet[TWO_SHEET][cell.row - 1]
cCell = sheet[THREE_SHEET][cell.row - 1]
name = cell.value + '+' + bCell.value #将A、B列的每一行合并成一个固定字符串:A+B,作为key
nameValue = cCell.value #C列的值,作为value
if name in dic:
nameValue = dic[name] + cCell.value
dic[name] = nameValue
createNewSheet(sheetname, dic)
# 处理某个文件夹下面所有带FILE_START前缀、FILE_END后缀的表格
def dealFile(filedir):
fullPwd = PWD +'/'+filedir + "/"
fileNames = os.listdir(fullPwd) #当前文件夹下面的所有文件名称
for filename in fileNames:
if filename.startswith(FILE_START) and filename.endswith(FILE_END):
targetFilePath = fullPwd + filename #原表格路径
targetFileNewPath = fullPwd + NEW_START + filename #新表格也在原表格目录生成,加前缀
wb = load_workbook(targetFilePath)# 创建新的表格
sheetnames = wb.sheetnames
for sheetname in sheetnames: #有多个表格
sheet = wb[sheetname]
sumAB(sheet, sheetname)
newb.save(targetFileNewPath) #保存表格到新的路径
print("新表格的文件路径 ==> " + targetFileNewPath)
for root,dirs,files in os.walk(PWD):
for dir in dirs: #遍历当前所有文件夹
dealFile(dir)
3.生成.exe
他使用的是window,为了不让他直接操作脚本,转换成exe。
先安装pyinstaller
pip install pyinstaller
转换成exe
pyinstaller excel.py
mac系统都会提示upx找不到的错误,再安装upx
brew install upx
最后运行就可以了