Skip to content

项目2:本地报销文件整理网页

项目目标

创建一个带图形界面的网页工具,通过浏览器拖拽文件夹,自动按日期+员工姓名重命名报销单据文件。这将让你从纯黑屏命令行过渡到可视化的网页界面。

职场场景

痛点描述

每月收集员工报销单据时,你需要:

  1. 接收10+个员工发来的发票照片或PDF
  2. 手动重命名为:03-15_张三_差旅费.jpg
  3. 按日期或部门分类到不同文件夹
  4. 打包发送给财务

::: 😓 问题所在

  • 员工发来的文件名五花八门:微信图片_20240315.jpgIMG_0001.pdf...
  • 手动重命名几十个文件很枯燥
  • 容易把日期、名字、费用类型搞混
  • 每月都要重复这个枯燥流程 :::

解决后收益

用Claude Code完成后:

  • 拖拽文件夹到网页界面
  • 自动识别并按规则重命名
  • 自动分类到不同文件夹
  • 整个过程几秒钟完成

准备工作

1. 安装Python依赖

打开终端,运行:

bash
pip install streamlit pandas openpyxl

什么是Streamlit?

Streamlit是一个Python框架,可以快速创建网页界面。不需要懂HTML/CSS/JavaScript,纯Python就能做出漂亮的网页工具!

2. 准备示例文件

下载我们的示例文件::download: 报销单示例.zip

解压后包含:

  • 报销名单.xlsx(包含员工信息和报销信息)
  • 未整理的单据/文件夹(包含各种命名的发票照片)

3. 创建工作文件夹

创建 expense-organizer 文件夹,把解压的文件放进去。


开始项目

步骤1:创建Streamlit应用

打开Claude Code,复制下面的完整Prompt

✏️ 点击复制完整Prompt
text
我需要你帮我创建一个Streamlit网页应用,用于整理员工报销单据文件。

需求:
1. 网页标题:报销文件整理器
2. 上传一个Excel文件,包含:姓名、日期、费用类型
3. 上传多个文件(发票照片或PDF)
4. 根据Excel中的信息,自动重命名上传的文件
5. 重命名格式:{日期}_{姓名}_{费用类型}.{扩展名}
6. 显示重命名前后的对比
7. 提供下载按钮,下载所有重命名后的文件

界面设计:
- 左侧:上传Excel区域
- 中间:上传文件区域(支持多文件)
- 右侧:显示处理结果和对比
- 底部:下载按钮

技术要求:
- 使用streamlit库创建网页
- 使用pandas读取Excel
- 使用zipfile打包下载
- 支持中文文件名
- 添加详细的中文注释
- 添加使用说明文字

请创建app.py文件,并告诉我如何运行。

步骤2:查看生成的代码

Claude会创建一个 app.py 文件。让我们看看关键部分:

python
import streamlit as st  # Streamlit网页框架
import pandas as pd  # 处理Excel
import zipfile  # 打包文件下载
from io import BytesIO  # 内存文件处理

# 设置网页配置
st.set_page_config(
    page_title="报销文件整理器",
    layout="wide"  # 宽屏布局
)

# 网页标题
st.title("📁 报销文件整理器")
st.markdown("上传Excel报销名单和发票文件,自动按规则重命名")

# 左侧:上传Excel
with st.sidebar:
    st.header("第一步:上传报销名单")
    excel_file = st.file_uploader(
        "选择Excel文件",
        type=['xlsx', 'xls'],
        help="包含:姓名、日期、费用类型"
    )

# 主区域:上传文件
st.header("第二步:上传发票文件")
uploaded_files = st.file_uploader(
    "选择要整理的文件",
    accept_multiple_files=True,  # 支持多文件
    type=['jpg', 'jpeg', 'png', 'pdf']
)

# 处理逻辑
if excel_file and uploaded_files:
    # 读取Excel
    df = pd.read_excel(excel_file)

    # 显示数据预览
    st.subheader("报销名单预览")
    st.dataframe(df)

    # 处理每个文件
    renamed_files = []

    for idx, file in enumerate(uploaded_files):
        # 获取文件扩展名
        file_ext = file.name.split('.')[-1]

        # 根据行号匹配Excel数据
        if idx < len(df):
            row = df.iloc[idx]
            new_name = f"{row['日期']}_{row['姓名']}_{row['费用类型']}.{file_ext}"

            renamed_files.append({
                '原文件名': file.name,
                '新文件名': new_name,
                '文件内容': file.read()
            })

    # 显示结果
    st.subheader("重命名结果")
    result_df = pd.DataFrame(renamed_files)
    st.dataframe(result_df[['原文件名', '新文件名']])

    # 下载按钮
    if st.button("📦 打包下载所有文件"):
        # 创建zip文件
        with BytesIO() as zip_buffer:
            with zipfile.ZipFile(zip_buffer, 'w', zipfile.ZIP_DEFLATED) as zip_file:
                for file_info in renamed_files:
                    zip_file.writestr(
                        file_info['新文件名'],
                        file_info['文件内容']
                    )

            zip_buffer.seek(0)
            st.download_button(
                label="点击下载ZIP文件",
                data=zip_buffer,
                file_name="重命名后的报销单.zip",
                mime="application/zip"
            )

步骤3:运行应用

在终端中运行:

bash
streamlit run app.py

你会看到:

  1. 终端显示"You can now view your Streamlit app in your browser."
  2. 浏览器自动打开 http://localhost:8501
  3. 看到一个漂亮的网页界面!

::🎉 恭喜!你创建了第一个带图形界面的工具!:::

步骤4:测试应用

  1. 在左侧上传 报销名单.xlsx
  2. 在中间上传几个发票图片文件
  3. 查看重命名结果
  4. 点击下载按钮

代码解读

Streamlit 核心概念

1. 网页元素

python
# 标题
st.title("大标题")
st.header("章节标题")
st.subheader("小标题")

# 文本
st.text("普通文字")
st.markdown("**Markdown**格式")

# 数据展示
st.dataframe(df)  # 表格
st.json(data)  # JSON数据

2. 交互组件

python
# 文件上传
file = st.file_uploader("上传文件", type=['xlsx', 'jpg'])

# 按钮
if st.button("点击我"):
    # 按钮被点击时执行的代码
    st.write("按钮被点击了!")

# 选择框
option = st.selectbox("选择选项", ["选项1", "选项2"])

3. 布局

python
# 侧边栏
with st.sidebar:
    st.write("这是侧边栏内容")

# 分栏
col1, col2 = st.columns(2)
with col1:
    st.write("左边")
with col2:
    st.write("右边")

文件处理逻辑

python
# 读取上传的文件
file = st.file_uploader("上传文件")

# 读取Excel
df = pd.read_excel(file)

# 处理多文件
for uploaded_file in uploaded_files:
    content = uploaded_file.read()  # 读取文件内容
    name = uploaded_file.name  # 获取文件名

常见错误 & Debug

错误1:ModuleNotFoundError: No module named 'streamlit'

解决方法

bash
pip install streamlit

错误2:端口被占用

错误信息

Port 8501 is already in use

解决方法1:关闭占用端口的程序

bash
# Windows
netstat -ano | findstr :8501
taskkill /F /PID <PID>

# macOS
lsof -ti:8501 | xargs kill -9

解决方法2:使用其他端口

bash
streamlit run app.py --server.port 8502

错误3:中文文件名乱码

问题:下载的zip文件中,中文文件名显示为乱码

解决方法:告诉Claude添加以下代码:

python
# 修复中文文件名
import os
os.environ['LANG'] = 'en_US.UTF-8'

错误4:Excel读取失败

错误信息

ValueError: Excel file format cannot be determined

解决方法

  1. 确认文件确实是Excel格式(.xlsx或.xls)
  2. 确认文件没有损坏
  3. 尝试用Excel打开并另存为.xlsx格式

优化进阶

优化1:添加进度条

告诉Claude:

请为应用添加进度条,在处理文件时显示进度。
使用st.progress()组件。

优化2:支持拖拽上传

告诉Claude:

请优化上传界面,支持拖拽文件到指定区域上传。

优化3:添加预览功能

告诉Claude:

请添加图片预览功能,显示上传的发票缩略图。
使用st.image()组件。

优化4:批量重命名本地文件夹

上面的示例是在网页中上传文件,如果你希望直接处理本地文件夹的文件:

✏️ 处理本地文件夹的Prompt
text
请创建一个Streamlit应用,功能如下:

1. 输入一个本地文件夹路径
2. 扫描该文件夹下的所有文件
3. 读取同目录下的Excel文件
4. 根据Excel信息重命名这些文件
5. 显示重命名前后的对比
6. 确认后执行重命名操作

要求:
- 使用st.text_input输入文件夹路径
- 使用os.listdir()扫描文件
- 使用os.rename()重命名文件
- 添加确认按钮,避免误操作
- 添加详细的操作日志

项目总结

恭喜你完成了第二个项目!🎉

在这个项目中,你学会了:

  • ✅ 创建Streamlit网页应用
  • ✅ 使用图形界面处理文件
  • ✅ 在浏览器中运行本地工具
  • ✅ 文件上传和下载处理
  • ✅ 网页布局和交互组件

现在你已经从纯黑屏命令行,进步到了可视化界面!


▶️ 进入项目3:云端团队提醒Dashboard

↩️ 返回项目1


基于 Claude Code 构建