Pārlūkot izejas kodu

add:插入表格

zhusc 1 dienu atpakaļ
vecāks
revīzija
dd805185ad
2 mainītis faili ar 52 papildinājumiem un 8 dzēšanām
  1. 49 7
      commom/utils.py
  2. 3 1
      main.py

+ 49 - 7
commom/utils.py

@@ -9,10 +9,12 @@ import json
 import os
 import time
 from urllib.parse import unquote
+from docx import Document
+from docx.enum.text import WD_ALIGN_PARAGRAPH
+
 
 import lark_oapi as lark
 import tos
-from docx import Document
 from lark_oapi.api.drive.v1 import CreateExportTaskRequest, ExportTask, CreateExportTaskResponse, GetExportTaskRequest, \
     GetExportTaskResponse, DownloadExportTaskRequest, DownloadExportTaskResponse
 from tos import HttpMethodType
@@ -51,7 +53,48 @@ def f_upload_file(save_path) -> str:
         print('fail with unknown error: {}'.format(e))
 
 
-def f_doc_export(token: str, data: object) -> str:
+
+def create_word_table(json_data):
+
+    # 将JSON字符串解析为Python对象
+    json_data = json.loads(json_data)
+
+    # 创建 Word 文档对象
+    document = Document()
+    # 创建表格
+    table = document.add_table(rows=len(json_data['data']), cols=len(json_data['data'][0]))
+    # 填充表格数据
+    for i, row in enumerate(json_data['data']):
+        for j, cell_value in enumerate(row):
+            cell = table.cell(i, j)
+            cell.text = cell_value.strip()  # 去除单元格文本前后的空白字符
+
+    # 设置表格样式
+    table.style = 'Table Grid'
+    for row in table.rows:
+        for cell in row.cells:
+            cell.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER
+
+    # 合并单元格并处理换行问题
+    for merge in json_data.get('merges', []):  # 增加空值处理
+        start_cell = table.cell(merge['start_row'], merge['start_column'])
+        end_cell = table.cell(merge['end_row'], merge['end_column'])
+        start_cell.merge(end_cell)
+        # 合并后,将所有文本合并到一个段落中
+        all_text = ""
+        for paragraph in start_cell.paragraphs:
+            all_text += paragraph.text
+        # 清除原有段落
+        for paragraph in start_cell.paragraphs:
+            p = paragraph._element
+            p.getparent().remove(p)
+            p._p = p._element = None
+        # 添加一个新的段落,包含所有文本
+        start_cell.add_paragraph(all_text)
+
+    return table
+
+def f_doc_export(token: str, request_id: str, data: object) -> str:
     # 飞书在线文档转word
     app_id = BaseConfig.app_id
     app_secret = BaseConfig.app_secret
@@ -129,17 +172,16 @@ def f_doc_export(token: str, data: object) -> str:
     # 操作word
     if data is not None:
         doc = Document(save_path)
-        placeholder = ""
+        placeholder = "{TABLE_PLACEHOLDER}"
         for paragraph in doc.paragraphs:
             if not placeholder in paragraph.text:
                 continue
             # 清除占位符
             for run in paragraph.runs:
                 run.text = run.text.replace(placeholder, "")
-
-            table = doc.add_table(rows=1, cols=[])
-
-            paragraph._element.addnext(table._element)
+            # 生成表格(调用改造后的 create_word_table 函数,传入字符串)
+            table = create_word_table(data)
+            paragraph._element.addnext(table._tbl)
         doc.save(save_path)
         time.sleep(2)
 

+ 3 - 1
main.py

@@ -23,12 +23,14 @@ app = FastAPI()
 
 def doc_export(
         token: str = Path(title='doc token', description="文档的token"),
+        request_id: str = Path(title='request id', description="请求ID作为文档名后缀"),
         data: object|None = Body(..., embed=True, description="额外参数")
+
 ):
     try:
         # request_id = str(uuid.uuid4()) #request_id_context.get()
         # logger.info(f"Request ID: {request_id}, Token: {token}")
-        word_downloda_url = f_doc_export(token, data)
+        word_downloda_url = f_doc_export(token, request_id, data)
         if word_downloda_url:
             return BaseResponse.ofSuccess(word_downloda_url)
         else: