python 让你的报表做得更好(二)

在工作中,不仅要做excel表格,而且还要做word文字。使用python可以轻松地将excel内容总结成文字,并自动写入word中。

之前,我们抓取了网上科幻电影排行榜数据,并写入到excel中。今天则通过pandas库对excel表格数据进行分析、总结,自动形成文字材料。

import pandas as pd
import os
from win32com.client import Dispatch

"""
1.按地区分类,统计拍摄电影最多的国家
2.按演员分类,统计参演电影最多的演员
3.按上映时间分类,统计拍摄电影最多的年份
"""


# 将输入的字典或列表,拼接为一段字符串文字
def transform_to_word(input: dict or list, middle_str: str = '', end_str: str = '部') -> str:
    '''
    :param input: 比如:input=[('美国', 153), ('英国', 38), ('加拿大', 22), ('日本', 15), ('德国', 12)]
    :param middle_str: 中间拼接的字符
    :param end_str: 结尾拼接的字符,比如:end_str='部'
    :return: 比如:美国153部、英国38部、加拿大22部、日本15部、德国12部
    '''
    if type(input) == dict:
        input = zip(input.keys(), input.values())
    output = ''
    for it in input:
        output += f"{it[0]}{middle_str}{it[1]}{end_str}、"
    output = output[:-1]  # 主要是去掉最后的顿号
    return output


# 输入一个DataFrame,根据索引,输出对应索引的内容
def group_by_select(df: pd.DataFrame, column: str, slice=None):
    # 地区、演员表中的每一个单元格有多个数据,由逗号分割,可以采用按逗号分割的方式对数据进行处理后再统计
    # 上映时间中的每一个单元格是字符串格式的日期,字符串前4个字符则为年份,可以采用切片的方式提取提取年份
    '''
    :param df: 输入的DataFrame
    :param column: column=DataFrame的任一列索引,比如column='地区'
    :param slice: 返回数据的长度
    :return:
    output=[('美国', 153), ('英国', 38), ('加拿大', 22), ('日本', 15), ('德国', 12)]
    output2存放output对应的电影名[['<<明日边缘>>','<<银河护卫队>>',...],[...],...[]]
    '''
    data_list = df[column].tolist()
    output = {}
    for data in data_list:
        if "-" in data:
            data = data[:4]
        for dat in data.split(','):
            output[dat] = output.get(dat, 0) + 1
    output = sorted(output.items(), key=lambda x: x[1], reverse=True)  # 降序排列
    if slice:
        output = output[:slice]  # 切片

    output2 = []
    for op, _ in output:
        output2.append(df[df[column].str.contains(op)]['电影名'].map(lambda x:f"<<{x}>>").tolist())
    return output, output2


# 向word中添加一段文字
def add_para(content, is_indent=True, is_alignment_center=False, is_bold=False, font_name='方正仿宋',
             font_size=16, font_color=None):
    '''
    :param content: 写入word的内容
    :param is_indent: 首行缩进2个字符
    :param is_alignment_center: 居中对齐
    :param is_bold: 字体加粗
    :param font_name: 字体名称,比如方正仿宋、方正小标宋...
    :param font_size: 字体大小,比如二号对应22磅,三号对应16磅
    :param font_color: 字体颜色
    '''
    global para_index, start
    selection = word.Selection
    selection.Start = start
    selection.InsertParagraph()
    rng = selection.Range
    rng.Text = content
    para = doc.Paragraphs(para_index)
    if is_indent:
        para.CharacterUnitFirstLineIndent = 2  # 首行缩进2个字符
    if is_alignment_center:
        rng.ParagraphFormat.Alignment = 1  # 居中对齐
    if is_bold:
        rng.Font.Bold = True  # 字体加粗
    if font_color:
        rng.Font.Color = font_color
    rng.Font.Name = font_name
    rng.Font.Size = font_size

    para_index += 1
    start = rng.End + 1


word = Dispatch('kwps.Application')
word.Visible = 1
doc = word.Documents.Add()  # 新建一个word文档
para_index = 1
start = 0
# 如果有设置好了的word模板,则调用下面的方法
# doc = word.Documents.Open('abosulte_path')
# 读取excel数据
base_path = os.path.dirname(__file__)
excel_path = os.path.join(base_path, '科幻片排行榜.xlsx')
df = pd.read_excel(excel_path, sheet_name='sheet1')
# 组合文本数据,根据需要选择是否输出电影的名称
region, region_data = group_by_select(df=df, column='地区', slice=10)
region_info = f"1.科幻类电影排行榜中,拍摄电影数量前{len(region)}名的国家,分别为{transform_to_word(input=region)}。"

player, player_data = group_by_select(df=df, column='演员列表', slice=20)
player_info = f"2.科幻类电影排行榜中,参演电影数量前{len(player)}名的演员,分别为{transform_to_word(input=player)}。"

release_date, release_date_data = group_by_select(df=df, column='上映时间', slice=10)
release_date_info = f"3.科幻类电影排行榜中,上映电影数量前{len(release_date)}的年份," \
                    f"分别为{transform_to_word(input=release_date, middle_str='年')}。" \
                    f"{release_date[0][0]}年上映的电影为{','.join(release_date_data[0])}。"

# 写入word中
add_para(content='科幻电影总结', is_indent=False, is_alignment_center=True, font_name='方正小标宋', font_size=22)
add_para(content=region_info, font_name='方正仿宋', font_size=16)
add_para(content=player_info, font_name='方正仿宋', font_size=16)
add_para(content=release_date_info, font_name='方正仿宋', font_size=16)
# 保存word
file_name = os.path.join(os.path.dirname(__file__), '科幻电影总结')
doc.SaveAs(f"{file_name}.docx") # 保存docx
doc.SaveAs(file_name,FileFormat=17) # 保存pdf
doc.Close()
word.Quit()

猜你喜欢

转载自blog.csdn.net/spiderwower/article/details/136461565