今天不废话,直接给大家讲一下,如何零基础用Python解决财务问题,绝对的干货。我先讲解一下基本流程,再通过举例让大家直观得体会AI的神奇之处。



帮我用Python做一个小程序,避免报错,功能是批量提取XML格式发票的信息,要有简约美观的操作界面。操作界面有地址选择栏和提取按钮,选择我要处理的XML发票所在文件夹,然后点击提取后,开始执行程序并提取发票号码、开票时间、供应商名称、含税金信息,并按照序号、发票号码、开票时间、供应商名称、含税金额的格式顺序生成Excel文件,生成的文件存放在XML发票所在文件夹中,名称后面要有时间戳(用来确定操作时间以及便于区别之前生成的文件)。其中:序号按照提取顺序自动填充,发票号码在XML格式发票里面EIid中,开票时间在RequestTime中,供应商名称在SellerName中,含税金额在TotalTax-includedAmount中。
咱们将提示词喂给AI后,会生成如下代码,并附带使用说明:
import osimport xml.etree.ElementTree as ETimport pandas as pdimport tkinter as tkfrom tkinter import ttk, filedialog, messageboxfrom datetime import datetime# -------------------------- 核心功能函数 --------------------------def extract_invoice_info(xml_path):"""提取单个XML文件的发票信息:param xml_path: XML文件路径:return: 字典格式的发票信息,提取失败返回None"""try:tree = ET.parse(xml_path)root = tree.getroot()# 定义需要提取的字段(兼容XML命名空间/直接查找)invoice_data = {}# 发票号码 EIidinvoice_data['发票号码'] = root.findtext('.//EIid') or ''# 开票时间 RequestTimeinvoice_data['开票时间'] = root.findtext('.//RequestTime') or ''# 供应商名称 SellerNameinvoice_data['供应商名称'] = root.findtext('.//SellerName') or ''# 含税金额 TotalTax-includedAmountinvoice_data['含税金额'] = root.findtext('.//TotalTax-includedAmount') or ''# 过滤完全空的数据if all(value == '' for value in invoice_data.values()):return Nonereturn invoice_dataexcept Exception:# 捕获所有解析异常,不中断程序return Nonedef batch_process_xml(folder_path):"""批量处理文件夹中的所有XML文件"""if not os.path.isdir(folder_path):return []invoice_list = []# 遍历文件夹所有文件for filename in os.listdir(folder_path):if filename.lower().endswith('.xml'):file_path = os.path.join(folder_path, filename)info = extract_invoice_info(file_path)if info:invoice_list.append(info)return invoice_listdef save_to_excel(data_list, save_folder):"""保存数据到Excel,带时间戳文件名"""if not data_list:return False# 生成时间戳timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")excel_name = f"发票提取结果_{timestamp}.xlsx"excel_path = os.path.join(save_folder, excel_name)# 创建有序DataFramedf = pd.DataFrame(data_list)df.insert(0, '序号', range(1, len(df) + 1)) # 自动填充序号# 保存Exceldf.to_excel(excel_path, index=False)return True# -------------------------- GUI界面 --------------------------class InvoiceExtractorGUI:def __init__(self, root):self.root = rootself.root.title("XML发票批量提取工具")self.root.geometry("600x280")self.root.resizable(False, False)# 样式设置self.style = ttk.Style()self.style.configure('.', font=('微软雅黑', 10))self.style.configure('TButton', font=('微软雅黑', 10, 'bold'))# 文件夹路径变量self.folder_path = tk.StringVar()# 创建界面组件self.create_widgets()def create_widgets(self):# 标题title_label = ttk.Label(self.root, text="XML发票信息批量提取器", font=('微软雅黑', 14, 'bold'))title_label.pack(pady=15)# 文件夹选择区域frame = ttk.Frame(self.root)frame.pack(pady=10, padx=20, fill=tk.X)ttk.Label(frame, text="发票文件夹:").grid(row=0, column=0, padx=5, sticky=tk.W)path_entry = ttk.Entry(frame, textvariable=self.folder_path, width=45)path_entry.grid(row=0, column=1, padx=5)browse_btn = ttk.Button(frame, text="选择文件夹", command=self.select_folder)browse_btn.grid(row=0, column=2, padx=5)# 提取按钮extract_btn = ttk.Button(self.root, text="开始提取信息并生成Excel", command=self.start_extract, width=30)extract_btn.pack(pady=20)# 状态提示self.status_label = ttk.Label(self.root, text="就绪,请选择XML发票所在文件夹", foreground="gray")self.status_label.pack(pady=5)def select_folder(self):"""选择文件夹"""path = filedialog.askdirectory(title="请选择XML发票文件夹")if path:self.folder_path.set(path)self.status_label.config(text=f"已选择:{path}", foreground="green")def start_extract(self):"""开始执行提取"""folder = self.folder_path.get().strip()if not folder:messagebox.showwarning("提示", "请先选择XML发票所在文件夹!")returnself.status_label.config(text="正在提取XML信息,请稍候...", foreground="blue")self.root.update()# 执行提取invoice_data = batch_process_xml(folder)if not invoice_data:self.status_label.config(text="未找到有效发票数据,请检查XML文件", foreground="red")return# 保存Excelsuccess = save_to_excel(invoice_data, folder)if success:self.status_label.config(text="✅ 提取完成!Excel已生成在发票文件夹中", foreground="green")messagebox.showinfo("完成", f"成功提取 {len(invoice_data)} 张发票信息!\n文件已保存至:\n{folder}")else:self.status_label.config(text="❌ 生成Excel失败", foreground="red")# -------------------------- 启动程序 --------------------------if __name__ == "__main__":try:window = tk.Tk()app = InvoiceExtractorGUI(window)window.mainloop()except Exception as e:messagebox.showerror("错误", f"程序异常:{str(e)}")








我的100个财务工具计划:邀你一起破局
AI是大脑,Python是手和脚,人类指引方向。我将挑战用AI制作100个Python工具,解决财务工作中“费时间、易出错、重复率高”的痛点难点问题。
但一个人的能力和思维终究有限,很容易陷入“闭门造车”的困境。所以想真诚地邀请你,欢迎有需求、有想法以及勇于突破传统财务工作方式的小伙伴加入,让我们一起探索AI时代的财务之路!如果你在财务工作中遇到重复性的问题,都可以在评论区告诉我,以便深入的沟通交流。
后续我将陆续发布各类财务实用性小工具,非常期待你的留言,让我们一起用AI赋能财务!