利用load_workbook将数据写入excel模板

一、背景

问题:通常情况下,用pandas处理数据后,将结果直接写入excel文件中,比如df.to_excel()。但是这样的结果文件没有格式,输出后还需要在excel中设置单元格样式,比如颜色、字体、数值格式、条件格式等。

解决办法:openpyxl能够读取excel文件的格式。

1、用openpyxl.load_workbook读取一个已经做好格式的xlsx模板文件;

2、利用cell对象将数据写入;

3、最后将wb对象保存至一个新的excel文件。

二、实现过程

1、excel模板文件(设置颜色、字体、数值格式等)

利用load_workbook将数据写入excel模板_第1张图片

2、代码实现

# 1、导入需要的包
from openpyxl.reader.excel import load_workbook
import pandas as pd

# 2、读excel文件模板,生成wb对象、ws对象
fdir = r".\\"
wb = load_workbook(fdir+"myexcel_模板.xlsx") # 创建“工作簿对象”
sheets = wb.sheetnames  # “工作簿对象”调用其属性,# 获取workbook中所有的工作表名称,以list形式
sheet_1 = wb[sheets[0]] # “工作簿对象”调用其属性,返回“工作表对象”

# 3、拷贝待写入的结果数据df
writed_df = pd.DataFrame({'姓名':['张三','李四','王五'],'年龄':[12,13,14],'得分':[1000,2000,3000]})

# 4、按【先列后行】去循环单元格
for c in range(writed_df.shape[1]):
    for r in range(writed_df.shape[0]):
        data = writed_df.iloc[r,c] # bug:nan可以赋值,但是NaT报错
        sheet_1.cell(row=r+2,column=c+1).value = data ## df(0,0)位置的数据,对齐,excel单元格(2,1)位置
print("填充完毕...")  

# 5、保存
from datetime import date
today_my = str(date.today().year)+"."+str(date.today().month)+"."+str(date.today().day)
print(today_my) # 创建今日日期的字符串
# 最终保存
wb.save(fdir+'结果数据_at%s.xlsx'%today_my)

3、结果文件

利用load_workbook将数据写入excel模板_第2张图片

三、load_workbook相关知识

1、导入需要的包

from openpyxl.reader.excel import load_workbook

2、读excel模板文件,创建“工作簿对象”

fdir = r".\\"
wb = load_workbook(fdir+"myexcel_模板.xlsx") # 创建“工作簿对象”

sheets = wb.sheetnames  # “工作簿对象”调用其属性,# 获取workbook中所有的工作表名称,以list形式
sheets
>>> ['Sheet1']

sheet_1 = wb[sheets[0]] # “工作簿对象”调用其属性,返回“工作表对象”
sheet_1
>>> 

自建的模板文件:

3、“工作表对象”的常用属性与方法

“工作表”对象

# 3.1 查看行数与列数
row_num = sheet_1.max_row
col_num = sheet_1.max_column
print(row_num, col_num)
>>> 1 3

# 3.2 多行对象
sheet_1.rows 
>>> 
sheet_1.columns
>>> 

# 3.3 单行对象
# 获取某行
row_1 = sheet_1[1] # 第1行
print(type(row_1)) 
>>> 

# 循环获取每行
for row in sheet_1.rows: 
    print(type(row))
>>> 

“单元格”对象

# 3.4 单元格对象    
# 获取该行中的某个单元格对象
mycell = row_1[0] # 该行的A列单元格
print(type(mycell))
>>> 
print(mycell)
>>> 

# 循环获取该行中的每个单元格对象
for mycell in row_1:
    print(mycell)
    print(mycell.value) # 单元格对象调用其value属性,才能获取单元格中的数据
>>> 
>>> 我是A1单元格
>>> 
>>> 姓名
>>> 
>>> 年龄
    
# “工作表对象”也能直接调用cell方法,返回单元格对象
sheet_1.cell(row=1,column=1).value 
>>> '我是A1单元格'

PS: sheet_1.cell(row=1,column=1).value   >>> '我是A1单元格',说明引用左上角单元格的位置为(1,1),这点与dataframe不同,df左上角数据的位置为(0,0)。

你可能感兴趣的:(python,python)