阅读 841

Python操作表格,多列值相同求和

一天,同事说有个表格让我帮忙处理下,相同名称、相同水果,统计价格。

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
复制代码

最后运行就可以了

文章分类
开发工具
文章标签