PCM_Report/test_actual_report_generati...

247 lines
8.2 KiB
Python
Raw Normal View History

2025-12-11 14:32:31 +08:00
#!/usr/bin/env python3
"""
测试实际的报告生成流程模拟真实环境
"""
import json
import sys
import os
import time
from pathlib import Path
def test_with_real_data():
"""使用真实数据测试报告生成"""
print("使用真实数据测试报告生成")
print("=" * 50)
# 你的实际JSON数据简化版
real_json_data = {
"tables": [{
"token": "scriptTable1",
"startRow": 0,
"startCol": 0,
"cells": [
{"row": 4, "col": 0, "value": "23.2"},
{"row": 4, "col": 1, "value": "27.5"},
{"row": 4, "col": 2, "value": "27.6"},
{"row": 5, "col": 0, "value": "24.2"},
{"row": 5, "col": 1, "value": "27.7"},
{"row": 6, "col": 0, "value": "24.9"},
{"row": 20, "col": 6, "value": "28.5"},
{"row": 1, "col": 1, "value": "2025-11-27 11:30:00"},
{"row": 1, "col": 3, "value": "2025-11-27 15:00:00"},
{"row": 0, "col": 1, "value": "16.5"}
]
}]
}
try:
import win32com.client
from win32com.client import constants
print("创建Word应用程序...")
word_app = win32com.client.Dispatch("Word.Application")
word_app.Visible = True # 显示Word窗口以便观察
print("创建新文档...")
doc = word_app.Documents.Add()
print("插入表格 (25行 x 10列)...")
table = doc.Tables.Add(doc.Range(0, 0), 25, 10)
# 在第一个单元格添加scriptTable1标记
table.Cell(1, 1).Range.Text = "scriptTable1"
print("✓ 表格创建完成已添加token标记")
# 模拟report_generator.py的处理逻辑
table_spec = real_json_data["tables"][0]
cells = table_spec["cells"]
print(f"开始处理 {len(cells)} 个单元格...")
processed = 0
errors = 0
start_time = time.time()
for i, cell_info in enumerate(cells):
try:
row = cell_info["row"] + 1 # Word索引从1开始
col = cell_info["col"] + 1
value = str(cell_info["value"])
# 检查范围
if row > 25 or col > 10:
print(f" 跳过超出范围的单元格: ({row}, {col})")
continue
# 写入单元格
cell_obj = table.Cell(row, col)
cell_obj.Range.Text = value
processed += 1
# 进度报告
if (i + 1) % 5 == 0:
elapsed = time.time() - start_time
print(f" 进度: {i + 1}/{len(cells)} ({elapsed:.1f}秒)")
# 检查是否卡住超过30秒
if elapsed > 30:
print("⚠️ 处理时间过长,可能卡住了")
break
except Exception as e:
print(f" ✗ 处理单元格 ({row}, {col}) 失败: {e}")
errors += 1
if errors > 3:
print("错误过多,停止处理")
break
total_time = time.time() - start_time
print(f"\n处理完成:")
print(f" 成功: {processed} 个单元格")
print(f" 错误: {errors} 个单元格")
print(f" 总耗时: {total_time:.1f}")
if total_time > 10:
print("⚠️ 处理时间较长,可能存在性能问题")
else:
print("✓ 处理时间正常")
# 保存测试文档
output_path = Path("E:/docx_creatorV2/test_report_output.docx")
try:
doc.SaveAs(str(output_path.absolute()))
print(f"✓ 测试文档已保存: {output_path}")
except Exception as e:
print(f"保存文档失败: {e}")
print("\n请检查Word窗口中的结果然后按Enter继续...")
input()
doc.Close(SaveChanges=False)
word_app.Quit()
return processed > 0 and errors == 0
except Exception as e:
print(f"✗ 测试失败: {e}")
try:
word_app.Quit()
except:
pass
return False
def test_template_with_scriptTable1():
"""测试在实际模板中查找scriptTable1"""
print("\n测试模板中的scriptTable1标记")
print("=" * 50)
# 查找模板文件
template_paths = [
Path("E:/docx_creatorV2/template-001.docx"),
Path("E:/docx_creatorV2/template-20250926.docx"),
Path("E:/docx_creatorV2/1000泵跑合.docx"),
Path("template-001.docx"),
Path("template-20250926.docx")
]
template_file = None
for path in template_paths:
if path.exists():
template_file = path
break
if not template_file:
print("⚠️ 未找到模板文件")
return False
print(f"使用模板: {template_file}")
try:
import win32com.client
word_app = win32com.client.Dispatch("Word.Application")
word_app.Visible = True
doc = word_app.Documents.Open(str(template_file.absolute()))
print("✓ 模板打开成功")
# 查找scriptTable1标记
found_token = False
token_location = None
if doc.Tables.Count > 0:
print(f"模板中有 {doc.Tables.Count} 个表格")
for table_idx in range(1, doc.Tables.Count + 1):
table = doc.Tables(table_idx)
print(f"检查表格 {table_idx}: {table.Rows.Count} 行 x {table.Columns.Count}")
# 搜索前几行几列
for row in range(1, min(table.Rows.Count + 1, 6)):
for col in range(1, min(table.Columns.Count + 1, 6)):
try:
cell_text = table.Cell(row, col).Range.Text.strip()
if "scriptTable1" in cell_text:
print(f"✓ 找到scriptTable1在表格{table_idx}的({row}, {col})")
found_token = True
token_location = (table_idx, row, col)
break
except:
continue
if found_token:
break
if found_token:
break
if not found_token:
print("⚠️ 未找到scriptTable1标记")
print("建议:")
print("1. 检查模板文件是否正确")
print("2. 确认scriptTable1标记的位置")
print("3. 可能需要手动在模板中添加标记")
print("\n请检查模板内容然后按Enter继续...")
input()
doc.Close(SaveChanges=False)
word_app.Quit()
return found_token
except Exception as e:
print(f"✗ 模板测试失败: {e}")
try:
word_app.Quit()
except:
pass
return False
def main():
print("实际报告生成测试")
print("=" * 60)
# 测试1: 使用真实数据
data_test_ok = test_with_real_data()
# 测试2: 检查模板
template_test_ok = test_template_with_scriptTable1()
print("\n" + "=" * 60)
print("测试结果:")
print(f"真实数据处理: {'✓ 通过' if data_test_ok else '✗ 失败'}")
print(f"模板检查: {'✓ 通过' if template_test_ok else '✗ 失败'}")
if data_test_ok and not template_test_ok:
print("\n分析:")
print("- Word COM操作正常")
print("- 可能是模板文件中缺少scriptTable1标记")
print("- 建议检查模板文件或手动添加标记")
elif not data_test_ok:
print("\n分析:")
print("- Word COM操作可能有问题")
print("- 建议检查系统资源和Word版本")
if __name__ == "__main__":
main()