前言

作为一名财务工作人员,每月月底,需要将当月财务部门多个开票员开具的发票信息进行汇总统计。该项工作其实难度不大,但由于开票量大,开票人数多,工作较为繁琐,只是复制粘贴的话总是会出现各种各样的问题,比如,Ctrl+C Ctrl+V的时候会同时复制大量的乱七八糟的单元格样式,造成表格很卡;复制粘贴为数值时小数点的位数出错等等。这些错误只有遇到的时候才知道有多么的头疼。所以,为了提高效率,准确率,想办法用python实现自动化汇总才是王道。

思路

作为财务的都知道开发票需要税控盘,刚好,税控盘里有开票资料导出功能,可以导出xls格式和xml格式。导出的表格有大量的空格,处理起来比较麻烦,所以选择使用xml格式,同时利用pythonxml库来读取数据。

xml文件里读取需要的数据之后,将其写入到xlsx 文件中,然后按需要整理格式及样式即可。

总体的思路如下:
1、逐个读取收集来的xml中需要用到的发票信息,保存在一个变量中
2、将读取的发票信息按不同开票人和发票类型写入同一个工作簿的不同sheet中,写入sheet的同时需要按发票开具的时间进行排序
3、将所有人的信息汇总到一张工作表中

代码实现

1、逐个读取xml文件

from xml.dom.minidom import parseStringdef get_xmlinfo(path):"""读取xml文件中的有用数据"""with open(path,encoding='GB2312') as f:  # 导出的xml文件的编码格式为GB2312  datasource=f.read()element = parseString(datasource).documentElementnodes = element.getElementsByTagName('Fp')    # 找到"Fp"节点result = {}for i in range(len(nodes)):fp={}   # 每个Fp节点是一张发票的信息,新建一个字典来保存需要的信息sun_node = nodes[i].childNodes   # Fp节点的子节点为Fpzl  Lbdm等节点for j in range(len(sun_node)):  # 循环输出子节点的信息if(sun_node[j].nodeName=="#text" or sun_node[j].nodeName=="Spxx"):continuetry:fp[sun_node[j].nodeName]=sun_node[j].firstChild.dataexcept:fp[sun_node[j].nodeName]=""    # 部分节点无数据,为避免报错,设置为空result[fp["Kprq"]]=fp  # 开票日期具体到时分秒,以此为主键可以避免重复,同时也方便后续排序return  result

2、写入excel文件

from openpyxl import Workbookdef writeexcel(wb,data):"""根据读取的xml文件的信息,按需要的格式写入到excel文件中"""rq=sorted(data.keys())   # 按开票日期进行排序sheet = wb.create_sheet(data[rq[0]]['Fpzl']+"-"+data[rq[0]]['Kpr']) # 按发票类型和开票人定义sheet名head = ('Kprq','Gfmc','Lbdm','Fphm','Hjje','Hjse','Jshj','Sl','Kpr','Fpzl','Fpzt')# 设置表头sheet.append(head)i=2for kpsj in rq:sheet.cell(row=i, column=head.index('Kprq') + 1).value = data[kpsj]['Kprq']sheet.cell(row=i, column=head.index('Gfmc') + 1).value = data[kpsj]['Gfmc']sheet.cell(row=i, column=head.index('Lbdm') + 1).value = data[kpsj]['Lbdm']sheet.cell(row=i, column=head.index('Fphm') + 1).value = data[kpsj]['Fphm']sheet.cell(row=i, column=head.index('Kpr') + 1).value = data[kpsj]['Kpr']sheet.cell(row=i, column=head.index('Fpzl') + 1).value = data[kpsj]['Fpzl']sheet.cell(row=i, column=head.index('Fpzt') + 1).value = data[kpsj]['Fpzt']if data[kpsj]['Fpzt']!="填开作废" and data[kpsj]['Fpzt']!="空白作废":sheet.cell(row=i, column=head.index('Hjje') + 1).value = float(data[kpsj]['Hjje'])sheet.cell(row=i, column=head.index('Hjse') + 1).value = float(data[kpsj]['Hjse'])sheet.cell(row=i, column=head.index('Jshj') + 1).value = round(float(data[kpsj]['Hjse']) + float(data[kpsj]['Hjje']),2)sheet.cell(row=i, column=head.index('Sl') + 1).value = '{:.0%}'.format(float(data[kpsj]['Hjse'])/float(data[kpsj]['Hjje']))else:# 作废发票的金额税额价税合计填0sheet.cell(row=i, column=head.index('Hjje') + 1).value = 0sheet.cell(row=i, column=head.index('Hjse') + 1).value = 0sheet.cell(row=i, column=head.index('Jshj') + 1).value = 0sheet.cell(row=i, column=head.index('Sl') + 1).value = '0%'i=i+1

3、多sheet汇总

import os
import openpyxl
import pandas as pddef merge_sheet(excel_file_name):"""汇总多个工作表sheet至汇总工作表只要是同样的需求该函数都可用,不只局限于该场景"""summary_sheet = Nonereader = pd.ExcelFile(excel_file_name)for sheet_name in reader.sheet_names:sheet = reader.parse(sheet_name=sheet_name, dtype=str,header=0)  # 循环读取每一个sheet,忽略第一行标题# 加上dtype=str参数可以避免发票代码,发票号码等需要以文本格式存储的数字,变成纯数字导致前面的0丢失。if summary_sheet is None:summary_sheet = sheetelse:summary_sheet = pd.concat([summary_sheet, sheet], ignore_index=True)old_name, _ = os.path.splitext(excel_file_name)writer = pd.ExcelWriter(old_name + "-合并.xlsx", engine="openpyxl")wb = openpyxl.load_workbook(filename=excel_file_name)writer.book = wb  # 需要汇总表与明细表在同一个工作簿,加上上面两句,不加则合并表格只有汇总sheetsummary_sheet.to_excel(writer, sheet_name="汇总", index=False)  # 不需要索引writer.save()return None

4、批量处理

def searchWithSuffixxes(base_path,suffixes):"""查找当前路径之下所有的特定后缀(suffixes)的文件返回  指定类型的文件路径  列表"""paths = []for root,dirs,names in os.walk(base_path):for name in names:if name.endswith(suffixes):paths.append(os.path.join(root,name))return  pathsif __name__=="__main__":# 遍历当前路径下所有的xml文件,逐一调用上述函数base_path = os.getcwd()all_files = searchWithSuffixxes(base_path,".xml")wb = Workbook()for file in all_files:try:xml_info=get_xmlinfo(file)writeexcel(wb,xml_info)except:continuedel wb['Sheet']file_name = os.path.join(base_path,"发票明细"+datetime.datetime.now().strftime('%Y%m%d%H%M%S')+".xlsx")wb.save(file_name)merge_sheet(file_name)

Python办公自动化——发票开具明细汇总相关推荐

  1. Python办公自动化实践1:从多个excel表中提取数据并汇总到一个工作表页中,表格,抽取,sheet

    Python办公自动化实践1:从多个excel表中提取数据并汇总到一个工作表页中,表格,抽取,sheet 发表时间:2020-04-26 问题:从当前目录或子目录中查询符合条件的excel表格,并从这 ...

  2. 知识汇总:Python办公自动化应该学习哪些内容

    当前python自动化越来越受到欢迎,python一度成为了加班族的福音.还有大部分人想利用python自动化来简化工作,不知道从何处下手,所以,这里整理了一下python自动化过程中的各种办公场景以 ...

  3. python提取发票信息发票识别_python 发票识别

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本接口支持机动车销售统一发票和二手车销售统一发票的识别,包括发票号码.发票代码. ...

  4. python办公自动化(9)利用pandas的行列转换处理排班表

    python办公自动化(9)利用pandas的行列转换处理排班表 原始数据: 处理效果: 1.pandas行转列 #!/usr/bin/python # -*- coding: gbk -*- imp ...

  5. 关于发票的这些事儿,发票问题大汇总42个问题,15种发票不能抵扣

    关于发票的这些事儿,你要知道 2016年08月18日12:51 中国政府网公众号 1微博微信空间分享添加喜爱 丨来源:河北国税 一直以来,发票工作是会计人的一道坎,也是众多企业与财会人员关注的重点.增 ...

  6. Python办公自动化

    办公自动化 文章目录 办公自动化 文件与文件夹 os模块 批量操作文件及文件夹 文件相关读写操作及临时文件 压缩和解压缩文件 案例 **王者图片下载批量打包处理** 文件搜索工具 文件自动分类 一键自 ...

  7. Python办公自动化,自动更新表格,告别繁琐!

    大家好,又到了Python办公自动化专题 . 今天我们讲解的案例是如何使用Python自动更新Excel表格,简单来说就 是 每天都会对Excel中多个sheet进行更新,需要操作完后可以用程序完成第 ...

  8. 21年最新Python面试题及答案汇总详解(上)

    错过三月找工作的机会,还要错过四月的好时期吗?Python面试你做准备了吗?下面小编整理了一套2021年最新Python常见面试题目,及Python面试题目答案汇总.希望能够帮助到大家. 21年最新P ...

  9. 【组队学习】【26期】编程实践(Python办公自动化)

    编程实践(Python办公自动化) 论坛版块: http://datawhale.club/c/team-learning/29-category/29 开源内容: https://github.co ...

  10. python基础知识资料-学习Python列表的基础知识汇总

    千里之行,始于足下.要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好.今天,本喵带大家仔细温习一下Python的列表.温故而知新,不亦说乎. 当然,温习的同时也要发散思考,因为有些看似无关紧要 ...

最新文章

  1. python xpath语法-Python爬虫之XPath语法
  2. 如何用VC++开发读取网卡MAC地址的程序
  3. java例程练习(布局管理器[FlowLayout])
  4. 03-instancing 工程分析详解
  5. js 查错_7年前端开发经验的我,写了本Vue.js实战开发,开源高清PDF下载
  6. 记一次Cassandra Java堆外内存排查经历
  7. Ubuntu下Chrome浏览器不能以根用户身份运行的解决方法
  8. kettle java代码详解_kettle 如何使用java代码
  9. c语言除去字符串多余的空格,从一个字符串中去除多余的空格(用指针描述)...
  10. python进阶(一)
  11. mysql-multi source replication 配置
  12. java拦截器与AOP的区分理解
  13. Java 开发工具 Eclipse
  14. 微型计算机忘记密码,一种基于微型计算机的密码锁的制作方法
  15. java action接口,Struts2 Action接口与ActionSupport类
  16. 《机器学习基础》学习笔记-1
  17. yii2 如何用命名空间方式使用第三方类库
  18. Solr之——配置中文分词IKAnalyzer和拼音分词pinyinAnalyzer
  19. 推荐一个好用的tcp udp调试工具——TCP/UDP Debugger
  20. 云边端协同EasyCVR平台语音对讲配置的注意事项汇总

热门文章

  1. 2008年9月23号,星期二,晴。博观而约取,厚积而薄发。(苏轼)
  2. PROFINET的时钟同步(一)
  3. 杰理之ANC降噪的硬件要求和物料选型【篇】
  4. git 解决合并冲突
  5. 天玑720可以升级鸿蒙系统吗,华为高管:来岁年初就能用上鸿蒙体系,55部华为产物可升级鸿蒙...
  6. from表单的重置按钮(reset)不能重置隐藏input框的值
  7. 11:c# oop思想面向对象编程(by-朝夕)
  8. 至强服务器性能排行,英特尔至强处理器排名天梯 至强cpu天梯2020排名
  9. 矩阵特征值和特征向量详细计算过程
  10. 【Scratch】青少年蓝桥杯_每日一题_12.01_角色装扮