广州铁路投资建设集团网站爱网
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 = 12self.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 = 12self.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>"}
可视化后