You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
report_app/app/tools/replace_table.py

75 lines
3.1 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import copy
import logging
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import CT_P
# 获取日志记录器
logger = logging.getLogger(__name__)
# 多行多列的数据复制到表格里,由于舆情表格比表1少一列因此加个判断条件flag=0,则是从相同表格复制flag=1,则是从舆情表格复制
def copy_table(
source_table, target_table, start_row, end_row, start_col, end_col, flag
):
try:
logger.info("遍历源表格的指定范围,将数据复制到目标表格的相同位置")
# 遍历源表格的指定范围,将数据复制到目标表格的相同位置
for i in range(start_row, end_row):
for j in range(start_col, end_col):
# 获取源表格单元格的内容
source_cell = source_table.cell(i, j)
# 将内容复制到目标表格的对应单元格
if flag == 0:
target_table.cell(i, j).text = source_cell.text
if flag == 1:
# j+1即表给从后一列开始添加数据
target_table.cell(i, j + 1).text = source_cell.text
except Exception as e:
logger.exception(f"复制表格数据时发生错误: {e}")
raise e
# 将自行统计是数据插入word表格中
# update:2025-07-04 删除多余行
def copy_sta_table(
target_table,
data,
start_row,
start_col,
is_dynamics: bool = None,
length: int = None,
):
try:
logger.info("开始将自行统计的数据插入word表格中")
# update:2025-07-04 删除多余的行数
if is_dynamics is not None and is_dynamics and len(data) < length:
for i in range(len(data) - 1):
source_row = target_table.rows[-1]._element
new_row_element = copy.deepcopy(source_row)
target_table._element.append(new_row_element)
new_row = target_table.rows[-1]
target_cell = new_row.cells[0]
while len(target_cell.paragraphs) > 1:
p_to_remove = target_cell.paragraphs[-1]._element
target_cell._element.remove(p_to_remove)
if not target_cell.paragraphs:
target_cell._element.append(CT_P())
main_paragraph = target_cell.paragraphs[0]
for run in main_paragraph.runs:
run.text = ""
main_paragraph.text = ""
main_paragraph.add_run(str(i + 2))
main_paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 遍历列表,将其插入到表格的指定位置
for i in range(len(data)):
for j in range(len(data[i])):
# 计算目标表格中的行和列索引
target_row = start_row + i
target_col = start_col + j
# 将数据插入到目标表格的对应单元格
target_table.cell(target_row, target_col).text = str(data[i][j])
except Exception as e:
logger.exception(f"自行统计的数据插入word表格中失败: {e}")
raise e