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="000000")   #边框样式,定义为对象

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)

最终生成表格样式如下:

原文地址:https://www.cnblogs.com/new-june/p/9279701.html

时间: 2024-10-16 02:54:09

Python openpyxl、pandas操作Excel方法简介与具体实例的相关文章

Python用Pandas读写Excel

Pandas是python的一个数据分析包,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. Pandas提供了大量能使我们快速便捷地处理数据的函数和方法. Pandas官方文档:pandas.pydata.org/pandas-docs… Pandas中文文档:www.pypandas.cn 一.安装包 pandas处理Excel需要xlrd.openpyxl依赖包 pip3 install pandas pip3 install xlrd pip3 install o

Python利用pandas处理Excel数据的应用

最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做自动化测试的时候,如果涉及到数据的读取和存储,那么而利用pandas就会非常高效,基本上3行代码可以搞定你20行代码的操作!该教程仅仅限于结合柠檬班的全栈自动化测试课程来讲解下pandas在项目中的应用,这仅仅只是冰山一角,希望大家可以踊跃的去尝试和探索! 一.安装环境: 1:pandas依赖处理Excel的xlrd模块,所以我们需要提前安装这个,安装命令

Python安装和操作EXCEL数据

一.windows下面安装Python 1.安装Python 选择的版本是3.5.2版本.windows下面的Python安装一般是通过软件安装包安装而不是命令行,所以首先要在Python的官方主页上面下载最新的Python安装包.下载地址是:https://www.python.org/downloads/ 下载好后,解压到文件夹中,一直点击下一步就OK了.在安装完成之后,打开控制台,输入“Python”,我们能够看到下面的效果: 因为python.exe文件在 Python 目录下,我们还没

Python学习笔记-操作excel

python操作excel:使用pip安装即可 一.xlwt:写excel import xlwt book = xlwt.Workbook() #新建一个excel sheet = book.add_sheet('sheet1') #加sheet页 sheet.write(0,0,'姓名') #行.列.写入的内容 sheet.write(0,1,'年龄') sheet.write(0,2,'性别') book.save('stu.xls') #结尾一定要用.xls import xlwt ti

python利用Pandas处理excel

#利用pandas处理excel文件import pandas as pddf=pd.read_excel('D:\\python.xlsx',sheet_name=0,header=None)#默认是忽略表头的,但是为了让下面的代码读取表头,设置header=None#print(df.head(1))#打印excel的前面几行,默认的是五行,这里修改数字打印前面两行a=df.values#显示excel的所有值.按照行读取.返回一个列表.列表的元素是excel每一行的列表print(a)pr

Python利用openpyxl来操作Excel,一看包你会!

自动化的工作是为了从繁琐重复的劳动中挣脱出来,把精力用在数据分析上.自动化方面python是在好不过了,不过既然要提交报表, 就不免要美观什么的.pandas虽然很强大,但是无法对Excel完全操作,现学vba有点来不及.于是就找到这个openpyxl包,用python来修改Excel.如下所示: from openpyxl import load_workbook from openpyxl.styles import colors, Font, Fill, NamedStyle from o

Pandas操作excel

读取excel:Pandas库read_excel()参数详解 pandas.read_excel(io,sheet_name = 0,header = 0,names = None,index_col = None,usecols = None,squeeze = False,dtype = None, ...) io:字符串,文件的路径对象. sheet_name:None.string.int.字符串列表或整数列表,默认为0.字符串用于工作表名称,整数用于零索引工作表位置,字符串列表或整数

python+xlrd+xlwt操作excel

介绍 xlrd(读操作),xlwt(写操作) 上述软件下载后,分别解压,之后在cmd命令下分别进入对应的目录中运行 python setup.py install 如果运行过程中提示缺少setuptools,则先运行python ez_setup.py之后在重复上面的步骤 PS:office的版本不要用太高的,建议最好用03版本的,且后缀为xls的 源码bug修复 安装好xlwt3后,找到formula.py文件,将其中的 __slots__ = ["__init__", "

python使用xlrd 操作Excel读写

此文章非本人 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境. 二.使用介绍 1.导入模块 import xlrd 2.打开Excel文件读取数据 data = xlrd.open_workbook('excelFile.xls') 默认操作桌面上的excel 3.使用技巧 获取一个工作表 table = data.sheets()[0]          #通过索引顺序获取 table =