Python表格可视化工具:将HTML表格转换为精美图片

Python表格可视化工具:将HTML表格转换为精美图片

简介

在数据分析和报告撰写中,表格是不可或缺的工具。为了更好地展示数据,我们常常需要将表格转换为图片格式。本文将详细介绍一个Python工具类TableVisualizer,它可以将HTML表格数据转换成美观的图片格式,适用于报告、演示或文档中展示表格数据的场景。

主要功能

  • 从JSON文件中读取HTML表格数据:通过解析JSON文件中的HTML字符串,提取表格数据。
  • 自定义表格样式:用户可以根据需求自定义表格的字体、颜色、大小等样式。
  • 支持单个文件处理和批量处理:不仅可以处理单个JSON文件,还支持批量处理文件夹中的所有JSON文件。
  • 高质量图片输出:生成的图片分辨率高,适合打印和展示。

代码详解

1. 初始化设置

在初始化方法中,我们设置了中文字体支持和默认的表格样式参数。

def __init__(self):
    # 设置中文字体
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    # 默认样式配置
    self.figure_size = (8, 3)
    self.font_size = 12
    self.table_scale = (1.2, 1.5)
    self.header_color = '#4a86e8'
    self.cell_color = '#ffffff'
    self.border_color = '#d3d3d3'
  • 中文字体支持:通过plt.rcParams设置中文字体,确保在图像中正确显示中文。
  • 样式参数:包括图像大小、字体大小、表格缩放比例、表头颜色、单元格颜色和边框颜色。

2. 数据加载

load_from_json方法用于从JSON文件中加载HTML表格数据。

def load_from_json(self, json_path):
    try:
        with open(json_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
            html_table = data['html_str']
            
        dfs = pd.read_html(html_table)
        if not dfs:
            raise ValueError("未在HTML中找到表格")
        return dfs[0]
    except Exception as e:
        raise Exception(f"加载数据失败: {e}")
  • 文件读取:使用json.load读取JSON文件,并提取其中的HTML字符串。
  • 表格解析:利用pandas.read_html解析HTML字符串,提取表格数据。

3. 表格可视化

create_table_figure方法用于将DataFrame数据转换为图像。

def create_table_figure(self, df):
    plt.figure(figsize=self.figure_size)
    ax = plt.gca()
    ax.axis('off')
    
    # 创建表格并设置样式
    table = plt.table(
        cellText=df.values,
        colLabels=df.columns,
        cellLoc='center',
        loc='center',
        colColours=['#f3f3f3']*len(df.columns)
    )
    
    # 设置表格样式
    table.auto_set_font_size(False)
    table.set_fontsize(self.font_size)
    table.scale(*self.table_scale)
    
    # 设置单元格样式
    for (row, col), cell in table.get_celld().items():
        if row == 0:
            cell.set_text_props(weight='bold', color='black')
            cell.set_facecolor(self.header_color)
        else:
            cell.set_facecolor(self.cell_color)
        
        cell.set_edgecolor(self.border_color)
        cell.set_linewidth(0.5)
  • 图像创建:使用matplotlib创建图像,并关闭坐标轴。
  • 表格样式:设置表格的字体大小、缩放比例、表头和单元格的颜色。
  • 单元格样式:为表头和普通单元格设置不同的样式,包括字体加粗、颜色和边框。

4. 保存图像

save_figure方法用于将生成的图像保存到文件。

def save_figure(self, output_path, dpi=300):
    try:
        plt.savefig(
            output_path,
            bbox_inches='tight',
            dpi=dpi,
            transparent=False
        )
        print(f"表格已成功保存为 {output_path}")
    finally:
        plt.close()
  • 图像保存:使用plt.savefig保存图像,指定分辨率和输出路径。
  • 资源释放:保存后关闭图像,释放内存。

5. 批量处理功能

batch_process方法支持批量处理文件夹中的所有JSON文件。

def batch_process(self, in_dir, save_dir):
    try:
        # 确保输出目录存在
        os.makedirs(save_dir, exist_ok=True)
        
        for root, _, files in os.walk(in_dir):
            for file in files:
                if file.endswith('.json'):
                    json_path = os.path.join(root, file)
                    output_filename = os.path.splitext(file)[0] + '.png'
                    output_path = os.path.join(save_dir, output_filename)
                    print(f"处理文件: {json_path}")
                    self.visualize(json_path, output_path)
    except Exception as e:
        print(f"批量处理过程出错: {e}")
  • 目录遍历:使用os.walk遍历输入目录,查找所有JSON文件。
  • 文件处理:对每个JSON文件调用visualize方法,生成并保存图片。

使用示例

if __name__ == '__main__':
    visualizer = TableVisualizer()
    # 自定义样式
    visualizer.figure_size = (10, 4)
    visualizer.font_size = 14

    # 处理单个文件
    visualizer.visualize('test.json', 'table_visualization.png')

    # 批量处理
    visualizer.batch_process('input_folder', 'output_folder')
  • 单文件处理:通过visualize方法处理单个JSON文件。
  • 批量处理:通过batch_process方法处理整个文件夹中的JSON文件。

特色优势

  • 中文支持:内置中文字体配置,完美支持中文显示。
  • 样式可定制:提供丰富的样式参数配置,用户可以根据需求自定义。
  • 批量处理:支持批量转换多个文件,提高工作效率。
  • 错误处理:完善的异常处理机制,确保程序稳定运行。
  • 使用简单:接口设计直观,易于使用。

应用场景

  • 学术论文表格制作:将数据表格转换为高质量图片,便于插入论文。
  • 数据报告生成:快速生成数据报告中的表格图片。
  • 演示文稿制作:为演示文稿提供清晰美观的表格图片。
  • 文档自动化处理:在自动化文档生成流程中集成表格图片生成。

总结

TableVisualizer工具类提供了一个简单而强大的解决方案,可以轻松将HTML表格转换为美观的图片。通过简单的配置,就能生成适合各种场景使用的表格图片,大大提高了工作效率。希望这个工具能对大家有所帮助!如果您有任何改进建议,欢迎在评论区留言讨论。

完整代码

import pandas as pd
import matplotlib.pyplot as plt
import json
import os  # 添加os模块导入

class TableVisualizer:
    """HTML表格可视化工具类
    
    用于将HTML表格转换为美观的图片格式
    """
    
    def __init__(self):
        """初始化可视化器,设置中文字体等基本参数"""
        # 设置中文字体
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False
        
        # 默认样式配置
        self.figure_size = (8, 3)
        self.font_size = 12
        self.table_scale = (1.2, 1.5)
        self.header_color = '#4a86e8'
        self.cell_color = '#ffffff'
        self.border_color = '#d3d3d3'
    
    def load_from_json(self, json_path):
        """从JSON文件加载HTML表格数据
        
        Args:
            json_path (str): JSON文件路径
            
        Returns:
            pandas.DataFrame: 解析后的表格数据
            
        Raises:
            Exception: 文件读取或解析错误时抛出
        """
        try:
            with open(json_path, 'r', encoding='utf-8') as f:
                data = json.load(f)
                html_table = data['html_str']
                
            dfs = pd.read_html(html_table)
            if not dfs:
                raise ValueError("未在HTML中找到表格")
            return dfs[0]
        except Exception as e:
            raise Exception(f"加载数据失败: {e}")
    
    def create_table_figure(self, df):
        """创建表格图像
        
        Args:
            df (pandas.DataFrame): 要可视化的数据表格
        """
        plt.figure(figsize=self.figure_size)
        ax = plt.gca()
        ax.axis('off')
        
        # 创建表格
        table = plt.table(
            cellText=df.values,
            colLabels=df.columns,
            cellLoc='center',
            loc='center',
            colColours=['#f3f3f3']*len(df.columns)
        )
        
        # 设置表格样式
        table.auto_set_font_size(False)
        table.set_fontsize(self.font_size)
        table.scale(*self.table_scale)
        
        # 设置单元格样式
        for (row, col), cell in table.get_celld().items():
            if row == 0:
                cell.set_text_props(weight='bold', color='black')
                cell.set_facecolor(self.header_color)
            else:
                cell.set_facecolor(self.cell_color)
            
            cell.set_edgecolor(self.border_color)
            cell.set_linewidth(0.5)
    
    def save_figure(self, output_path, dpi=300):
        """保存图像到文件
        
        Args:
            output_path (str): 输出文件路径
            dpi (int): 图像分辨率
        """
        try:
            plt.savefig(
                output_path,
                bbox_inches='tight',
                dpi=dpi,
                transparent=False
            )
            print(f"表格已成功保存为 {output_path}")
        finally:
            plt.close()
    
    def visualize(self, json_path, output_path, dpi=300):
        """完整的可视化流程
        
        Args:
            json_path (str): 输入JSON文件路径
            output_path (str): 输出图像文件路径
            dpi (int): 图像分辨率
        """
        try:
            df = self.load_from_json(json_path)
            self.create_table_figure(df)
            self.save_figure(output_path, dpi)
        except Exception as e:
            print(f"可视化过程出错: {e}")

    def batch_process(self, in_dir, save_dir):
        """批量处理文件夹中的所有JSON文件
        
        Args:
            in_dir (str): 输入文件夹路径,包含JSON文件
            save_dir (str): 输出文件夹路径,保存生成的图片
        """
        try:
            # 确保输出目录存在
            os.makedirs(save_dir, exist_ok=True)
            
            for root, _, files in os.walk(in_dir):
                for file in files:
                    if file.endswith('.json'):
                        json_path = os.path.join(root, file)
                        # 构建输出文件路径,使用save_dir作为保存目录
                        output_filename = os.path.splitext(file)[0] + '.png'
                        output_path = os.path.join(save_dir, output_filename)
                        print(f"处理文件: {json_path}")
                        self.visualize(json_path, output_path)
        except Exception as e:
            print(f"批量处理过程出错: {e}")

# 使用示例
if __name__ == '__main__':
    visualizer = TableVisualizer()
    visualizer.figure_size = (10, 4)  # 修改图像大小
    visualizer.font_size = 14  # 修改字体大小
    visualizer.visualize(r'D:\1.代码\脚本\论文-英文-500\test.json', 'table_visualization.png')  # 注释掉原来的单文件处理
    #visualizer.batch_process(in_dir, save_dir)  # 添加save_dir参数

测试图片:
在这里插入图片描述
获取图中表格的html,本文采用kimi获取

{"html_str": "<table border='1'><tr><th>物料类型</th><th>物料描述</th><th>计量单位</th><th>数量</th><th>总价</th><th>备注</th></tr><tr><td>数据备份系统</td><td>VX1200</td><td>台</td><td>4</td><td>64000.00</td><td></td></tr><tr><td>数据备份系统</td><td>VX2400</td><td>台</td><td>2</td><td>56000.00</td><td></td></tr></table>"}

可视化后
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林语微光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值