feat 🐛:add cood

v2025-07-15-table
许标 7 months ago
parent 44d3f72ff3
commit d99b1aa51c

@ -136,7 +136,7 @@ async def upload_file(files: List[UploadFile] = File(...)):
summary="生成日报",
description="生成日报,将生成的简报和日报文档转成html返回前端",
)
async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0):
async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0,over_load_value: int =0):
global data_dict
try:
logger.info("开始生成日报")
@ -148,8 +148,10 @@ async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0)
# 存储文件的路径
fold_path = str(Path(UPLOAD_DIR).resolve()).replace("\\", "/")
data_dict = deal_docx(fold_path, DOWNLOAD_DIR,time_type=time_type)
data_dict = deal_docx(fold_path, DOWNLOAD_DIR,time_type=time_type,over_load_value=over_load_value)
if "status" in data_dict:
if not data_dict["status"]:
return data_dict
# 判断是否生成日报成功如果成功则转成html返回前端
report_sim_html = docx2html(data_dict["daily_repo_simple"])
report_html = docx2html(data_dict["daily_report"])
@ -158,7 +160,7 @@ async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0)
# 将数据写入数据库
save_word_document(data_dict)
logger.info("日报生成返回成果")
# 返回 JSON 包含 HTML 内容
return JSONResponse(
content={
@ -181,7 +183,7 @@ async def generate_report(background_tasks: BackgroundTasks, time_type: int = 0)
# 将原始数据保存到数据库
finally:
try:
if os.listdir(UPLOAD_DIR):
if os.listdir(UPLOAD_DIR) and "save_folder" in data_dict:
raw_data_path = move_raw_files(
UPLOAD_DIR, DOWNLOAD_RAW_DIR, data_dict["save_folder"]
)

Binary file not shown.

@ -185,6 +185,7 @@ def deal_excel_over_load(file_path):
top_5_results["地市局"] = top_5_results["地市局"].str.strip().str.replace(r"\s+", "", regex=True)
# ---------------------------------------去点中间或两侧空格---------------------------------
top_5_results['公司地市'] = top_5_results['分子公司'] + top_5_results['地市局']
#top_5_results.loc[:, '公司地市'] = top_5_results['分子公司'] + top_5_results['地市局']
# 最终选择需要返回的列:'公司_地市' 和 '记录数'
final_output = top_5_results[['公司地市', '记录数']]
return final_output

@ -24,7 +24,7 @@ from app.tools.draw_picture import plot_electricity_comparison
logger = logging.getLogger(__name__)
def deal_docx(folder_path, save_path=None, time_type=0):
def deal_docx(folder_path, save_path=None, time_type=0,over_load_value=0):
"""
:param folder_path: 文件上传后保存的路径
:param save_path: 最终生成的日报/简报的保存路径
@ -451,7 +451,16 @@ def deal_docx(folder_path, save_path=None, time_type=0):
over_load_before = extract_overload_info_from_previous_day(
current_word=current_doc_name
)
# 2025-07-21
if not over_load_before :
if over_load_value>0:
over_load_before = over_load_value
else:
print("缺少昨日配变过载数量,需要手动填写")
return {
"status":False,
"error_message":"缺少昨日配变过载数量,需要手动填写"
}
if over_load_before:
# 将字符串转换为浮点数
over_load_before = float(over_load_before)

@ -1,4 +1,5 @@
import logging
from multiprocessing.spawn import old_main_modules
from docx.oxml.ns import qn
from docx.shared import Pt
@ -8,18 +9,60 @@ logger = logging.getLogger(__name__)
#excluded_list = ['{{year}}','{{month}}', '{{day}}']
# 将文档中的字符串变量替换成提取内容
"""
def replace_text_in_paragraph(paragraph, old_text, new_text):
try:
runs = list(paragraph.runs) # 先复制一份,避免边遍历边修改
for run in runs:
if old_text in run.text:
# 1. 拆分 run把 old_text 前后拆开
before, old, after = run.text.partition(old_text)
run.clear()
paragraph.add_run(before)
target_run = paragraph.add_run(new_text)
paragraph.add_run(after)
# 3. 仅给目标 run 加粗 + 字体
if old_text == "{{sentiment_trend}}":
target_run.bold = True
target_run.font.name = "Times New Roman"
target_run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
target_run.font.size = Pt(16)
elif old_text.startswith('{{') and old_text.endswith('}}'):
# 其它模板只改字体、字号,不加粗
target_run.font.name = "Times New Roman"
target_run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
target_run.font.size = Pt(16)
except Exception as e:
logger.exception(f"替换段落里的文本失败:{e}")
print(f"替换段落里的文本失败:{e}")
"""
def replace_text_in_paragraph(paragraph, old_text, new_text):
try:
if old_text in paragraph.text: # 检查段落中是否存在模板字符串
# 遍历段落的每个运行
for run in paragraph.runs:
if old_text in run.text:
run.text = run.text.replace(old_text, new_text)
if old_text.startswith('{{') :
run.font.name = "Times New Roman"
#run.font.name = "仿宋"
run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
run.font.size = Pt(16)
if old_text =="{{sentiment_trend}}":
print("定制化加粗")
if old_text in run.text:
before, old, after = run.text.partition(old_text)
run.clear()
paragraph.add_run(before)
target_run = paragraph.add_run(new_text)
paragraph.add_run(after)
if old_text == "{{sentiment_trend}}":
target_run.bold = True
target_run.font.name = "Times New Roman"
target_run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
target_run.font.size = Pt(16)
else:
if old_text in run.text:
run.text = run.text.replace(old_text, new_text)
if old_text.startswith('{{') :
run.font.name = "Times New Roman"
#run.font.name = "仿宋"
run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
run.font.size = Pt(16)
except Exception as e:
logger.exception(f"替换段落里的文本失败:{e}")
print(f"替换段落里的文本失败:{e}")

@ -1,6 +1,7 @@
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.shared import Pt
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
import logging
@ -16,8 +17,12 @@ def table_style(table):
# 遍历每一行的每个单元格
for cell in row.cells:
# 遍历单元格的每个段落
cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER
for paragraph in cell.paragraphs:
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
paragraph.paragraph_format.line_spacing_rule = WD_LINE_SPACING.EXACTLY
paragraph.paragraph_format.line_spacing = Pt(11)
paragraph.paragraph_format.space_after = Pt(0)
# 遍历段落的每个运行Run
for run in paragraph.runs:
# 设置英文字体(适用于数字和英文)

Loading…
Cancel
Save