raw_coal=pd.read_excel(
r'统计局数据.xlsx'
,sheet_name=
'原煤'
)
crude_oil=pd.read_excel(
r'统计局数据.xlsx'
,sheet_name=
'原油'
)
natural_gas=pd.read_excel(
r'统计局数据.xlsx'
,sheet_name=
'天然气'
)
data=pd.merge(raw_coal,crude_oil,on=
'指标'
)
data=pd.merge(data,natural_gas,on=
'指标'
)
finally_data=data[[
'指标'
,
'原煤产量当期值(万吨)'
,
'原油产量当期值(万吨)'
,
'天然气产量当期值(亿立方米)'
]]
print(finally_data)
就数据而言,已经离我们要的最终表格差的不远了,就差一点点细节了。
是时候上我们的主角xlwings,xlwings能够非常方便的读写excel文件中的数据,最重要的是它可以对单元的格式进行修改,可以与pandas无缝连接。
使用xlwings库创建一个excel工作簿,在工作簿中创建一个表,表的名称为finally_data。
然后将上面利用pandas整合的数据复制到finally_data表格中,当然了将数据复制到表格中,在此看来有三种方式。
第一种:将一个数据看成一个单位,一个一个写入创建的表格中,此时需要注意的是,每一个数据在excel的位置和在dataframe表格中的位置,以免出现错误。
第二种:将一行数据看成一个单位,此时需要注意的是,每行数据的第一个在excel中的位置,参考复制粘贴形式。
第三种:将一张表的数据看成一个单位,本质上与第二种没什么区别,都是切片式传入数据,但是第三种方法是一二维数组的形式写入。
wb=xw.Book
sht=wb.sheets['Sheet1']
sht.name='finally_data'
columns=list(finally_data.columns)
##得到列名
sht.range('A1').value = columns
####在第一行复制列名
##第一种方式,将一个数据为单位,一个个写入创建的表格中
# for row in range(2,11):
# for col in range(1,5):
# sht.range(row,col).value =finally_data.iloc[row-2,col-1]
##第二中方式,将一行数据为单位,一行一行的写入创建的表格中
# for i in range(0,len(finally_data)):
# data_row=list(finally_data.iloc[i,:])
# row=i+2
# row_clo='A'+str(row)
# sht.range(row_clo).value =data_row
#第三种方式,将一张表格为单位,直接写入创建的表格中
finally_data1=finally_data.values
sht.range('A2').value = finally_data1
三者均能达到我们想要结果,各有优劣,作者喜欢的是第三种。达到这一步的时候,剩下的就是对表格内单元格的格式进行修改了。
再对单元格进行修改之前,我们要先求出来原煤产量当期值,原油产量长期值,天然气产量当期值,这三列数据中大于平均值和小于平均值的数据在Dataframe的位置,同时得出该数据在excel的位置,方便在进行单元格的格式修改。
describe
=finally_data.describe
avg
=
list
(describe.loc[
'mean'
,:])
##计算大于均值的数在excel的位置
red_原煤=
list
(finally_data.index[finally_data[
'原煤产量当期值(万吨)'
]>
avg
[
0
]])
red_position1=[
'B'
+
str
(i+
2
)
for
i
in
red_原煤 ]
red_原油=
list
(finally_data.index[finally_data[
'原油产量当期值(万吨)'
]>
avg
[
1
]])
red_position2=[
'C'
+
str
(i+
2
)
for
i
in
red_原油 ]
red_天然气=
list
(finally_data.index[finally_data[
'天然气产量当期值(亿立方米)'
]>
avg
[
2
]])
red_position3=[
'D'
+
str
(i+
2
)
for
i
in
red_天然气 ]
red=red_position1+red_position2+red_position3
##计算小于均值的数在excel的位置
blue_原煤=
list
(finally_data.index[finally_data[
'原煤产量当期值(万吨)'
]<
avg
[
0
]])< p=
""
>
blue_position1=[
'B'
+
str
(i+
2
)
for
i
in
blue_原煤 ]
blue_原油=
list
(finally_data.index[finally_data[
'原油产量当期值(万吨)'
]<
avg
[
1
]])< p=
""
>
blue_position2=[
'C'
+
str
(i+
2
)
for
i
in
blue_原油 ]
blue_天然气=
list
(finally_data.index[finally_data[
'天然气产量当期值(亿立方米)'
]<
avg
[
2
]])< p=
""
>
blue_position3=[
'D'
+
str
(i+
2
)
for
i
in
blue_天然气 ]
blue=blue_position1+blue_position2+blue_position3
print(red)
print(blue
终于所有的条件全部满足了,最后可以对表格的格式进行修改了。
首先就是将字体全部改成宋体同时在表格中有数据的区域加上边框。
#区域内字体改变成宋体,加上边框
a_range
= f
'A1:D10'#区域
sht.range(a_range).api.Font.Name=
'宋体'
#字体
sht.range(a_range).api.Borders(
8
).LineStyle =
1
#上边框
sht.range(a_range).api.Borders(
9
).LineStyle =
1
#下边框
sht.range(a_range).api.Borders(
7
).LineStyle =
1
#左边框
sht.range(a_range).api.Borders(
10
).LineStyle =
1
#右边框
sht.range(a_range).api.Borders(
12
).LineStyle =
1
#内横边框
sht.range(a_range).api.Borders(
11
).LineStyle =
1
#内纵边框
第二步就是将第一行的字体变成白色,单元格填充黑色。
#######在excel 表格里改变字体颜色
for i in red:
sht.range(i).api.Font.Color = 0x0000ff
for i in blue:
sht.range(i).api.Font.Color = 0xFF0000
wb.save('结果数据.xlsx')
wb.close
结果出来后,符合我们的要求。本次案例完整结束,当然了真正入手一个完整的自动化报表项目,远不止这么简单,中间还会出现一下别的问题。
小编帮你准备好了题库
《Python题库(100道真题)》
回复
【10113】
即可领取
返回搜狐,查看更多