python操作ppt、world、excel相关库

一、相关依赖包

pip install xlrd                # 读excel文档库,不支持.xlsx格式
pip install openpyxl            # excel文档库,支持.xlsx格式
pip install docx-mailmerge      # world文档库
pip install python-docx         # 支持.docx格式全解析
pip install docxtpl
pip install pymysql
apt update
apt install ffmpeg

二、提取ppt文本

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ =
# python-pptx提取文本,Spire处理图片
# pip install python-pptx spire.presentation

from pptx import Presentation

def extract_ppt_text(file_path):
    prs = Presentation(file_path)
    text_content = []
    for slide in prs.slides:
        for shape in slide.shapes:
            if hasattr(shape, 'text_frame'):
                text_content.append(shape.text_frame.text)
    return '\n'.join(text_content)

# 示例用法
if __name__ == "__main__":
    path = "example.pptx"  # 替换为你的 PPTX 文件路径
    try:
        text = extract_ppt_text(path)
        print(text)
    except Exception as e:
        print(f"错误:{e}")

三、提取excel表格数据并把数据存到数据库

#!/usr/bin/python3
# -*- coding:utf-8 -*-

import xlrd
import pymysql
import os


def condb(sql):
    '''
    :param sql: 要执行的sql语句
    :return: 一条记录和多条记录
    '''
    conn = pymysql.connect(host='x.x.x.x', user='root', password='123456',
                           database='mysql', charset='utf8', port=3306)
    # 得到一个可以执行SQL语句并且将结果作为字典返回的游标(默认返回的结果为元组)
    local_cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
    if 'SELECT' in sql:
        local_cursor.execute(sql)
        # 返回结果为字典格式,fetchone()返回一条记录
        local_one = local_cursor.fetchone()
        if local_one:
            # 返回结果为字典格式,fetchall()返回多条记录
            local_all = local_cursor.fetchall()
            local_all.insert(0, local_one)
        else:
            local_all = []
        local_cursor.close()
        conn.close()
        return local_one, local_all
    elif 'UPDATE' or 'INSERT' in sql:
        try:
            local_one = local_cursor.execute(sql)
            local_all = None
            conn.commit()
            local_cursor.close()
            conn.close()
            return local_one, local_all
        except Exception as f:
            # Rollback in case there is any error
            print(f)
            conn.rollback()
        local_cursor.close()
        conn.close()


# 指定excel文件
wb = xlrd.open_workbook('video.xls')
# 指定使用哪个表
sh = wb.sheet_by_name('youtube')
# 输出有效数据行数
# print(sh.nrows)
# 输出有效数据列数
# print(sh.ncols)
# 输出第一行第一列的值
# print(sh.cell(0,0).value)
# 输出第一行的所有值
# print(sh.row_values(0))
# 将数据和标题组合成字典
# print(dict(zip(sh.row_values(0),sh.row_values(1))))
# 遍历excel,打印所有数据
for i in range(sh.nrows):
    if i > 0:
        print(str(i).split('.')[0] + ' ###################')
        #    print(sh.row_values(i))
        res = dict(zip(sh.row_values(0), sh.row_values(i)))
        condb(
            'INSERT INTO `video` (title,youtube_id,category,tag,username,testurl,ctime,status,description) VALUES ("%s","%s","%s","%s","%s","%s",NOW(),1,"%s");' % (
                res.get('title'), res.get('youtube_id'), res.get('category'), res.get('tag'), '李四',
                'http://www.video.com/{}.mp4'.format(res.get('youtube_id')), '批量添加'))
        os.system(
            "ffmpeg -i '{}.mov' -s 1280*720 -b:v 1.5M zip/{}.mp4".format(str(i).split('.')[0], res.get('youtube_id')))

四、使用模板文件生成新的excel文件,并保留单元格样式

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ =

from openpyxl import load_workbook
from copy import copy
import time


def write_excel(Sheet, data, merge_target, wb):
    # ws = wb.active
    ws = wb[Sheet]
    insert_at = 2  # 从第3行开始插入
    count = 1
    for i in data:
        for col in range(1, ws.max_column + 1):
            old_cell = ws.cell(row=3, column=col)
            new_cell = ws.cell(row=insert_at + count, column=col)
            # 复制第三行的单元格样式
            if old_cell.has_style:
                new_cell.font = copy(old_cell.font)
                new_cell.border = copy(old_cell.border)
                new_cell.fill = copy(old_cell.fill)
                new_cell.number_format = copy(old_cell.number_format)
                new_cell.protection = copy(old_cell.protection)
                new_cell.alignment = copy(old_cell.alignment)
            if col == 1:
                new_cell.value = count
            else:
                if isinstance(i, list):
                    new_cell.value = i[col - 2]
                if isinstance(i, dict):
                    for k in i:
                        new_cell.value = i[k]
                        i.pop(k)
                        break
        count += 1

    # 遍历所有合并单元格区域
    for merged_range in ws.merged_cells.ranges:
        # 判断是否是我们要修改的合并区域
        if str(merged_range) == merge_target:
            # 获取合并区左上角单元格坐标
            min_col, min_row, max_col, max_row = merged_range.bounds
            start_cell = ws.cell(row=min_row, column=min_col)
            # 修改内容,保留原单元格样式(只变value)
            start_cell.value = f"学员信息表   {time.strftime('%Y.%m.%d  %H:%M')}"
            break


if __name__ == '__main__':
    # 指定要修改的合并单元格区域,例如 "A1:L1"
    merge_target = "A1:F1"
    # data = [
    #     {'name': '张三', 'sex': '男 ', 'age': 22, '专业': '计算机', '学制': 4},
    #     {'name': '李四', 'sex': '女', 'age': 22, '专业': '会计', '学制': 3},
    #     {'name': '王五', 'sex': '男', 'age': 23, '专业': '金融', '学制': 5},
    #     {'name': '赵六', 'sex': '女 ', 'age': 22, '专业': '计算机', '学制': 4}
    # ]
    data = [['张三', '', 22, '计算机', 4], ['李四', '', 22, '会计', 4], ['王五', '', 23, '金融', 4],
            ['赵六', '', 22, '计算机', 4]]
    wb = load_workbook('template.xlsx')
    # 在多个sheet中插入数据
    write_excel('Sheet1', data, merge_target, wb)
    write_excel('Sheet2', data, merge_target, wb)
    # 保存文件
    wb.save('change.xlsx')

五、world模板渲染

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ =

from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm
import pandas as pd
import matplotlib.pyplot as plt
from io import BytesIO

# 使用RichText对象设置文本颜色、字体大小等
# from docxtpl import RichText
# rt = RichText()
# rt.add('重要提示:', bold=True, color='#FF0000', size=14)
# rt.add('本报告仅供内部使用,请勿外传。')
# context['important_note'] = rt
# 

# 设置不同节的页眉页脚
# section = doc.sections[0]
# section.header.is_linked_to_previous = False   # 取消与前一节的链接
# section.header.paragraphs[0].text = "第一章 引言"

# 中文显示问题,确保你的Python脚本和模板文件都使用UTF-8编码。设置中文字体时,需要同时设置西文字体和中文字体
# run.font.name = 'Times New Roman'  # 设置西文字体
# run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')  # 设置中文字体

def create_pie_chart(data, title):
    """创建饼图并返回InlineImage对象"""
    img_buf = BytesIO()
    labels = [item['label'] for item in data]
    values = [item['value'] for item in data]
    plt.pie(values, labels=labels, autopct='%1.1f%%')
    plt.title(title)
    plt.savefig(img_buf, format='png')
    img_buf.seek(0)
    return InlineImage(tpl, img_buf, width=Mm(100))

"""
以下代码实现了以下功能:
1、加载Word模板
2、准备报告数据(公司名称、报告日期、销售数据等)
3、使用pandas和matplotlib生成销售趋势图
4、将图表转换为InlineImage对象,添加到上下文
5、渲染模板并保存为最终报告
"""

def generate_sales_report(template_path, output_path, context):
    """
    生成销售报告

    参数:
    template_path: Word模板路径
    output_path: 输出文件路径
    context: 包含报告数据的字典
    """
    # 加载模板
    tpl = DocxTemplate(template_path)

    # 生成销售趋势图
    img_buf = BytesIO()
    df = pd.DataFrame(context['sales_trend'])
    df.plot(x='month', y='sales', kind='line')
    plt.title('销售趋势图')
    plt.savefig(img_buf, format='png')
    img_buf.seek(0)

    # 添加图表到上下文
    context['sales_chart'] = InlineImage(tpl, img_buf, width=Mm(150))

    # 渲染模板
    tpl.render(context)

    # 保存生成的文档
    tpl.save(output_path)
    print(f'报告已生成: {output_path}')

# 示例数据
context = {
    'company_name': 'ABC公司',
    'report_date': '2023年11月',
    'sales_data': [
        {'product': '产品A', 'quantity': 100, 'revenue': 50000},
        {'product': '产品B', 'quantity': 150, 'revenue': 75000},
        {'product': '产品C', 'quantity': 80, 'revenue': 40000}
    ],
    'sales_trend': [
        {'month': '1月', 'sales': 45000},
        {'month': '2月', 'sales': 52000},
        {'month': '3月', 'sales': 60000},
        {'month': '4月', 'sales': 58000},
        {'month': '5月', 'sales': 65000},
        {'month': '6月', 'sales': 72000}
    ]
}

# 生成报告
generate_sales_report('sales_template.docx', 'sales_report.docx', context)

参考链接:
     xlrd 和openpyxl
     https://cloud.tencent.com/developer/article/2352301            # 利用docxtpl和Jinja2生成基于模板的Word文档
     https://www.cnblogs.com/treasury-manager/p/14101893.html        # 使用xlwings模块操作excel
     https://www.kancloud.cn/gnefnuy/xlwings-docs/1127450     # xlwings中文文档

posted @ 2021-12-14 17:06  風£飛  阅读(230)  评论(0)    收藏  举报