环境准备与依赖安装
在开始编写代码之前,需要确保本地计算机已经安装了Python环境。本系统基于Python 3.8开发,利用Pandas库进行数据处理和Excel文件的读写操作。请打开终端(CMD、PowerShell或Terminal),依次执行以下命令安装必要的依赖库:
```bash
pip install pandas openpyxl
```
执行完毕后,若无报错信息,即代表环境准备就绪。接下来我们将直接构建核心计算逻辑。
定义核心费率配置
医院档案数字化收费通常由基础扫描费、图像处理费、OCR识别费和挂接服务费组成。为了方便后续维护和调整,我们采用字典结构来配置不同类型档案的单价。请在项目根目录下创建一个名为config.py的文件,并输入以下代码:
```python
config.py
档案类型对应的单页扫描基础单价(单位:元)
SCAN_RATES = {
"病历档案": 0.15,
"检查报告": 0.10,
"影像胶片": 0.50,
"行政文书": 0.08,
"科研档案": 0.12
}
附加服务单价配置
EXTRA_RATES = {
"ocr_per_page": 0.05, OCR识别每页单价
"binding_per_bag": 2.00, 重新装订每袋单价
"pdf_conversion": 0.02 转PDF每页单价
}
基础服务费(每次项目的最低启动费用)
BASE_SERVICE_FEE = 100.00
```
上述配置文件将业务规则与技术代码分离,当医院调整收费标准时,只需修改此文件,无需改动主程序逻辑。
编写计算引擎核心代码
创建主程序文件calculator.py。该文件将包含读取Excel数据、应用费率逻辑、计算总价并导出结果的所有功能。以下是完整的代码实现:
```python
calculator.py
import pandas as pd
import config
def calculate_row(row):
"""
根据单行数据计算费用
"""
archive_type = row['档案类型']
pages = row['页数/张数']
needs_ocr = row['是否OCR'] 值应为 '是' 或 '否'
needs_binding = row['是否装订'] 值应为 '是' 或 '否'
1. 获取基础扫描费,处理未知档案类型
base_rate = config.SCAN_RATES.get(archive_type, 0)
scan_cost = pages base_rate
2. 计算OCR费用
ocr_cost = 0
if str(needs_ocr).strip() == '是':
ocr_cost = pages config.EXTRA_RATES['ocr_per_page']
3. 计算装订费用 (假设每袋/卷对应一行数据,若需特殊逻辑可在此修改)
binding_cost = 0
if str(needs_binding).strip() == '是':
binding_cost = config.EXTRA_RATES['binding_per_bag']
4. PDF转换费用 (默认开启)
pdf_cost = pages config.EXTRA_RATES['pdf_conversion']
5. 汇总单行总费用
total_row_cost = scan_cost + ocr_cost + binding_cost + pdf_cost
return {
"基础扫描费": round(scan_cost, 2),
"OCR识别费": round(ocr_cost, 2),
"装订费": round(binding_cost, 2),
"PDF转换费": round(pdf_cost, 2),
"单项合计": round(total_row_cost, 2)
}
def process_excel(input_file, output_file):
try:
读取Excel文件
df = pd.read_excel(input_file)
检查必要列是否存在
required_columns = ['档案类型', '页数/张数', '是否OCR', '是否装订']
for col in required_columns:
if col not in df.columns:
raise ValueError(f"Excel模板缺少必要列: {col}")
初始化结果列
result_columns = ["基础扫描费", "OCR识别费", "装订费", "PDF转换费", "单项合计"]
for col in result_columns:
df[col] = 0.0
遍历每一行进行计算
使用列表推导式提高处理大数据量时的效率
calculations = [calculate_row(row) for index, row in df.iterrows()]
将计算结果合并回DataFrame
result_df = pd.DataFrame(calculations)
for col in result_columns:
df[col] = result_df[col]
计算项目总金额
grand_total = df['单项合计'].sum()
final_total = grand_total + config.BASE_SERVICE_FEE
添加汇总行
summary_data = {col: "" for col in df.columns}
summary_data['档案类型'] = "项目总计(含基础服务费)"
summary_data['单项合计'] = round(final_total, 2)
使用pd.concat追加汇总行
summary_df = pd.DataFrame([summary_data])
final_output_df = pd.concat([df, summary_df], ignore_index=True)
导出结果
final_output_df.to_excel(output_file, index=False)
print(f"计算完成!结果已保存至: {output_file}")
print(f"项目总金额: {round(final_total, 2)} 元")
except FileNotFoundError:
print(f"错误:找不到输入文件 {input_file}")
except Exception as e:
print(f"计算过程中发生错误: {str(e)}")
if __name__ == "__main__":
input_filename = "hospital_data_input.xlsx"
output_filename = "hospital_bill_output.xlsx"
process_excel(input_filename, output_filename)
```
准备Excel数据模板

为了让程序能够正确运行,需要准备一个名为hospital_data_input.xlsx的Excel文件作为输入数据。请确保该文件与calculator.py在同一目录下,并且第一行的表头(列名)严格与以下列表一致:
- 档案类型:文本类型,可选值为“病历档案”、“检查报告”、“影像胶片”、“行政文书”、“科研档案”。
- 页数/张数:数字类型,填写需要数字化的具体页数。
- 是否OCR:文本类型,填写“是”或“否”。
- 是否装订:文本类型,填写“是”或“否”。
以下是Excel表格的具体数据示例,你可以直接复制到Excel中:
| 档案类型 |
页数/张数 |
是否OCR |
是否装订 |
| 病历档案 |
50 |
是 |
是 |
| 检查报告 |
10 |
否 |
否 |
| 影像胶片 |
2 |
是 |
否 |
| 行政文书 |
120 |
是 |
是 |
执行计算与结果验证
完成数据准备后,在终端中运行主程序:
```bash
python calculator.py
```
程序运行成功后,会在当前目录下生成hospital_bill_output.xlsx文件。打开该文件,你将看到原始数据后方新增了5列费用明细,并在表格最后一行显示了项目总计(含基础服务费)。
让我们手动验证一下第一行数据(病历档案,50页,OCR是,装订是)的计算逻辑是否正确:
- 基础扫描费:50页 × 0.15元/页 = 7.50元
- OCR识别费:50页 × 0.05元/页 = 2.50元
- 装订费:1袋 × 2.00元/袋 = 2.00元
- PDF转换费:50页 × 0.02元/页 = 1.00元
- 单项合计:7.50 + 2.50 + 2.00 + 1.00 = 13.00元
如果Excel输出文件中第一行的“单项合计”显示为13.00,则证明系统运行逻辑完全正确。你可以通过修改config.py中的费率来适配不同医院或不同年份的数字化项目需求,无需修改任何核心代码。