Python openpyxl、pandas操作Excel方法简介与具体实例
本篇重点讲解windows系统下 Python3.5中第三方excel操作库-openpyxl;
其实Python第三方库有很多可以操作Excel,如:xlrd,xlwt,xlwings甚至注明的数据分析模块Pandas也提供pandas.read_excel、pandas.DataFrame.to_excel功能。
那么openpyxl的库有哪些优缺点呢:
优势:
1、openpyxl提供对pandas的dataframe对象完美支持;
2、openpyxl支持后台静默打开excel文件;
3、它支持excel的一些sort、filter筛选、排序功能,支持丰富的单元格style(样式)设计;
4、它同时支持读取现成的excel文件&创建全新的excel文件;
5、它支持最新的xlsx格式文件,且更新频繁,操作较为简练。
缺点:
1、运算效率相对不高,当表格行项目过多时,运算相对pandas等速度较慢;
2、部分针对行或列的样式设计有一定bug,语法可能失效;
3、对sort和filter的功能虽然支持,但是需要用户手工打开excel后刷新数据方能使搜索条件生效,属于半自动;
4、不支持excel原生的自动列宽功能,实现同样效果略复杂。
简单的属性和方法如下:
新建工作簿对象:
>>> from openpyxl import Workbook
>>> wb = Workbook()
定位当前活跃工作表:
>>> ws = wb.active
创建新工作表:
ws1 = wb.create_sheet("Sheet2")
工作表改名:
ws.title = "New Sheet"
如果要选择某张非活跃工作表,可以指定工作表名称,如:
ws=wb["New Sheet"]
复制工作表为副本:
>>> ws1 = wb.active
>>> ws2 = wb.copy_worksheet(ws1)
访问单元格有两种写法,如访问单元格A3,可以写作:
>>> ws['A3'] = ”hello"
或:
>>> ws.cell(row=3,column=1).value = ”hello"
也可简化为:
>>> ws.cell(3,1).value = ”hello"
访问多个单元格区域Range:
>>> cell_range = ws['A1':'B5']
同理,访问某一行(如第三行)可以写作:
>>> row3 = ws[3]
访问某一列(如C列)可以写作:
>>> colC = ws['C']
如果要访问多行多列,则用“:”分隔,如:
>>> col_range = ws['C:D']
>>> row_range = ws[5:10]
对工作表操作完成后的保存操作:
>>> wb = Workbook()
>>> wb.save('test.xlsx') #可以指定fullname,如果只包含名字本身,则文件会保存在py脚本所在的同级目录下。
PS:如果要保存的文件名已存在,则此操作将覆盖现有的文件没有警告。
导入 openpyxl.load_workbook()
来 打开一个已存在的工作簿:
>>> from openpyxl import load_workbook
>>> wb = load_workbook('test.xlsx')
通过append方法逐行写入excel,如从头写入10行数据可以这些遍历:
>>> for row in range(1, 11):
... ws1.append(range(10))
ps:workbook对象的-data_only 属性 控制细胞是否有公式的 公式(默认)或Excel读最后一次存储的值表。
对单元格写入公式,方法如下:
>>> ws["C1"] = "=average(A1, B1)"
常见的单元格合并以及取消合并,方法如下:
>>> ws.merge_cells('A1:B5')
>>> ws.unmerge_cells('A1:B5')
主要示例:1、利用openpyxl模块基于多字段拆分工作表为多张工作簿,
2、同时满足样式要求,只导入部分标红色字段数据,同时对特定行项目进行颜色标注,
3、利用pandas模块对excel文件进行排序、筛选,再写回excel。原始数据表头header如下:
主要代码如下:
- """
- 主要功能:
- 1、将需求的字段生成对应表格;2、将金额为正的(S)的行项目标记为黄色;
- 3、只导入特定物料;4、对数据源取名进行约束;
- 5、增加程序运行完毕的消息提醒;6、增加padas的排序、筛选功能
- """
- from openpyxl import load_workbook
- from openpyxl import Workbook
- from openpyxl.styles import PatternFill,Border,Side,Alignment,Protection,Font,GradientFill,Color,Colors
- import easygui as eg,pandas as pd
- import os,time
- pwd = os.getcwd()
- writer = pd.ExcelWriter('暂估表_按公司&供应商排序.xlsx')
- df1 = pd.DataFrame(pd.read_excel(os.path.join(pwd,'暂估表.xlsx'),dtype={'供应商':str,'物料':str,'采购订单':str})) #将excel读入pandas的DataFrame对象,同时约定“供应商、物料、采购订单”等字段为字符串类型,避免被pandas转化为数字
- df1=df1.sort_values(by=["公司","供应商"],ascending=True) #基于公司、供应商两个字段做升序排列,字段排序有主次之分
- df1.to_excel(writer,'Sheet1',index=False) #index=False,表明导入excel时不写入DataFrame对象的索引列
- writer.save()
- thin = Side(border_style="thin", color="") #边框样式,定义为对象
- if not os.path.exists(pwd+"\\暂估分类表"):
- os.mkdir(pwd+"\\暂估分类表")
- arr=[]
- wb = load_workbook(filename=pwd+u"\\暂估表_按公司&供应商排序.xlsx")
- ws=wb["Sheet1"]
- navigation=['公司','供应商','名称描述','物料','物料描述','数量','单位','过账日期','金额','采购订单']
- ubound=ws.max_row
- while True:
- k=2
- wb1=Workbook()
- ws1=wb1.active
- ws1.append(navigation) #所需表头为固定内容,用append方法通过列表写入第一行
- if ubound>1:
- for i in range(ubound,1,-1): #循环范围为变量,范围逐渐减小,每次循环次数递减,同时用break语句完成循环的中断,步长为-1,表明数据从表格尾行至下而上读取
- col=1
- for j in range(1,21): #遍历所有列
- if ws.cell(1,j).value in navigation and ws.cell(i,18).value !=None and ws.cell(i,18).value[0:7] =="原材料-备配件": #归纳为同一个excel的条件:上下两行的供应商、公司相同
- ws1.cell(k,col).value=ws.cell(i,j).value #新表第K行取自源表第i行数据
- if ws.cell(i,12).value=="S": #金额为正时颜色做特殊标记
- ws1.cell(k,col).fill=GradientFill(stop=['FFFF00', 'F5DEB3']) #渐变黄色底纹背景
- col=col+1
- ws1.cell(k,8).number_format="yyyy-mm-dd" #设置单元格为日期格式
- k=k+1 #新表从第一行顺序往下写,源表从最后一行往上读
- if ws.cell(i-1,1).value !=ws.cell(i,1).value or ws.cell(i-1,3).value != ws.cell(i,3).value: #判断条件:公司不相同或供应商不相同
- break
- ubound=i-1
- companyCode=ws1.cell(2,1).value #存储每张子表对应的公司代码
- vendorCode=ws1.cell(2,2).value #存储每张子表对应的供应商编号
- if companyCode !=None:
- for col in ["A","B","C","D","E","F","G","H","J"]:
- #ws1.column_dimensions[col] .border=Border(top=thin, left=thin, right=thin, bottom=thin)
- ws1.column_dimensions[col].width=25 #设置固定列宽
- for col in range(1,11):
- ws1.cell(1,col).font=Font(name='Microsoft YaHei',size=13,bold=True,color=colors.RED) #设置标题行的字体样式
- ws1.cell(1,col).border=Border(top=thin, left=thin, right=thin, bottom=thin) #设置标题行的边框样式
- wb1.save(pwd+"\\暂估分类表\\%s_%s.xlsx"%(companyCode,vendorCode)) #拆分后的表格按公司代码、供应商编号排序
- else:
- break
- eg.msgbox(msg='(暂估表拆分完成)', title='Information', ok_button='确定', image=None, root=None)
最终生成表格样式如下:
Python openpyxl、pandas操作Excel方法简介与具体实例的更多相关文章
- 转 Python - openpyxl 读写操作Excel
Python - openpyxl 读写操作Excel openpyxl特点 openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间 ...
- Python - openpyxl 读写操作Excel
openpyxl特点 openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易 注意:如果文字编码是“gb2312” 读取后就会显 ...
- Python Pandas操作Excel
Python Pandas操作Excel 前情提要 ☟ 本章使用的 Python3.6 Pandas==0.25.3 项目中需要用到excel的文件字段太多 考虑到后续字段命名的变动以及中文/英文/日 ...
- Python利用pandas处理Excel数据的应用
Python利用pandas处理Excel数据的应用 最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...
- C++ builder 操作Excel方法(据网上资料整理)
c++ builder 操作Excel方法,下面是从网上找到的一些不错的方法,学习一下: 用OLE操作Excel(目前最全的资料)(04.2.19更新) 本文档部分资料来自互联网,大部分是ccrun( ...
- poi-3.11-beta2-20140822.jar操作excel方法
poi-3.11-beta2-20140822.jar操作excel方法 根据不同类型读取值的方法: // 获取单元格内不同类型的值 public String getValueByType(HSSF ...
- 【Python自动化Excel】pandas操作Excel的“分分合合”
话说Excel数据表,分久必合.合久必分.Excel数据表的"分"与"合"是日常办公中常见的操作.手动操作并不困难,但数据量大了之后,重复性操作往往会令人崩溃. ...
- Python使用openpyxl模块操作Excel表格
''' Excel文件三个对象 workbook: 工作簿,一个excel文件包含多个sheet. sheet:工作表,一个workbook有多个,表名识别,如"sheet1",& ...
- Python用Pandas读写Excel
Pandas是python的一个数据分析包,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具.Pandas提供了大量能使我们快速便捷地处理数据的函数和方法. Pandas官方文档 ...
随机推荐
- 【云计算】IaaS、PaaS和SaaS
1. SaaS:Software-as-a-Service(软件即服务) 提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器.消费者不需要管理或 ...
- 如何用jQuery获取选中行固定列的数据
[本文出自天外归云的博客园] 问题:把选中行的ID统计出来,组成一个数组传给后台(选中行的特点:class为danger) 办法如下: // 多选后点击下线按钮 $("#offline&qu ...
- 看雪CTF第十四题
from z3 import * dest=[] s = Solver() data = [, , , , , , , , , , , , , , , , , , , , , , , , , , , ...
- 巴塞罗那VS皇家马德里
刚刚看完巴萨VS皇马的比赛,跌宕起伏,悬念保持到了最后一分钟的最后一回合 ---- 梅西绝杀. 工作之后,很少看比赛了.一直觉得梅西.C罗双子星的时代正在接近尾声,自己要尽量看一场少一场,免得到时后悔 ...
- Android中使用BufferedReader.readline阻塞读取不到数据,但是ready返回true
通过socket测试工具在电脑上发送消息,Android真机可以收到响应BufferedReader.ready()返回true,但是readline却一直阻塞. 原因:readline()只有在遇到 ...
- Windows 安装服务 的两种方式
第一种 - 安装服务时自定义服务名称:(注意 binpath= 和路径之间的那个空格)sc create 服务名称 binpath= "D:\Service.exe" di ...
- chmod chown
chmod以及chown,其中可以用递归参数-R来实现更改所有子文件和子目录的权限. 1.利用chmod修改权限: 对Document/目录下的所有子文件与子目录执行相同的权限变更: chmod -R ...
- SpringBoot------自定义Logback日志
帮助文档: https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-featur ...
- springmvc 返回 404 解决
Idea Maven springmvc spring 项目搭建中/url 可以访问controller,并且能返回正确的ModelAndView,但是页面总是显示404 项目结构: web.xml ...
- C#队列Queue实现一个简单的电商网站秒杀程序
电商的秒杀和抢购,对程序员来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要. 我们 ...