PYTHON将EXCEL表格内容转为图片(jpg或png)

import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import table
from PIL import Image
from io import BytesIO

from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 指定默认字体:解决plot不能显示中文问题
mpl.rcParams['axes.unicode_minus'] = False


xls = pd.ExcelFile('./test.xlsx')
j = 0
for sheet_name in xls.sheet_names:
    # 读取工作表数据
    df = pd.read_excel(xls, sheet_name=sheet_name)
    # 将缺失值转为空字符串,避免表格中出现NaN
    df = df.applymap(lambda x: str(x) if pd.notna(x) else '')
    # 创建一个样式对象

    print("正在处理 %s 表格" % sheet_name)
    j = j + 1

    if df.shape[0] > 150:  # 假设以100行作为一个分割点

        df_split = [df[i:i + 150] for i in range(0, df.shape[0], 150)]

        for i, data in enumerate(df_split):
            fig = plt.figure(figsize=(9, 26), dpi=200)
            ax = fig.add_subplot(111, frame_on=False)

            # 隐藏x轴 y轴
            ax.xaxis.set_visible(False)  # hide the x axis
            ax.yaxis.set_visible(False)  # hide the y axis

            fig.tight_layout()
            # 如果数据是图片,则保存为图片,否则执行表格处理
            if isinstance(data.iloc[0, 0], Image.Image):  # 检查数据是否为图片
                img = data.iloc[:, 0].apply(lambda x: x.tobytes())  # 将图片转换为字节流
                img_buffer = BytesIO()
                img_buffer.write(img.values.tobytes())  # 将字节流转为BytesIO对象
                img = Image.open(img_buffer)  # 将BytesIO对象转为图片
                img.save('./output/' + str(j) + '_' + str(i) + '!' + sheet_name + '.png')  # 保存图片
            else:

                ax.table(cellText=data.values, colLabels=data.columns, cellLoc='center', loc='center')
                ax.set_title(sheet_name, fontsize=12, loc='left')
                #ax.text(0, 1, sheet_name, ha='left', va='center', fontsize=12, transform=ax.transAxes)
                plt.savefig('./output/' + str(j) + '_' + str(i) + '!' + sheet_name + '.jpg')
            plt.close(fig)
            print("已完成 %s 表格处理" % sheet_name)
    elif df.shape[0] > 50:
        if isinstance(df.iloc[0, 0], Image.Image):  # 检查数据是否为图片
            img = df.iloc[:, 0].apply(lambda x: x.tobytes())  # 将图片转换为字节流
            img_buffer = BytesIO()
            img_buffer.write(img.values.tobytes())  # 将字节流转为BytesIO对象
            img = Image.open(img_buffer)  # 将BytesIO对象转为图片
            img.save('./output/' + str(j) + '!' + sheet_name + '.png')  # 保存图片
        else:

            fig = plt.figure(figsize=(9, 10), dpi=500)
            ax = fig.add_subplot(111, frame_on=False)
            ax.set_title(sheet_name, fontsize=12, loc='left')
            #ax.text(0, 0.8, sheet_name, ha='left', va='center', fontsize=12, transform=ax.transAxes)
            table1=ax.table(cellText=df.values, colLabels=df.columns, cellLoc='center', loc='center')
            table1.auto_set_font_size(True)  # 禁用自动设置字体大小
            table1.set_fontsize(14)  # 设置字体大小为12
            ax.xaxis.set_visible(False)  # hide the x axis
            ax.yaxis.set_visible(False)  # hide the y axis
            fig.tight_layout()
            plt.savefig('./output/' + str(j) + '!' + sheet_name + '.jpg')
        plt.close(fig)
        print("已完成 %s 表格处理" % sheet_name)


    else:
        if isinstance(df.iloc[0, 0], Image.Image):  # 检查数据是否为图片
            img = df.iloc[:, 0].apply(lambda x: x.tobytes())  # 将图片转换为字节流
            img_buffer = BytesIO()
            img_buffer.write(img.values.tobytes())  # 将字节流转为BytesIO对象
            img = Image.open(img_buffer)  # 将BytesIO对象转为图片
            img.save('./output/' + str(j) + '!' + sheet_name + '.png')  # 保存图片
        else:

            fig = plt.figure(figsize=(9, 6), dpi=500)
            ax = fig.add_subplot(111, frame_on=False)
            ax.set_title(sheet_name, fontsize=12, loc='left')
            #设置标题在x,y轴上位置,字体
            #ax.text(0, 0.8, sheet_name, ha='left', va='center', fontsize=12, transform=ax.transAxes)
            table1=ax.table(cellText=df.values, colLabels=df.columns, cellLoc='center', loc='center')
            table1.auto_set_font_size(True)  # 禁用自动设置字体大小
            table1.set_fontsize(14)  # 设置字体大小为12

            ax.xaxis.set_visible(False)  # hide the x axis
            ax.yaxis.set_visible(False)  # hide the y axis

            #fig.tight_layout()
            plt.savefig('./output/' + str(j) + '!' + sheet_name + '.jpg')
        plt.close(fig)
        print("已完成 %s 表格处理" % sheet_name)

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