开发环境准备与依赖安装
在开始构建档案数字化收费标准计算系统之前,必须先配置好Python运行环境。本系统基于Python 3开发,利用Pandas进行数据处理和Excel报表生成。请严格按照以下步骤操作,确保环境无误。
1. 安装Python解释器
如果你的电脑尚未安装Python,请直接访问Python官方 releases 页面下载对应操作系统的安装包。下载地址为:https://www.python.org/downloads/。下载Windows installer(64-bit)后,运行安装程序。在安装向导的第一屏,务必勾选底部的 "Add Python to PATH" 选项,然后点击 "Install Now" 完成安装。
2. 验证安装状态
打开终端(Windows下按Win+R输入cmd,回车),输入以下命令验证Python是否安装成功:
python --version
如果终端返回版本号(如 Python 3.10.12),说明安装成功。如果报错,请检查环境变量PATH设置。
3. 安装必要依赖库
本系统需要处理Excel文件和结构化数据,需安装 pandas 和 openpyxl 库。在终端中执行以下命令:
pip install pandas openpyxl
等待安装进度条走完,无报错即表示环境准备就绪。
收费标准配置逻辑设计
档案数字化的收费并非简单的“页数×单价”,通常包含基础扫描费、图像处理费、OCR识别费、数据录入费以及特殊载体处理费。为了实现零门槛操作,我们将通过配置文件来管理这些复杂的计费规则,避免硬编码到代码中。
我们定义一个标准的计费模型,包含以下核心维度:
- 基础扫描费:根据纸张大小(A4、A3)和色彩模式(黑白、彩色)定价。
- 图像处理费:包含去噪、去污、倾斜校正,通常按页计费。
- OCR识别费:双文种(中英)或单文种,按页计费。
- 条目著录费:根据录入字段的数量(如题名、文号、日期)按条计费。
在代码中,我们将使用一个字典结构 PRICE_CONFIG 来存储这些标准单价。这样,当市场行情波动时,只需修改配置字典中的数值,无需改动计算逻辑代码。
核心计算代码实现

以下是完整的Python脚本代码。该脚本定义了一个 ArchiveCalculator 类,能够接收档案明细数据,自动计算每一项的费用,并汇总总金额。请将以下代码完整复制并保存为 archive_calculator.py。
```python
import pandas as pd
from typing import List, Dict
class ArchiveCalculator:
def __init__(self):
核心计费配置:此处定义所有单价标准
self.price_config = {
扫描单价 (元/页)
'scan': {
'A4_BW': 0.15, A4黑白
'A4_COLOR': 0.50, A4彩色
'A3_BW': 0.30, A3黑白
'A3_COLOR': 0.80 A3彩色
},
图像处理单价 (元/页)
'image_process': 0.10,
OCR识别单价 (元/页)
'ocr': 0.20,
条目著录单价 (元/条),假设每条目录包含6个基础字段
'metadata_entry': 2.50
}
def calculate_item_cost(self, item: Dict) -> Dict:
"""
计算单条档案记录的费用
:param item: 包含档案详情的字典
:return: 添加了费用明细的字典
"""
1. 获取基础参数,设置默认值防止KeyError
paper_size = item.get('纸张大小', 'A4')
color_mode = item.get('色彩模式', '黑白')
page_count = int(item.get('页数', 0))
has_ocr = item.get('是否OCR', False)
entry_count = int(item.get('著录条数', 0))
2. 计算扫描费
scan_key = f"{paper_size}_{color_mode.upper()}"
如果配置中找不到对应组合,默认按A4黑白计费
unit_scan_price = self.price_config['scan'].get(scan_key, self.price_config['scan']['A4_BW'])
total_scan_cost = page_count unit_scan_price
3. 计算图像处理费 (默认所有扫描页都需要处理)
total_process_cost = page_count self.price_config['image_process']
4. 计算OCR费
total_ocr_cost = 0
if has_ocr:
total_ocr_cost = page_count self.price_config['ocr']
5. 计算著录费
total_entry_cost = entry_count self.price_config['metadata_entry']
6. 汇总单条总价
total_cost = total_scan_cost + total_process_cost + total_ocr_cost + total_entry_cost
将费用明细写回字典
item['扫描单价'] = unit_scan_price
item['扫描小计'] = round(total_scan_cost, 2)
item['图像处理小计'] = round(total_process_cost, 2)
item['OCR小计'] = round(total_ocr_cost, 2)
item['著录小计'] = round(total_entry_cost, 2)
item['该项总费用'] = round(total_cost, 2)
return item
def process_batch(self, data_list: List[Dict]) -> pd.DataFrame:
"""
批量处理档案数据
:param data_list: 档案数据列表
:return: 包含费用的DataFrame
"""
calculated_data = []
for item in data_list:
res = self.calculate_item_cost(item)
calculated_data.append(res)
df = pd.DataFrame(calculated_data)
return df
def generate_report(self, df: pd.DataFrame, output_path: str = '数字化收费报价单.xlsx'):
"""
生成Excel报价单
"""
计算总金额
grand_total = df['该项总费用'].sum()
添加汇总行
summary_row = {col: '' for col in df.columns}
summary_row['档案名称'] = '合计'
summary_row['该项总费用'] = grand_total
将汇总行追加到DataFrame
df_final = pd.concat([df, pd.DataFrame([summary_row])], ignore_index=True)
导出Excel
try:
df_final.to_excel(output_path, index=False, engine='openpyxl')
print(f"报价单已生成成功:{output_path}")
print(f"本次报价总金额为:{grand_total} 元")
except Exception as e:
print(f"导出Excel失败:{e}")
执行入口
if __name__ == "__main__":
模拟输入数据:实际使用时可以从Excel读取或API获取
raw_data = [
{'档案名称': '2010年人事档案卷一', '纸张大小': 'A4', '色彩模式': '黑白', '页数': 150, '是否OCR': True, '著录条数': 10},
{'档案名称': '2005年工程图纸A', '纸张大小': 'A3', '色彩模式': '彩色', '页数': 50, '是否OCR...': False, '著录条数': 5},
{'档案名称': '2018年财务凭证', '纸张大小': 'A4', '色彩模式': '黑白', '页数': 300, '是否OCR': True, '著录条数': 0},
]
calculator = ArchiveCalculator()
result_df = calculator.process_batch(raw_data)
打印预览
print(result_df[['档案名称', '扫描小计', 'OCR小计', '该项总费用']])
生成文件
calculator.generate_report(result_df)
```
实操运行与数据录入
代码编写完成后,接下来是实际的运行操作。为了适应不同的使用场景,我们将演示如何修改输入数据以适应个人或小团队的数字化计费需求。
1. 修改输入数据
在脚本底部的 if __name__ == "__main__": 代码块中,raw_data 变量存储了待计算的档案列表。你可以根据实际情况修改这个列表。每一行代表一卷档案或一批文件。
字典中的关键字段含义如下:
- 档案名称:字符串,用于标识文件。
- 纸张大小:字符串,支持 'A4' 或 'A3'。
- 色彩模式:字符串,支持 '黑白' 或 '彩色'。
- 页数:整数,该卷档案的总页数。
- 是否OCR:布尔值,True表示需要进行文字识别,False表示不需要。
- 著录条数:整数,需要人工录入的目录条目数量。
2. 运行脚本
在终端中,导航到你保存 archive_calculator.py 的目录,然后执行以下命令:
python archive_calculator.py
3. 查看输出结果
脚本运行成功后,终端会首先打印一个简略的费用预览表,显示每卷档案的扫描费、OCR费和单项总费用。随后,程序会在当前目录下生成一个名为 数字化收费报价单.xlsx 的Excel文件。
打开该Excel文件,你将看到每一列的详细计费过程,包括扫描单价、图像处理小计等,最后一行会自动加粗显示(在代码逻辑中是追加了一行)总金额。这种透明化的计算方式非常适合向客户展示费用构成,也方便个人核对数字化成本。
从Excel读取数据的进阶用法
直接在代码中修改 raw_data 适合少量数据。如果你手头已经有一个Excel清单,可以通过以下代码替换 raw_data 的生成逻辑,实现直接从Excel读取并计算。
请在 ArchiveCalculator 类中添加一个静态方法,并修改主程序入口:
```python
在类内部添加此方法
@staticmethod
def load_from_excel(file_path: str) -> List[Dict]:
"""
从Excel读取原始档案数据
要求Excel表头包含:档案名称, 纸张大小, 色彩模式, 页数, 是否OCR, 著录条数
"""
try:
df = pd.read_excel(file_path)
将布尔值字符串转换为布尔类型(如果Excel里存的是'是/否'或'True/False')
def parse_bool(val):
if isinstance(val, bool): return val
if str(val).strip() in ['是', 'True', 'true', '1']: return True
return False
data_list = []
for _, row in df.iterrows():
item = {
'档案名称': row['档案名称'],
'纸张大小': row['纸张大小'],
'色彩模式': row['色彩模式'],
'页数': int(row['页数']),
'是否OCR': parse_bool(row['是否OCR']),
'著录条数': int(row['著录条数'])
}
data_list.append(item)
return data_list
except Exception as e:
print(f"读取Excel失败,请检查表头是否正确:{e}")
return []
修改主程序入口逻辑
if __name__ == "__main__":
假设你有一个名为 '待处理档案清单.xlsx' 的文件
input_file = '待处理档案清单.xlsx'
raw_data = ArchiveCalculator.load_from_excel(input_file)
如果没有Excel文件,继续使用测试数据
if not raw_data:
print("未读取到数据,使用内置测试数据...")
raw_data = [
{'档案名称': '测试卷', '纸张大小': 'A4', '色彩模式': '黑白', '页数': 10, '是否OCR': True, '著录条数': 1}
]
calculator = ArchiveCalculator()
result_df = calculator.process_batch(raw_data)
calculator.generate_report(result_df)
```
通过这种方式,你只需要维护一个Excel清单作为输入,运行脚本即可瞬间获得包含所有费用明细的报价单。这完全实现了个人档案数字化收费标准的自动化计算,大幅提升了工作效率,确保了计费的准确性和一致性。