python处理excel文件

python处理excel文件可以使用openpyxl库。

精简版:

>>> import openpyxl #使用openpyxl库

#如果没有工作簿,可以创建:
>>> wb=openpyxl.Workbook() #此时工作簿中只创建一个工作表
>>> wb.sheetnames #查看工作表名字
['Sheet']
>>> wb.get_sheet_names() #或用.get_sheet_names(),为弃用的函数,警告

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
['Sheet']
>>> ws=wb.active
>>> ws.title #查看工作表标题
'Sheet'
>>> ws.title='NewTitle' #更改工作表标题
>>> ws.title
'NewTitle'

#如果已有工作簿,可以打开:
>>> wb=openpyxl.load_workbook('NewExcelFile.xlsx') #载入原有excel文件
>>> wb=openpyxl.load_workbook('NewExcelFile.xlsx',data_only=True) #设置data_only=True可以只读取数值而非公式
>>> ws=wb.active #默认激活第一个工作表
>>> ws.title #查看工作表标题
'Sheet1'

#创建新的工作表:
>>> wb.create_sheet()
<Worksheet "Sheet1">
>>> wb.get_sheet_names()
['Sheet', 'Sheet1']
>>> wb.create_sheet(index=0,title='1stSheet') #创建新工作表1stSheet并放在最前面
<Worksheet "1stSheet">
>>> wb.get_sheet_names()
['1stSheet', 'Sheet', 'Sheet1']
>>> wb.create_sheet(index=2,title='2ndSheet') #创建新工作表1stSheet并放在第3个
<Worksheet "2ndSheet">
>>> wb.get_sheet_names()
['1stSheet', 'Sheet', '2ndSheet', 'Sheet1']

#删除工作表
>>> wb.remove_sheet(wb.get_sheet_by_name('1stSheet')) #方法1,用弃用的函数删除工作表弹出警告

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function remove_sheet (Use wb.remove(worksheet) or del wb

[sheetname]).
>>> wb.remove_sheet(wb.get_sheet_by_name('Sheet1')) #方法2
>>> wb.get_sheet_names()
['Sheet', '2ndSheet']
>>> wb.remove_sheet(wb['Sheet']) #方法3
>>> wb.get_sheet_names()
['2ndSheet']
>>> del wb['2ndSheet'] #方法4
>>> wb.get_sheet_names() #工作表完全删除
[]
>>> wb.create_sheet() #创建一个工作表
<Worksheet "Sheet">

#写入数据、公式
>>> ws=wb.get_sheet_by_name('Sheet')
#方法1:
>>> ws['F6']="Writing new Value!" #F6单元格写入
>>> ws["f6"].value #单元格索引字母大小写均可
'Writing new Value!'
>>> ws["F6"]=500
>>> ws["F7"]=800
>>> ws["D3"]='=SUM(F6:F7)' #单元格写入公式
#方法2:
>>> ws.cell(1,2).value=2 #B1单元格cell()方式赋值。方法2。
>>> ws.cell(1,2).value #用cell().value查看值
2

#行列遍历
方法1:ws.max_row获得表格的最大行数,取得遍历次数,使用for循环遍历:
>>>for row in range(2, ws.max_row + 1): # 一般第一行是表头,所以从2开始,range()不含右边界
    for cell in row:
        print(cell)
方法2:openpyxl中提供了行列生成器(ws.rows和ws.columns),这两个生成器里面存储了每一行(列)的数

据,每一行由一个tuple包裹,便于对行列进行遍历:
>>>for row in ws.rows:
    for cell in row:
        print(cell)
由于ws.rows或ws.columns是生成器类型,不能直接调用,使用时往往将其转化为list类型,然后索引遍历获得

某一行(列)的内容:
>>>for cell in list(ws.rows)[0]: #打印第一行的内容
    print(cell.value)
方法3:使用sheet[行列值: 行列值]来对给定单元格范围进行遍历:
>>>for area_date in sheet[‘A1’:’H8’]: #打印A1到H8范围内的内容
    for cell in area_date:
        print(cell.value)

#插入与删除行、列:
ws.insert_rows(n) # 在第n行插入一行
ws.insert_cols(m,n) # 从第m列开始插入n列
ws.delete_cols(m, n) # 从第m列开始,删除n列
ws.delete_rows(n) # 删除第n行

#设置行高、列宽:
>>> ws['F6'] = 'Tall row'
>>> ws['D7'] = 'Wide column'
>>> ws.row_dimensions[3].height = 65 #设置第3行行高为65
>>> ws.column_dimensions['F'].width = 25 #设置F列宽为25
>>> mywb.save('Heightandwidth.xlsx')

#保存或另存为
>>> wb.save('E://desktop/NewExcelFile.xlsx') ##在桌面将excel文件保存为NewExcelFile.xlsx

详细:

1.创建和保存excel文件,查看工作表标题:

>>> import openpyxl #引用openpyxl库
>>> mywb=openpyxl.Workbook() #此时只创建一个工作表
>>> mywb.get_sheet_names() #.get_sheet_names()为弃用的函数,警告

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function get_sheet_names (Use wb.sheetnames).
['Sheet']
>>> mywb.sheetnames() #不该加括号
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    mywb.sheetnames()
TypeError: 'list' object is not callable
>>> mywb.sheetnames #新函数
['Sheet']
>>> sheet=mywb.active
>>> sheet.title #查看工作表标题
'Sheet'
>>> sheet.title='MyNewTitle' #更改工作表标题
>>> mywb.sheetnames
['MyNewTitle']
>>> mywb.save('NewExcelFile.xlsx') #在根目录下将excel文件保存为NewExcelFile.xlsx
>>> mywb.save('E://desktop/NewExcelFile.xlsx') ##在桌面将excel文件保存为NewExcelFile.xlsx

保存文件时磁盘符(C、D、E、F等,大小写均可) 后面必须跟冒号,斜线或反斜线可添加任意多个或0个,两文件夹之间至少有一个斜线或反斜线,可无文件名,此时只有后缀。文件格式保存为.xlsx或.xls均可

2.已有excel文件另存:

>>> import openpyxl
>>> mywb=openpyxl.load_workbook('NewExcelFile.xlsx') #载入原有excel文件
>>> sheet=mywb.active
>>> sheet.title='Working on Save as' #修改工作表标题
>>> mywb.save('example_NewExcelFile.xlsx') #在根目录下另存为'example_NewExcelFile.xlsx'

3.在excel中创建和删除工作表:

>>> import openpyxl
>>> mywb=openpyxl.Workbook()
>>> mywb.get_sheet_names()
['Sheet']
>>> mywb.create_sheet() #创建新工作表
<Worksheet "Sheet1">
>>> mywb.get_sheet_names()
['Sheet', 'Sheet1']
>>> mywb.create_sheet(index=0,title='1stSheet') #创建新工作表1stSheet并放在最前面
<Worksheet "1stSheet">
>>> mywb.get_sheet_names()
['1stSheet', 'Sheet', 'Sheet1']
>>> mywb.create_sheet(index=2,title='2ndSheet') #创建新工作表1stSheet并放在第3个
<Worksheet "2ndSheet">
>>> mywb.get_sheet_names()
['1stSheet', 'Sheet', '2ndSheet', 'Sheet1']


>>> mywb.remove_sheet(mywb.get_sheet_by_name('1stSheet')) #用弃用的函数删除工作表弹出警告

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).

Warning (from warnings module):
  File "__main__", line 1
DeprecationWarning: Call to deprecated function remove_sheet (Use wb.remove(worksheet) or del wb[sheetname]).
>>> mywb.remove_sheet(mywb.get_sheet_by_name('Sheet1'))
>>> mywb.get_sheet_names()
['Sheet', '2ndSheet']
>>> mywb.remove_sheet(mywb['1stSheet']) #删除不存在的工作表会报错
Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    mywb.remove_sheet(mywb['1stSheet'])
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib\site-packages\openpyxl\workbook\workbook.py", line 278, in __getitem__
    raise KeyError("Worksheet {0} does not exist.".format(key))
KeyError: 'Worksheet 1stSheet does not exist.'
>>> mywb.remove_sheet(mywb['Sheet'])
>>> mywb.get_sheet_names()
['2ndSheet']
>>> del mywb['2ndSheet'] #新语法删除工作表
>>> mywb.get_sheet_names() #工作表完全删除
[]

4.单元格写入数据、公式:

>>> import openpyxl
>>> mywb=openpyxl.Workbook()
>>> mysheet=mywb.get_sheet_by_name('Sheet')
>>> mysheet['F6']="Writing new Value!" #F6单元格写入
>>> mysheet["f6"].value #单元格索引字母大小写均可
'Writing new Value!'

>>> import openpyxl
>>> mywb=openpyxl.Workbook()
>>> mysheet=mywb.active
>>> mysheet["F6"]=500
>>> mysheet["F7"]=800
>>> sheet["D3"]='=SUM(F6:F7)' #单元格写入公式
>>> mywb.save('Applyingformula.xlsx')

当需要用变量表示单元格时, 可以使用ws.cell(row,column)方式引用,其中列号也使用数字表示,列号的字母数字转换函数如下:

col_number=openpyxl.utils.column_index_from_string(char)

col_char=openpyxl.unils.get_column_letter(number)

>>> from openpyxl.utils import*
>>> col_number=column_index_from_string('AAA')
>>> col_number
703
>>> col_char=get_column_letter(100)
>>> col_char
'CV'
>>> from openpyxl import load_workbook
>>> wb=load_workbook('NewExcelFile.xlsx')
>>> wb
<openpyxl.workbook.workbook.Workbook object at 0x0000003A6F53C668>
>>> type(wb)
<class 'openpyxl.workbook.workbook.Workbook'>
>>> ws=wb[wb.sheetnames[0]]
>>> ws
<Worksheet "MyNewTitle">
>>> type(ws)
<class 'openpyxl.worksheet.worksheet.Worksheet'>
>>> ws['A1']
<Cell 'MyNewTitle'.A1>
>>> type(ws['A1'])
<class 'openpyxl.cell.cell.Cell'>
>>> ws['A1']=1 #A1单元格赋值
>>> ws['A1'].value
1
>>> ws.cell(1,1)
<Cell 'MyNewTitle'.A1>
>>> ws.cell(1,2).value=2 #B1单元格cell()方式赋值
>>> ws.cell(1,2).value #用cell().value查看值
2

5.合并和取消合并单元格:

>>> import openpyxl
>>> mywb=openpyxl.Workbook()
>>> mysheet=mywb.active
>>> mysheet.merge_cells('B2:D3') #B2:D3合并,前者为左上角单元格,后者为右下角单元格,合并后的单元格写入时用左上角的单元格
>>> mysheet['A1']='cells merged together.'
>>> mysheet.merge_cells('F6:F7') #F6:F7合并
>>> mysheet['G5']='Two merged cells.'
>>> mywb.save('Mergingcells.xlsx')

>>> import openpyxl
>>> mywb = openpyxl.load_workbook('Mergingcells.xlsx')
>>> mysheet = mywb.active
>>> mysheet.unmerge_cells('B2:D3') #单元格取消合并
>>> mysheet.unmerge_cells('F6:F7')
>>> mywb.save('unmerged.xlsx') 

后者为右下角单元格,合并后的单元格写入时用左上角的单元格。 

6.设置行高列宽:

>>> import openpyxl
>>> mywb = openpyxl.Workbook()
>>> mysheet = mywb.active
>>> mysheet['F6'] = 'Tall row'
>>> mysheet['D7'] = 'Wide column'
>>> mysheet.row_dimensions[3].height = 65 #设置第3行行高为65
>>> mysheet.column_dimensions['F'].width = 25 #设置F列宽为25
>>> mywb.save('Heightandwidth.xlsx')

默认行高为12.75 points,1 point等于1/72 inch,行高范围为0-409.

列宽范围为0-255,可以是整数或浮点数。

行高列宽设为0时,被隐藏。

7.插入与删除行、列:

ws.insert_rows(n) # 在第n行插入一行
ws.insert_cols(m,n) # 从第m列开始插入n列
ws.delete_cols(m, n) # 从第m列开始,删除n列
ws.delete_rows(n) # 删除第n行

上述两种方式删除行(列)后,下(后)面的表格自动上(前)移。

8.行列遍历:

行列遍历有两种方式:

1.ws.max_row获得表格的最大行数,取得遍历次数,使用for循环遍历:

>>>for row in range(2, ws.max_row + 1): # 一般第一行是表头,所以从2开始,range()不含右边界
    for cell in row:
        print(cell)

2.openpyxl中提供了行列生成器(ws.rows和ws.columns),这两个生成器里面存储了每一行(列)的数据,每一行由一个tuple包裹,便于对行列进行遍:

>>>for row in ws.rows:
    for cell in row:
        print(cell)

由于ws.rows或ws.columns是生成器类型,不能直接调用,使用时往往将其转化为list类型,然后索引遍历获得某一行(列)的内容:

>>>for cell in list(ws.rows)[0]: #打印第一行的内容
    print(cell.value)

此外,还可以使用sheet[行列值: 行列值]来对给定单元格范围进行遍历:

>>>for area_date in sheet[‘A1’:’H8’]: #打印A1到H8范围内的内容
    for cell in area_date:
        print(cell.value)

9.设置字体:

>>> import openpyxl
>>> from openpyxl.styles import Font, Style
>>> mywb = openpyxl.Workbook()
>>> mysheet = mywb.get_sheet_by_name('Sheet')
>>> italic32Font = Font(size=32, italic=True)
>>> sobj = Style(font=italic32Font)
>>> mysheet['F6'].style = sobj #设置F6单元格样式为字号32,斜体
>>> mysheet['F6'] = 'Applying Styles!'
>>> mywb.save('Appliedstyle.xlsx')

>>> import openpyxl
>>> from openpyxl.styles import Font, Style
>>> mywb = openpyxl.Workbook()
>>> mysheet = mywb.get_sheet_by_name('Sheet')

>>> firstFontObj = Font(name='Arial', bold=True) #斜体和加粗均为布尔类型
>>> firstStyleObj = Style(font=firstFontObj)
>>> mysheet['F6'].style/firstStyleObj
>>> mysheet['F6'] = 'Bold Arial'

>>> secondFontObj = Font(size=32, italic=True)
>>> secondStyleObj = Style(font=secondFontObj)
>>> mysheet['D7'].style/secondStyleObj
>>> mysheet['D7'] = '32 pt Italic'
>>> mywb.save('ApplicationofStyles.xlsx')

10.获取最大行、列数

import openpyxl
wb=openpyxl.load_workbook('xxx.xlsx')
sheet=wb.active
max_row=sheet.max_row
max_column=sheet.max_column

译自:

Python Excel Writer - Python Excel http://www.pythonexcel.com/python-excel-writer.php

参考:

Python利用openpyxl处理Excel文件(单元格及行列具体操作)

Python-Excel获取最大行与列

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值