项目2:本地报销文件整理网页
项目目标
创建一个带图形界面的网页工具,通过浏览器拖拽文件夹,自动按日期+员工姓名重命名报销单据文件。这将让你从纯黑屏命令行过渡到可视化的网页界面。
职场场景
痛点描述
每月收集员工报销单据时,你需要:
- 接收10+个员工发来的发票照片或PDF
- 手动重命名为:
03-15_张三_差旅费.jpg - 按日期或部门分类到不同文件夹
- 打包发送给财务
::: 😓 问题所在
- 员工发来的文件名五花八门:
微信图片_20240315.jpg、IMG_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你会看到:
- 终端显示"You can now view your Streamlit app in your browser."
- 浏览器自动打开
http://localhost:8501 - 看到一个漂亮的网页界面!
::🎉 恭喜!你创建了第一个带图形界面的工具!:::
步骤4:测试应用
- 在左侧上传
报销名单.xlsx - 在中间上传几个发票图片文件
- 查看重命名结果
- 点击下载按钮
代码解读
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解决方法:
- 确认文件确实是Excel格式(.xlsx或.xls)
- 确认文件没有损坏
- 尝试用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网页应用
- ✅ 使用图形界面处理文件
- ✅ 在浏览器中运行本地工具
- ✅ 文件上传和下载处理
- ✅ 网页布局和交互组件
现在你已经从纯黑屏命令行,进步到了可视化界面!