Python自动化处理Excel脚本

2020-02-26  本文已影响0人  cef802fb1136

经常看到身边的同事(包括自己)在弄Excel表格的时候,各种复制粘贴非常麻烦,尤其是每天做一样的工作,重复枯燥费时间,于是打算写个小脚本自动更新Excel表格。

image.png

我们以这个表格为例,给大家看下表格长啥样儿,我们要更新的列是日期-字段9里面的数据,其中最后两列是套公式自动计算的。

我们这里主要使用pandasopenpyxl这两个库进行操作。

思路

那么思路有了就开始写代码吧
首先导包:

from openpyxl import load_workbook # 读取Excel文件
from datetime import date, timedelta # 时间处理
import pandas as pd # 读取文件
import os # 操作本地文件
import logging # 打日志

然后新建个类,初始方法,两个方法,初始方法主要就是一些基本的配置参数、时间啊、文件名、文件路径之类的。第一个方法是获取当前表格某列的最大行数,在此基础上自增行数。第二个方法就是写入数据了。

class Writing_to_excel():
    def __init__(self):
        """
        基本参数配置:时间参数、文件路径、源文件名、临时文件名、工作表名、字段名
        """
        self.data_ytd = (date.today() + timedelta(days=-1)).strftime("%Y/%m/%d")
        self.filepath = '/Users/jason/Desktop/'
        self.filename = 'test_data.xlsx'
        self.filename_replace = 'tmp_test_data.xlsx'
        self.sheet_name = '汇总'
        self.column_name = '日期'
    def get_next_row(self):
        """
        拷贝出新文件,获取行号
        防止破坏源文件
        :return: next_row
        """
        os.system(f'cp {self.filepath}{self.filename} {self.filepath}{self.filename_replace}')
        pd_data = pd.read_excel(f'{self.filepath}{self.filename_replace}', sheet_name=self.sheet_name)
        col1 = pd_data[[self.column_name]].dropna()
        _maxrow = col1.shape[0]
        next_row = _maxrow + 2
        pd_data.to_excel(f'{self.filepath}{self.filename_replace}', sheet_name=self.sheet_name)
        os.system(f'rm {self.filepath}{self.filename_replace}')
        self.next_row = next_row
        return

接下来就是填入数据的方法:

    def write_data_to_excel(self):
        """
        写入数据
        :return:
        """
        wb = load_workbook(f'{self.filepath}{self.filename}')
        stotal = wb['汇总']
        stotal[f'A{self.next_row}'] = self.data_ytd
        stotal[f'B{self.next_row}'] = 77
        stotal[f'C{self.next_row}'] = 77
        stotal[f'D{self.next_row}'] = 77
        stotal[f'E{self.next_row}'] = 77
        stotal[f'F{self.next_row}'] = 77
        stotal[f'G{self.next_row}'] = 77
        stotal[f'H{self.next_row}'] = 77
        stotal[f'I{self.next_row}'] = 77
        stotal[f'J{self.next_row}'] = 77
        wb.save(f'{self.filepath}{self.filename}')

用我们动态获取到的最大行数,来填入每个单元格的数据,这个就比较体力活了,暂时没想到更好的方法。最后save文件

最后,运行脚本

if __name__ == '__main__':
    try:
        wte = Writing_to_excel()
        wte.get_next_row()
        wte.write_data_to_excel()
        logging.info(f"{wte.filename}   文件数据操作完成")
        print(f"{wte.filename}  文件数据操作完成")
    except Exception as e:
        logging.error(f"{wte.filename}操作失败!原因:{e}")
        print(e)

细心的同学可以发现,我做了个简单的日志,方便查看报错的情况。
上运行结果:


image.png

最后,完整代码如下:

from openpyxl import load_workbook
from datetime import date, timedelta
import pandas as pd
import os
import logging

LOG_FORMAT = "%(asctime)s %(name)s %(levelname)s %(pathname)s %(message)s "
DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT, filename="excel_operate.log")


class Writing_to_excel():
    def __init__(self):
        """
        基本参数配置:时间参数、文件路径、源文件名、临时文件名、工作表名、字段名
        """
        self.data_ytd = (date.today() + timedelta(days=-1)).strftime("%Y/%m/%d")
        self.filepath = '/Users/jason/Desktop/'
        self.filename = 'test_data.xlsx'
        self.filename_replace = 'tmp_test_data.xlsx'
        self.sheet_name = '汇总'
        self.column_name = '日期'

    def get_next_row(self):
        """
        拷贝出新文件,获取行号
        防止破坏源文件
        :return: next_row
        """
        os.system(f'cp {self.filepath}{self.filename} {self.filepath}{self.filename_replace}')
        pd_data = pd.read_excel(f'{self.filepath}{self.filename_replace}', sheet_name=self.sheet_name)
        col1 = pd_data[[self.column_name]].dropna()
        _maxrow = col1.shape[0]
        next_row = _maxrow + 2
        pd_data.to_excel(f'{self.filepath}{self.filename_replace}', sheet_name=self.sheet_name)
        os.system(f'rm {self.filepath}{self.filename_replace}')
        self.next_row = next_row
        return

    def write_data_to_excel(self):
        """
        写入数据
        :return:
        """
        wb = load_workbook(f'{self.filepath}{self.filename}')
        stotal = wb[self.sheet_name]
        stotal[f'A{self.next_row}'] = self.data_ytd
        stotal[f'B{self.next_row}'] = 77
        stotal[f'C{self.next_row}'] = 77
        stotal[f'D{self.next_row}'] = 77
        stotal[f'E{self.next_row}'] = 77
        stotal[f'F{self.next_row}'] = 77
        stotal[f'G{self.next_row}'] = 77
        stotal[f'H{self.next_row}'] = 77
        stotal[f'I{self.next_row}'] = 77
        stotal[f'J{self.next_row}'] = 77
        wb.save(f'{self.filepath}{self.filename}')


if __name__ == '__main__':
    try:
        wte = Writing_to_excel()
        wte.get_next_row()
        wte.write_data_to_excel()
        logging.info(f"{wte.filename}   文件数据操作完成")
        print(f"{wte.filename}  文件数据操作完成")
    except Exception as e:
        logging.error(f"{wte.filename}操作失败!原因:{e}")
        print(e)

上一篇 下一篇

猜你喜欢

热点阅读