45 lines
1.7 KiB
Python
45 lines
1.7 KiB
Python
from docx.oxml.ns import qn # qn作用是元素的.tag属性,自动帮你处理namespace
|
||
from docx.shape import InlineShape
|
||
from apps.createSeiTaiDocument.docXmlUtils import (
|
||
Demand_table_xqms,
|
||
Timing_diagram_width,
|
||
Test_result_width,
|
||
Horizatal_width
|
||
)
|
||
|
||
def set_shape_size(shape: InlineShape):
|
||
"""调用下面辅助函数,判断字典{'in_table': True, 'row_idx': 10, 'col_idx': 3}来设置大小"""
|
||
shape_location = get_shape_location(shape)
|
||
# 先判断是否在table中
|
||
if shape_location['in_table']:
|
||
# 在table中看是否是第一列,第一列则是时序图
|
||
if shape_location['col_idx'] == 0:
|
||
# 在第一列:说明是时序图
|
||
shape.width = Timing_diagram_width
|
||
else:
|
||
shape.width = Test_result_width
|
||
else:
|
||
shape.width = Horizatal_width
|
||
|
||
def get_shape_location(shape: InlineShape):
|
||
"""传入图片直接处理,注意是python-docx库,不是docxtpl"""
|
||
# 获取父元素链
|
||
parent_chain = list(shape._inline.iterancestors())
|
||
# 检查是否在表格中
|
||
for elem in parent_chain:
|
||
if elem.tag == qn("w:tbl"):
|
||
# 获取表格对象
|
||
tbl = elem
|
||
# 获取行对象并计算行索引
|
||
tr = next(e for e in parent_chain if e.tag == qn('w:tr'))
|
||
row_idx = tbl.index(tr)
|
||
# 获取单元格对象并计算列索引
|
||
tc = next(e for e in parent_chain if e.tag == qn('w:tc'))
|
||
col_idx = tr.index(tc)
|
||
return {
|
||
'in_table': True,
|
||
'row_idx': row_idx,
|
||
'col_idx': col_idx
|
||
}
|
||
return {'in_table': False}
|