【Python实战】使用python批量生成发票

一般的贸易或者货运型公司,经常需要做发票,有时候我们会遇到需要做大批量重复性的发票时,如果人工一个个去做,即耗时而且容易出错,这时我们可以用的python和excel相关的模块去批量生成。

现在有这样一个场景,有个excel的货运发票模板invoice GIL.xls,然后需要做多个发票名称不一样,收货人不一样的多个发票。这时我们可以定义新的发票名称为 invoice_no+GIL.xls(invoice_no为变量);发票内部需要更新 invoice_no、name两个变量

所以我们可以定义两个函数,一个是获取invoice_no、name的函数 get_excel_data(packing_file),通过excel文件packing_file获取。很简单的,就是通过xlrd模块获取 invoice_no、name放置在一个二维列表中(我们也可以其他方式获取)

# 获取发票需要的动态参数:第3行第2列发票号invoice,第3行第8列姓名name
def get_excel_data(packing_file):data = xlrd.open_workbook(packing_file)table = data.sheets()[0]nrows = table.nrowsnum = 0data = []for i in range(2, nrows):row = []invoice_no = table.cell_value(i, 1)name = table.cell_value(i, 7)if invoice_no !='':num = num +1row.append(invoice_no)row.append(name)data.append(row)print('总发票数量:',num)return data

另外需要一个函数 去更新发票模板中对应位置的nvoice_no、name

def make_excel(invoice_no,name):width = 256 * 8  # 8个字符宽# 字体和格式font = xlwt.Font()font.height = 240  # 12号字体font.bold = Truefont.name = 'Times New Roman'style = xlwt.XFStyle()style.font = fontinvoice = 'F:\pythonFile\\' + invoice_no + ' ' + invoice_namedata = xlrd.open_workbook(sample_file,formatting_info=True)new_excel = copy(data)ws = new_excel.get_sheet(0)      # 获取第一个sheetfirst_col = ws.col(0)            # 第一列first_col.width=width            # 第一列宽ws.write(7, 1, name,style)             # B8(7,1)ws.write(8, 5, invoice_no,style)       # F9(8,5)new_excel.save(invoice)

这里用到了xlutils模块,复制一份发票模板的数据,注意下面的一个参数,表示全部复制模板的信息(包括样式)

formatting_info=True 

此外有width、font、height、bold、style等等关于excel字体,单元格信息等配置

最后做发票就可以了

def mk_invoices():packing_file = 'F:\pythonFile\\packing.xlsx'data = get_excel_data(packing_file)      # 获取所需参数for info in data:invoice_no = info[0]name = info[1]print(invoice_no,name)make_excel(invoice_no, name)

大多数时候发票里面的内容非常复杂,各种格式都有,执行会报错

这个时候需要对UnicodeUtils.py 进行修改一下就可以了,其中黄色部分是旧的

完整代码:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
#作者:cacho_37967865
#博客:https://blog.csdn.net/sinat_37967865
#文件:pymysqlModel.py
#日期:2018-10-22
#备注:pip install pymysql  pymysql是Python中操作MySQL的模块   F:\python_env\PaChong_env
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''import xlrd
import xlwt
from xlutils.copy import copysample_file = 'F:\pythonFile\\invoice GIL.xls'
invoice_name = 'GIL.xls'# 发票模板:需要修改的地方(动态)
def invoice():data = xlrd.open_workbook(sample_file)table = data.sheets()[0]a = table.cell_value(7, 1)b = table.cell_value(8, 5)print(a,b)# 获取发票需要的动态参数:第3行第2列发票号invoice,第3行第8列姓名name
def get_excel_data(packing_file):data = xlrd.open_workbook(packing_file)table = data.sheets()[0]nrows = table.nrowsnum = 0data = []for i in range(2, nrows):row = []invoice_no = table.cell_value(i, 1)name = table.cell_value(i, 7)if invoice_no !='':num = num +1row.append(invoice_no)row.append(name)data.append(row)print('总发票数量:',num)return data# TypeError: descriptor 'decode' requires a 'bytes' object but received a 'NoneType'
# F:\python_env\PaChong_env\lib\site-packages\\xlwt\UnicodeUtils.py
def make_excel(invoice_no,name):width = 256 * 8  # 8个字符宽# 字体和格式font = xlwt.Font()font.height = 240  # 12号字体font.bold = Truefont.name = 'Times New Roman'style = xlwt.XFStyle()style.font = fontinvoice = 'F:\pythonFile\\' + invoice_no + ' ' + invoice_namedata = xlrd.open_workbook(sample_file,formatting_info=True)new_excel = copy(data)ws = new_excel.get_sheet(0)      # 获取第一个sheetfirst_col = ws.col(0)            # 第一列first_col.width=width            # 第一列宽ws.write(7, 1, name,style)             # B8(7,1)ws.write(8, 5, invoice_no,style)       # F9(8,5)new_excel.save(invoice)def mk_invoices():packing_file = 'F:\pythonFile\\packing.xlsx'data = get_excel_data(packing_file)      # 获取所需参数for info in data:invoice_no = info[0]name = info[1]print(invoice_no,name)make_excel(invoice_no, name)if __name__ == '__main__':mk_invoices()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PS】如何将截图获取的印章迁移到新图片上

有时候我们需要特殊签名或者合同印章时,可以通过其他图片上截图后,经过处理后放置到新的图片上,这个时候我们可以通过ps进行处理,主要三个流程: 1.截取需要的签名或印章,用ps消除多余的信息; 2…

【Jmeter篇】Jmeter分布式调度压测部署

Jmeter 是java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误。为了让jmeter工具提供更大的负载能力,j…

【工具】FTP软件FileZilla下载和连接服务器

作为一名偏后台程序测试的测试工程师,经常会接触运维相关工作,与服务器打交道。 一般公司会搭建内网环境和外网环境,项目开发、SIT测试主要是在内网环境做,然后等到UTA、预投产阶段在外网环境。 如果公司业务量大,多个…

【Fiddler篇】Stave插件之环境映射

Stave是一个Fiddler扩展插件,让Fiddler能将URL映射到本地目录,实现批量文件自动响应。 Fiddler自带的AutoResponder每条自动响应规则只能对应一个本地文件, 在文件数目较多的时候,使用起来很不方便,往往需要部署到本地…

【Jmeter篇】临界区控制器Critical Section Controller业务流顺序负载压测

临界区控制器(critical section Controller) 作用:临界区控制器确保其子节点下的取样器或控制器将被执行(只有一个线程作为一个锁)确保它的子元素(samplers /控制器等)在执行控制器的子程序之前只执行一个线程作为指定…

【Python】Python3编码规范

Python核心发行代码里面优先使用ASCII码或Latin-1编码。3.0后UTF-8编码优先于Latin-1。 一 、空格与缩进: 缩进 对于每一次缩进使用4个空格。使用括号、中括号、大括号进行垂直对齐,或者缩进对齐。 制表符还是空格? 永远不要将制表符与空格混合使用。P…

【Jmeter篇】后置处理器之边界提取器

我们想从接口中提取一些想用的东西,不习惯用正则提取器和json提取器,今天我们来介绍下边界提取器,相对前者较简单些。它通过左右边界来提取需要的内容,它可以匹配任何格式的内容,如文本、json、xpath、html等等&#x…

数组对象的slice和splice方法

数组对象的slice和splice方法之前被大神虐过一次,长长记性,专门把这两个方法拿出来做一个比较,本文仅做学习笔记使用,如有任何意见或建议欢迎在评论区指出。slice定义和用法slice() 方法可从已有的数组中返回选定的元素。语法arra…

【Jmeter篇】导出Jmeter脚本及查看接口响应时间

一、通过fiddler测试接口响应时间 1、可通过Rules-Customize Rules用记事本打开,把下面的代码复制到 class Handlers中 function BeginRequestTime(oS: Session){if (oS.Timers ! null){return oS.Timers.ClientBeginRequest.ToString(); }return String.Empt…

UDP之sendto错误解决

照着视频敲完代码,发现错误: 一直百度,发现参数没有问题。。等等 于是一个代码一个代码对比: 没有写type。。。。尴尬了 以后还是要细心

【测试方法】业务流测试法之场景法

一、场景法:通过运用场景来对系统的功能点或业务流程的描述,从而提高测试效果的一种方法。用例场景来测试需求是指模拟特定场景边界发生的事情,通过事件来触发某个动作的发生,观察事件的最终结果,从而用来发现需求中存…

【Linux】crontab定时任务配置全过程

因为测试工作中需要在服务器上配置定时任务执行脚本,使用到了linux 的crontab。特此记录一下配置的整个流程。 crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。 …

【Jmeter篇】你有Fiddler、Charles抓包,我有Jmeter录制Web和App端

一、录制web端设置 1、启动jmeter,测试计划—添加—非测试元件—HTTP代理服务器 2、HTTP代理服务器设置,并启动 端口设置为8888,目标控制器选 测试计划>HTTP代理服务器,点启动,启动后在jmeter的bin目录下会生成一…

python网络编程2-黏包问题

一、复习 # ip地址:一台机器在网络上的位置 # 公网ip 私网ip # TCP协议:可靠,面向连接的,耗时长#三次握手#四次挥手 # UDP协议:不可靠,无连接,效率高 # ARP协议:通过ip找mac的过程 …

【Python实战】chinesecalendar模块处理中国股市交易日期

我们知道中国上海证券交易所和深圳证券交易所日常交易日期为星期一到星期五,并且法定节假日不交易。 我们可以通过chinesecalendar模块判断某一天是否为工作日(中国法定工作日,调休的时候有可能周末也是工作日),通过da…

【Git】码云Gitee.com管理项目全流程

Gitee.com 是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管。目前已有超过 500 万的开发者选择 Gitee。 官网:https://gitee.com/ 为了在Gitee.com上管理项目,首先需要在上面注册用户、设置SSH公钥,下面简单介绍一…

【Jmeter篇】jmeter+Ant+Jenkins实现自动化测试集成(一)

一.简介 1、什么是ant? ant是构建工具,把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作 JMeterAnt是比较常见的自动化测试框架,因为JMeter、Ant都是由java开发的,所以此性能测试框架具有良好的跨平台性&am…

python网络编程3-socketserver模块

一、复习 # 解决黏包问题 #为什么会出现黏包问题# 首先只有在TCP协议中才会出现黏包现象# 是因为TCP协议是面向流的协议# 在发送的数据传输过程中有缓存机制来避免数据丢失# 因此在连续发送小数据的时候,以及接收大小不符的时候都容易出现尿包现象# 本质还是因为我…

【测试】测试开发成长学习路线--引导篇

转载自:https://blog.csdn.net/u011541946/article/details/73382294 我相信,有很多测试人员会不断问自己,自己到底要不要坚持做测试,测试的职业发展到底怎么样?如果你还在迷茫,在到处找各种大牛问类似的问…

【Jmeter篇】jmeter Ant Jenkins接口自动化测试集成之半路逆转(二)

一、更改方案 由于上一篇文章【Jmeter篇】jmeterAntJenkins实现自动化测试集成(一)https://blog.csdn.net/qq_36502272/article/details/102682966中build.xml在cmd下执行ant正常且生成jtl文件和html文件,但是在jenkins构建多次一直失败&…