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>"}
可视化后