在Python中使用Pandas.DataFrame对Excel操作笔记二 - 往现有的excel文件里面添加信息

由于前些天项目上特别的忙, 就没有来得及整理,趁着最近又失眠的机会,来谈谈如何更新现有excel里面的内容……

窗外虫鸣不断,屡屡凉风飘进窗子,有点秋天的感觉了。这要是再往前推个十年八年的,估计又得写上一篇 ”悲秋“ 之类的文章了,可惜岁月不饶人啦!…………就此打住……言归正传吧

需求场景:

某君负责的项目比较多,需要维护一个excel表格,来追踪当前的项目状态。其实项目的所有信息,都可以从公司的项目管理网站上查询到。但是有些项目的信息,属于公司机密。所以就只能有选择性的从公司网站 copy & paste,很多行很多列的信息,真是copy到手软,筛选到眼瞎啊……。 某君在和我吐槽这些事情的时候,我只能表示同情了。一边大骂某君不好好学习,一边想着如何给出优化方案……。

需要维护的表格格式如下(纯属虚构):

在Python中使用Pandas.DataFrame对Excel操作笔记二 - 往现有的excel文件里面添加信息_第1张图片

 我们分析了某君公司网站上面的表格,然后写个小爬虫来获取了所有的信息,保存数据到一个二维数组里面。先不考虑数据类型了,所有的数据,都先按字符串来处理了。

new_infor = [
                ['#10007', 'DELL_XXXX', '2018/1/7', 'Processing', '620,000', '6.0%', 'Kate'],
                ['#10008', 'ALI_XXXX', '2018/1/8', 'Processing', '100,000', '6.0%', 'Bob'],
                ['#10009', 'Apple_XXXX', '2018/1/9', 'Pending', '80,000', '9.0%', 'Ken']
            ]

然后用提取到的数据,创建一个dataframe对象。这里的 index必须设置为None,要不然插入表格的格式就不对了。

index=None 意思就是说,我们用这个二维数组创建DataFrame对象的时候,不需要自动创建索引了

df = pd.DataFrame(new_infor, index=None)

重点来了,DataFrame对象有了,该咋插入到excel里面咧……,客官继续往下看...

这里我们需要借助 openpyxl 的引擎来对excel做修改,核心代码如下:

from openpyxl import load_workbook
from openpyxl.styles import Alignment

# 创建一个engine='openpyxl'的 ExcelWriter 对象 writer
writer = pd.ExcelWriter(filename, engine='openpyxl')

try:
    # 加载指定的excel文件
    writer.book = load_workbook(filename)

    # 得到指定sheet的最后一行数据,因为是在原excel里面添加内容
    # 所以添加的信息应该从当前sheet最后一行的后面开始
    if startrow is None and sheet_name in writer.book.sheetnames:
        startrow = writer.book[sheet_name].max_row

    # 是否需要重新创建一下该sheet
    if truncate_sheet and sheet_name in writer.book.sheetnames:        
        idx = writer.book.sheetnames.index(sheet_name)        
        writer.book.remove(writer.book.worksheets[idx])        
        writer.book.create_sheet(sheet_name, idx)

    # copy existing sheets
    writer.sheets = {ws.title:ws for ws in writer.book.worksheets}
except FileNotFoundError:
    # file does not exist yet, we will create it
    pass

if startrow is None:
    startrow = 0

df.apply(axis = 1)  #axis = 1 指定逐行添加,如果axis = 0,就是逐列添加信息
df.to_excel(writer, sheet_name, startrow=startrow, index=False, header=False)

writer.save()

这样就会把数据添加到现有的excel里面了,但是,数据是默认的样式,如果原文件里面有一些样式,比如字体,列宽之类的,我们也可以在 writer.save()  之前来设定,实例代码如下。

# 创建一个字体
font = Font(name='Calibri')
# 设置对齐样式
align = Alignment(horizontal='left', vertical='center')

# 得到需要修改样式的sheet
bigDataSheet = writer.book[sheet_name]

# 得到最大行数、列数
allRows = bigDataSheet.max_row
allColumns = bigDataSheet.max_column

#循环所有单元格,设置样式
for r in range(startrow, allRows+1):
    for c in range(1, allColumns):
        cellObj = bigDataSheet.cell(row = r, column= c)
        cellObj.font = font
        cellObj.alignment = align

在Python中使用Pandas.DataFrame对Excel操作笔记二 - 往现有的excel文件里面添加信息_第2张图片 

样式还有很多,可以到 openpyxl 官方文档里面查看详细信息http://openpyxl.readthedocs.io/en/stable/。

有兴趣的可以一起探讨更好的方法,一起整理出一个函数或者一个类,以方便大家对Excel的操作。

 

你可能感兴趣的:(Python,Pandas)