PCM_Report/test_actual_report_generati...

247 lines
8.2 KiB
Python
Raw Permalink Blame History

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.

#!/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()