python 办公自动化-生成ppt文本和图

最终样式

代码实现

python 复制代码
# 可编辑折线+写入文字 成功
# 问题: 设置字体类型和加粗和字体为微软雅黑,是只改了字母和数字的字体,中文没变化 pip install pptx_ea_font  这个库可以解决这个问题
import pandas as pd
import pptx_ea_font
import matplotlib.pyplot as plt
from pptx import Presentation
from pptx.util import Inches,Pt,Cm
from pptx.chart.data import ChartData,CategoryChartData
from pptx.dml.color import RGBColor
from pptx.enum.chart import XL_CHART_TYPE,XL_LABEL_POSITION,XL_LEGEND_POSITION,XL_TICK_MARK
path='E:\\13 python 下侧双x轴折线图\\'
df = pd.read_excel(path+'双x轴测试数据1.xlsx', sheet_name='Sheet4')  # 修改为你的文件名和工作表名

#标题
tf_text='双x轴测试'
# 中间文本
tm_text='''测试情况:
问题设置字体加粗和微软雅黑,只改了字母和数字的字体,中文没变化''' # 三引号,自动换行
# 轴
td_text='                                          2023年                                                                                    2024年'
# 注释
tdd_text='''*注释
数据来源:胡编乱造
数据范围:1年有365个日出'''

#轴字体
def zhou_font(tf,text_down):
    para = tf.add_paragraph()    # 新增段落
    para.text = text_down  # 向段落写入文字
    # para.alignment = PP_ALIGN.CENTER    # 居中
    para.line_spacing = 1    # 1.5 倍的行距

    ### 设置字体
    font = para.font
    font.name = '微软雅黑'    # 字体类型
    font.bold = True    # 加粗
    font.size = Pt(12)  
    
#下标注释字体
def text_downfont(tf,text_down):
    para = tf.add_paragraph()    # 新增段落
    para.text = text_down  # 向段落写入文字
    # para.alignment = PP_ALIGN.CENTER    # 居中
    para.line_spacing = 1    # 1.5 倍的行距
    ### 设置字体
    font = para.font
    font.name = '微软雅黑'    # 字体类型
    font.bold = False    # 加粗
    font.size = Pt(10)  
    
#正文字体
def text_font(tf,text_down):
    para = tf.add_paragraph()    # 新增段落
    para.text = text_down  # 向段落写入文字
    # para.alignment = PP_ALIGN.CENTER    # 居中
    para.line_spacing = 1    # 1.5 倍的行距

    ### 设置字体
    font = para.font
    # pptx_ea_font.set_font(run,new_font)
    font.name = '微软雅黑'    # 字体类型
    font.bold = False    # 加粗
    font.size = Pt(20)  
    
#标题字体
def text_titlefont(tf,text_down):
    para = tf.add_paragraph()    # 新增段落
    para.text = text_down  # 向段落写入文字
    # para.alignment = PP_ALIGN.CENTER    # 居中
    para.line_spacing = 0    # 1.5 倍的行距

    ### 设置字体
    font = para.font
    font.name = '微软雅黑'    # 字体类型
    font.bold = True    # 加粗
    font.size = Pt(24) 
    font.color.rgb = RGBColor(192, 0, 0)         # 设置颜色 红色 

# 折线图样式
def line_chart_mod(chart):
    chart.has_legend = True
    chart.legend.position = XL_LEGEND_POSITION.BOTTOM #图例
    chart.legend.font.size = Pt(12)
    chart.legend.font.bold = True
    chart.legend.font.name = '微软雅黑'
    chart.show_value=True

    # x轴
    category_axis = chart.category_axis
    category_axis.has_major_gridlines = True
    # category_axis.minor_tick_mark = XL_TICK_MARK.OUTSIDE
    # category_axis.tick_labels.font.italic = False #斜体
    # category_axis.tick_labels.font.size = Pt(12)
    # tick_labels.number_format = '0"%"'
    tick_labels = category_axis.tick_labels
    tick_labels.font.bold = True
    tick_labels.font.size = Pt(12)
    tick_labels.font.name = '微软雅黑'
    # y轴
    value_axis = chart.value_axis
    value_axis.maximum_scale = 120
    # value_axis.minor_tick_mark = XL_TICK_MARK.OUTSIDE 
    value_axis.has_major_gridlines = False
    value_axis.has_minor_gridlines = False
    tick_labels = value_axis.tick_labels
    # tick_labels.number_format = '0"%"'
    tick_labels.font.bold = True
    tick_labels.font.size = Pt(12)
    tick_labels.font.name = '微软雅黑'

def paste_picture_content(path,df,tf_text,tm_text,td_text,tdd_text):
    prs = Presentation()       
    blank_slide_layout = prs.slide_layouts[6]               #选择模板中的空白页[6]
    slide = prs.slides.add_slide(blank_slide_layout)        #新建空白页[6]
 
    ###添加折线图
    shapes = slide.shapes
    # shapes.title.text = '双x轴折线图'
     
    # 准备数据
    chart_data = ChartData()
    chart_data.categories = df['月份'] 
    chart_data.add_series('系列一',  df['系列一']) #,number_format='0.0'轴展示数据形式
    chart_data.add_series('系列二',  df['系列二'])

    # 在幻灯片中添加折线图
    x, y, cx, cy =  Cm(0.25), Cm(6), Cm(24.78), Cm(8.2)    #left, top, width, height
    chart=slide.shapes.add_chart(XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data).chart
    plot = chart.plots[0]
    plot.has_data_labels = True
    data_labels = plot.data_labels
    data_labels.font.size = Pt(9)
    # data_labels.font.color.rgb = RGBColor('','')
    data_labels.position = XL_LABEL_POSITION.INSIDE_END
    # 修改折线图样式
    chart=line_chart_mod(chart)
    # chart = chart.chart

    
    # left, top, width, height = Cm(0.25), Cm(5), Cm(24.78), Cm(5.6)
    # pic = slide.shapes.add_picture(path+'chart.png', left, top, width, height)
        
    ###确定文本框在空白ppt中的位置,以及文本框在的大小;将文本框在贴到空白页中
    #标题
    left, top, width, height = Cm(0.61), Cm(0.5), Cm(10), Cm(1.28)
    tf = slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame
    # tf.font.color.rgb = RGBColor(192, 0, 0)  # 字体颜色
    para = text_titlefont(tf,tf_text) 
    
    # 中间文本
    left, top, width, height = Cm(1.7), Cm(2), Cm(8), Cm(0.5)
    tf = slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame
    # tf.text = tm_text  
    para = text_font(tf,tm_text) 
    

    #轴
    left, top, width, height = Cm(5), Cm(12), Cm(8), Cm(1)
    tf = slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame # 在指定位置添加文本框
    para = zhou_font(tf,td_text)

    # 注释
    left, top, width, height = Cm(0.03), Cm(16.1), Cm(18), Cm(1)
    tf = slide.shapes.add_textbox(left=left, top=top, width=width, height=height).text_frame
    # tf.paragraphs[0].text = tdd_text 
    para = text_downfont(tf,tdd_text) 
    
    prs.save(path+'line_chart05.pptx')
paste_picture_content(path,df,tf_text,tm_text,td_text,tdd_text)

参考:https://python-pptx.readthedocs.io/en/latest/user/charts.html#line-chart

pip install python-pptx

相关推荐
June bug2 分钟前
(#数组/链表操作)合并两个有重复元素的无序数组,返回无重复的有序结果
数据结构·python·算法·leetcode·面试·跳槽
黎雁·泠崖8 分钟前
Java继承入门:概念+特点+核心继承规则
java·开发语言
人工智能AI技术9 分钟前
【Agent从入门到实践】33 集成多工具,实现Agent的工具选择与执行
人工智能·python
AIFQuant19 分钟前
如何通过股票数据 API 计算 RSI、MACD 与移动平均线MA
大数据·后端·python·金融·restful
x70x8025 分钟前
Go中nil的使用
开发语言·后端·golang
70asunflower26 分钟前
Python with 语句与上下文管理完全教程
linux·服务器·python
星辰徐哥33 分钟前
Java程序的编译与运行机制
java·开发语言·编译·运行机制
deephub34 分钟前
为什么标准化要用均值0和方差1?
人工智能·python·机器学习·标准化
Sylvia-girl36 分钟前
线程安全问题
java·开发语言·安全
CC.GG37 分钟前
【C++】C++11----智能指针
开发语言·c++