-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtable_to_svg.py
100 lines (84 loc) · 3.48 KB
/
table_to_svg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import pandas as pd
import svgwrite
import os
class TableToSVG:
def __init__(self):
# 基本配置
self.TOTAL_WIDTH = 638
self.MIN_CELL_HEIGHT = 26
self.LINE_HEIGHT = 14
self.FIXED_WIDTHS = []
# 新增配置
self.ROW_SPACING = 0
self.COLUMN_SPACING = 0
self.ODD_ROW_COLOR = '#ffffff'
self.EVEN_ROW_COLOR = '#f8f9fa'
self.HEADER_FONT_SIZE = 14
self.HEADER_FONT_WEIGHT = 'bold'
self.CONTENT_FONT_SIZE = 12
self.CONTENT_FONT_WEIGHT = 'normal'
self.HEADER_ROW_COLOR = '#f8f9fa' # 新增标题行颜色
def read_table(self, file_path):
"""读取表格文件"""
if file_path.endswith('.csv'):
return pd.read_csv(file_path)
return pd.read_excel(file_path)
def create_svg(self, input_path, output_path):
"""创建SVG文件"""
# 读取数据
df = self.read_table(input_path)
# 计算表格尺寸
row_count = len(df) + 1 # 包括表头
col_count = len(df.columns)
# 如果没有指定列宽,平均分配
if not self.FIXED_WIDTHS:
col_width = (self.TOTAL_WIDTH - (col_count - 1) * self.COLUMN_SPACING) / col_count
self.FIXED_WIDTHS = [col_width] * col_count
# 计算总高度
total_height = (row_count * self.MIN_CELL_HEIGHT) + ((row_count - 1) * self.ROW_SPACING)
# 创建SVG
dwg = svgwrite.Drawing(output_path, size=(self.TOTAL_WIDTH, total_height))
# 添加表格背景和边框
for row in range(row_count):
y = row * (self.MIN_CELL_HEIGHT + self.ROW_SPACING)
x = 0
for col in range(col_count):
# 设置单元格背景色
if row == 0:
bg_color = self.HEADER_ROW_COLOR # 使用标题行颜色
else:
bg_color = self.ODD_ROW_COLOR if row % 2 == 1 else self.EVEN_ROW_COLOR
# 绘制单元格背景
cell_width = self.FIXED_WIDTHS[col]
dwg.add(dwg.rect(
insert=(x, y),
size=(cell_width, self.MIN_CELL_HEIGHT),
fill=bg_color,
stroke='#dee2e6',
stroke_width=1
))
# 添加文本
if row == 0:
# 表头
text_content = str(df.columns[col])
font_size = self.HEADER_FONT_SIZE
font_weight = self.HEADER_FONT_WEIGHT
else:
# 内容
text_content = str(df.iloc[row-1, col])
font_size = self.CONTENT_FONT_SIZE
font_weight = self.CONTENT_FONT_WEIGHT
# 计算文本位置
text_x = x + 5 # 左边距
text_y = y + (self.MIN_CELL_HEIGHT + font_size) / 2 # 垂直居中
# 添加文本元素
text = dwg.text(
text_content,
insert=(text_x, text_y),
fill='black',
style=f'font-size:{font_size}px;font-weight:{font_weight}'
)
dwg.add(text)
x += cell_width + self.COLUMN_SPACING
# 保存SVG文件
dwg.save()