一、环境准备与依赖安装
在开始构建档案制度建设考核表系统之前,需要确保本地运行环境已配置妥当。本方案基于Python 3.8及以上版本开发,利用其强大的数据处理库实现Excel的自动化生成与逻辑计算。请打开终端或命令行工具,依次执行以下命令安装核心依赖库。
```bash
pip install pandas openpyxl xlsxwriter
```
依赖库说明:
- pandas:用于处理考核指标的数据结构化与DataFrame转换。
- openpyxl:用于读写Excel (.xlsx) 文件,支持复杂的样式设置。
- xlsxwriter:用于向Excel文件中写入公式、图表及条件格式。
二、考核指标体系结构设计
为了实现考核表的自动化生成,首先需要将档案制度建设的考核标准进行结构化定义。我们将考核维度划分为“组织与管理”、“制度建设”、“业务管理”及“信息化建设”四个一级指标。以下是一个完整的JSON格式配置文件内容,请将其保存为assessment_config.json,该文件将作为数据源驱动后续的代码逻辑。
```json
{
"meta": {
"title": "年度档案制度建设考核表",
"version": "V2.0",
"total_score": 100
},
"dimensions": [
{
"id": "D01",
"name": "组织与管理",
"weight": 20,
"items": [
{"seq": "1.1", "content": "档案工作纳入单位年度工作计划", "standard": "有相关文件或会议记录", "score": 5, "type": "check"},
{"seq": "1.2", "content": "建立档案工作领导责任制", "standard": "明确分管领导及职责", "score": 5, "type": "check"},
{"seq": "1.3", "content": "设立综合档案工作机构", "standard": "有机构编制文件或批复", "score": 5, "type": "check"},
{"seq": "1.4", "content": "配备专职档案人员", "standard": "查看岗位说明书及名单", "score": 5, "type": "check"}
]
},
{
"id": "D02",
"name": "制度建设",
"weight": 30,
"items": [
{"seq": "2.1", "content": "建立档案归档制度", "standard": "制度完整且符合规范", "score": 10, "type": "check"},
{"seq": "2.2", "content": "建立档案保管制度", "standard": "包含库房管理、保密等内容", "score": 10, "type": "check"},
{"seq": "2.3", "content": "建立档案利用借阅制度", "standard": "有明确的借阅流程和审批", "score": 10, "type": "check"}
]
},
{
"id": "D03",
"name": "业务管理",
"weight": 30,
"items": [
{"seq": "3.1", "content": "文件材料收集齐全完整", "standard": "各类门类档案无遗漏", "score": 10, "type": "input"},
{"seq": "3.2", "content": "档案整理规范", "standard": "符合分类方案与保管期限表", "score": 10, "type": "input"},
{"seq": "3.3", "content": "档案移交及时", "standard": "次年6月底前完成移交", "score": 10, "type": "input"}
]
},
{
"id": "D04",
"name": "信息化建设",
"weight": 20,
"items": [
{"seq": "4.1", "content": "配备档案管理软件", "standard": "软件功能覆盖基本业务", "score": 10, "type": "check"},
{"seq": "4.2", "content": "建立档案目录数据库", "standard": "案卷级、文件级目录数据量", "score": 10, "type": "input"}
]
}
]
}
```
三、核心自动化脚本开发
接下来编写Python脚本generate_assessment.py。该脚本将读取上述JSON配置,生成一个带有公式计算的Excel文件。脚本包含数据解析、Excel写入、样式定义及自动评分公式植入四个核心模块。
```python
import json
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.utils import get_column_letter
def load_config(config_path):
with open(config_path, 'r', encoding='utf-8') as f:
return json.load(f)
def create_excel(data):
wb = Workbook()
ws = wb.active
ws.title = "档案制度建设考核"
定义样式
header_font = Font(name='微软雅黑', bold=True, size=11, color='FFFFFF')
header_fill = PatternFill(start_color='4F81BD', end_color='4F81BD', fill_type='solid')
center_align = Alignment(horizontal='center', vertical='center', wrap_text=True)
thin_border = Border(left=Side(style='thin'), right=Side(style='thin'),
top=Side(style='thin'), bottom=Side(style='thin'))
写入表头
headers = ['考核维度', '权重(%)', '序号', '考核指标内容', '考核标准', '分值', '自评分', '备注']
ws.append(headers)
for col in range(1, len(headers) + 1):
cell = ws.cell(row=1, column=col)
cell.font = header_font
cell.fill = header_fill
cell.alignment = center_align
cell.border = thin_border
current_row = 2
dimension_start_rows = {} 记录每个维度开始行,用于计算小计
for dim in data['dimensions']:
dim_start_row = current_row
dim_name = dim['name']
dim_weight = dim['weight']
for item in dim['items']:
维度列
ws.cell(row=current_row, column=1, value=dim_name).alignment = center_align
ws.cell(row=current_row, column=1).border = thin_border
权重列
ws.cell(row=current_row, column=2, value=dim_weight).alignment = center_align
ws.cell(row=current_row, column=2).border = thin_border
序号
ws.cell(row=current_row, column=3, value=item['seq']).alignment = center_align
ws.cell(row=current_row, column=3).border = thin_border
内容
ws.cell(row=current_row, column=4, value=item['content']).alignment = Alignment(vertical='center', wrap_text=True)
ws.cell(row=current_row, column=4).border = thin_border
标准
ws.cell(row=current_row, column=5, value=item['standard']).alignment = Alignment(vertical='center', wrap_text=True)
ws.cell(row=current_row, column=5).border = thin_border
分值
ws.cell(row=current_row, column=6, value=item['score']).alignment = center_align
ws.cell(row=current_row, column=6).border = thin_border
自评分 (预留输入口)
ws.cell(row=current_row, column=7).value = 0
ws.cell(row=current_row, column=7).border = thin_border
备注
ws.cell(row=current_row, column=8).border = thin_border
current_row += 1
dimension_start_rows[dim_name] = {'start': dim_start_row, 'end': current_row - 1, 'weight': dim_weight}
设置列宽
ws.column_dimensions['A'].width = 15
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 8
ws.column_dimensions['D'].width = 30
ws.column_dimensions['E'].width = 30
ws.column_dimensions['F'].width = 8
ws.column_dimensions['G'].width = 10
ws.column_dimensions['H'].width = 15
return wb, dimension_start_rows
def add_formulas(wb, dimension_info):
ws = wb.active
total_row = ws.max_row + 2
写入汇总表头
ws.cell(row=total_row, column=1, value="考核汇总").font = Font(bold=True, size=12)
current_summary_row = total_row + 1
total_score_cell = None
for dim_name, info in dimension_info.items():
维度名称
ws.cell(row=current_summary_row, column=1, value=dim_name)
维度得分公式:SUM(自评分列)
start_row = info['start']
end_row = info['end']
score_range = f"G{start_row}:G{end_row}"
formula = f"=SUM({score_range})"
score_cell = ws.cell(row=current_summary_row, column=2, value=formula)
score_cell.number_format = '0.00'
加权得分公式
weighted_formula = f"=B{current_summary_row} (D{info['start']+1}/100)" 这里简化处理,假设权重直接乘以得分占比逻辑,实际按需调整
修正逻辑:直接计算 (该维度自评总分 / 该维度标准总分) 权重
获取该维度标准总分
std_score_range = f"F{start_row}:F{end_row}"
real_weighted_formula = f"=(SUM({score_range})/SUM({std_score_range})){info['weight']}"
ws.cell(row=current_summary_row, column=3, value=real_weighted_formula).number_format = '0.00'
ws.cell(row=current_summary_row, column=4, value=f"权重占比: {info['weight']}%")
current_summary_row += 1
总分行
ws.cell(row=current_summary_row, column=1, value="最终考核得分").font = Font(bold=True)
ws.cell(row=current_summary_row, column=3, value=f"=SUM(C{total_row+2}:C{current_summary_row-1})").font = Font(bold=True, color='FF0000')
ws.cell(row=current_summary_row, column=3).number_format = '0.00'
if __name__ == "__main__":
config_data = load_config('assessment_config.json')
workbook, dims = create_excel(config_data)
add_formulas(workbook, dims)
output_file = "档案制度建设考核表_自动生成版.xlsx"
workbook.save(output_file)
print(f"考核表已生成:{output_file}")
```
四、样式优化与交互逻辑
上述生成的Excel已经具备了基本的结构和计算公式,但为了提升用户体验,我们需要对交互逻辑进行优化。这里主要利用openpyxl的DataValidation功能,限制“自评分”列的输入,防止用户输入超过标准分值的分数。

请在create_excel函数的循环中,在写入“自评分”单元格后添加以下代码段:
```python
from openpyxl.worksheet.datavalidation import DataValidation
... (在create_excel函数循环内部,自评分单元格设置之后) ...
创建数据验证规则:整数,介于0和该行标准分之间
注意:由于Excel公式引用动态单元格较复杂,这里演示通用的0-10分限制,实际可根据item['score']动态生成
dv = DataValidation(type="whole", operator="between", formula1="0", formula2=str(item['score']))
dv.error = "请输入有效的分数"
dv.errorTitle = "输入错误"
dv.prompt = "请输入0到{}之间的整数".format(item['score'])
dv.promptTitle = "自评分"
将规则应用到单元格
注意:DataValidation通常添加到Worksheet对象,然后指定范围
为简化演示,此处不直接写入单元格,而是建议在生成后手动设置或通过脚本统一添加范围
```
实操建议:由于逐个单元格添加数据验证会显著降低脚本运行速度,建议在生成完基础表格后,针对不同分值的列区域统一设置数据验证。例如,找出所有5分的指标区域、10分的指标区域,分别设置验证规则。
五、运行脚本与结果验证
确保assessment_config.json和generate_assessment.py位于同一目录下。在终端中执行以下命令运行脚本:
```bash
python generate_assessment.py
```
执行成功后,终端将输出考核表已生成:档案制度建设考核表_自动生成版.xlsx。打开生成的Excel文件,您将看到:
- 格式规范的表头:蓝色背景,白色文字,列宽已自动调整。
- 结构化的考核内容:按维度分组,包含序号、内容、标准和分值。
- 自动计算区域:表格底部自动生成的汇总区域,包含各维度加权得分和最终总分。
验证步骤:
- 在“自评分”列(G列)输入任意数值,例如将第一项输入5分,第二项输入3分。
- 观察底部的“考核汇总”区域,最终考核得分会自动根据公式
(自评分/标准分)权重进行更新。
- 尝试输入超过标准分值的数值(如标准分为5,输入6),若实施了步骤四的验证,系统将弹出错误提示。
六、进阶功能扩展
如果需要将此工具集成到现有的Web系统中,可以将Python脚本部署为Flask或FastAPI接口。前端只需上传JSON配置文件,后端生成Excel并返回文件流。以下是一个基于FastAPI的最小化接口示例代码:
```python
from fastapi import FastAPI
from fastapi.responses import FileResponse
import shutil
app = FastAPI()
@app.post("/generate_assessment")
async def generate_report():
调用上述核心逻辑
config_data = load_config('assessment_config.json')
workbook, dims = create_excel(config_data)
add_formulas(workbook, dims)
filename = "temp_assessment.xlsx"
workbook.save(filename)
return FileResponse(filename, media_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', filename=filename)
```
通过这种方式,您可以将枯燥的Word文档或手工Excel考核表转化为一个标准化的、可自动计算的数字化工具,极大提升档案制度建设的考核效率与数据准确性。