python操作excel的模块简直不要太多,
> 今天就为大家比较下各模块之间的优缺点。
xlutils & xlrd & xlwt
最原始的莫过于两位老牌黄金搭档xlrd xlwt
了,针对二者的封装有如下模块:
模块 | 官网 |
xlutils | https://pypi.org/project/xlutils/ |
xlrd | https://pypi.org/project/xlrd/ |
xlwt | https://pypi.org/project/xlwt/ |
为什么把这三个一起说?
首先,xlutils封装了xlrd xlwt,所以在使用前,会先下载这两个依赖的模块。
其次,这两个模块主要用于处理xls文件,而对xlsx的文件处理很挫,甚至xlwt不支持...
但为何到现在依然在使用这些模块,因为他对xls文档处理的优势....
win32com & DataNitro
模块 | 官网 |
win32com | http://pythonexcels.com/python-excel-mini-cookbook/ |
DataNitro | https://datanitro.com/ |
这两个模块又是怎么一回事儿?他俩仅支持windows系统环境
win32com这个模块大家不算陌生了,windows下的操作,哪儿他都能插一腿...至于使用,就点击链接自己看吧...
至于DataNitro,本来不想说的,但毕竟很多帖子都提到了它,我不写不太好,但大家知道他是一个Excel 的插件,安装也需单独到官网下载即可....
pandas
模块 | 官网 |
pandas | https://www.pypandas.cn/ |
pandas作为数据分析利器,在处理excel方面也是犀利的一腿....
import pandas as pd #方法一:默认读取第一个表单 df=pd.read_excel('lemon.xlsx')#这个会直接默认读取到这个Excel的第一个表单 data=df.head()#默认读取前5行的数据 print("获取到所有的值:\n{0}".format(data))#格式化输出 #方法二:通过指定表单名的方式来读取 df=pd.read_excel('lemon.xlsx',sheet_name='student')#可以通过sheet_name来指定读取的表单 data=df.head()#默认读取前5行的数据 print("获取到所有的值:\n{0}".format(data))#格式化输出 #方法三:通过表单索引来指定要访问的表单,0表示第一个表单 #也可以采用表单名和索引的双重方式来定位表单 #也可以同时定位多个表单,方式都罗列如下所示 df=pd.read_excel('lemon.xlsx',sheet_name=['python','student'])#可以通过表单名同时指定多个 # df=pd.read_excel('lemon.xlsx',sheet_name=0)#可以通过表单索引来指定读取的表单 # df=pd.read_excel('lemon.xlsx',sheet_name=['python',1])#可以混合的方式来指定 # df=pd.read_excel('lemon.xlsx',sheet_name=[1,2])#可以通过索引 同时指定多个 data=df.values#获取所有的数据,注意这里不能用head()方法哦~ print("获取到所有的值:\n{0}".format(data))#格式化输出
xlsxwriter
模块 | 官网 |
xlsxwriter | https://xlsxwriter.readthedocs.io/ |
xlsxwriter拥有丰富的特性,支持图片/表格/图表/筛选/格式/公式等,功能与openpyxl相似,优点是相比 openpyxl 还支持 VBA 文件导入,迷你图等功能,缺点是不能打开/修改已有文件,意味着使用 xlsxwriter 需要从零开始。
代码示例:
import xlsxwriter # Create a workbook and add a worksheet. workbook = xlsxwriter.Workbook('Expenses01.xlsx') worksheet = workbook.add_worksheet() # Some data we want to write to the worksheet. expenses = ( ['Rent', 1000], ['Gas', 100], ['Food', 300], ['Gym', 50], ) # Start from the first cell. Rows and columns are zero indexed. row = 0 col = 0 # Iterate over the data and write it out row by row. for item, cost in (expenses): worksheet.write(row, col, item) worksheet.write(row, col + 1, cost) row += 1 # Write a total using a formula. worksheet.write(row, 0, 'Total') worksheet.write(row, 1, '=SUM(B1:B4)') workbook.close()
xlwings
模块 | 官网 |
xlwings | http://docs.xlwings.org/en/stable/ |
xlwings简单强大,使用方便。而且搞笑的是,这是为数不多的模块开发者,在平台卖课的,哈哈....
网络异常,图片无法展示
|
image.png
import xlwings as xw #连接到excel workbook = xw.Book(r'path/myexcel.xlsx')#连接excel文件 #连接到指定单元格 data_range = workbook.sheets('Sheet1').range('A1') #写入数据 data_range.value = [1,2,3] #保存 workbook.save()
openpyxl
模块 | 官网 |
openpyxl | https://openpyxl.readthedocs.io/en/latest/ |
最后要说说个人比较常用,也很方便的一个excel处理模块openpyxl....这个模块突出的优势在于,对excel单元格样式的设置方面特别详细。所以针对openpyxl,详细的介绍一下.
openpyxl
- 写一个工作簿
>>> from openpyxl import Workbook >>> from openpyxl.utils import get_column_letter >>> >>> wb = Workbook() >>> >>> dest_filename = 'empty_book.xlsx' >>> >>> ws1 = wb.active >>> ws1.title = "range names" >>> >>> for row in range(1, 40): ... ws1.append(range(600)) >>> >>> ws2 = wb.create_sheet(title="Pi") >>> >>> ws2['F5'] = 3.14 >>> >>> ws3 = wb.create_sheet(title="Data") >>> for row in range(10, 20): ... for col in range(27, 54): ... _ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col))) >>> print(ws3['AA10'].value) AA >>> wb.save(filename = dest_filename)
- 读取现有工作簿
>>> from openpyxl import load_workbook >>> wb = load_workbook(filename = 'empty_book.xlsx') >>> sheet_ranges = wb['range names'] >>> print(sheet_ranges['D18'].value) 3
- 插入图像 (需要依赖pillow..)
>>> from openpyxl import Workbook >>> from openpyxl.drawing.image import Image >>> >>> wb = Workbook() >>> ws = wb.active >>> ws['A1'] = 'You should see three logos below' >>> # create an image >>> img = Image('logo.png') >>> # add to worksheet and anchor next to cells >>> ws.add_image(img, 'A1') >>> wb.save('logo.xlsx')
- 使用样式
样式用于在屏幕上显示时更改数据的外观。它们还用于确定数字的格式。
样式可以应用于以下方面: - 字体设置字体大小,颜色,下划线等
- 填充以设置图案或颜色渐变
- 边框设置单元格上的边框
- 单元格排列
- 保护
以下是默认值
>>> from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font >>> font = Font(name='Calibri', ... size=11, ... bold=False, ... italic=False, ... vertAlign=None, ... underline='none', ... strike=False, ... color='FF000000') >>> fill = PatternFill(fill_type=None, ... start_color='FFFFFFFF', ... end_color='FF000000') >>> border = Border(left=Side(border_style=None, ... color='FF000000'), ... right=Side(border_style=None, ... color='FF000000'), ... top=Side(border_style=None, ... color='FF000000'), ... bottom=Side(border_style=None, ... color='FF000000'), ... diagonal=Side(border_style=None, ... color='FF000000'), ... diagonal_direction=0, ... outline=Side(border_style=None, ... color='FF000000'), ... vertical=Side(border_style=None, ... color='FF000000'), ... horizontal=Side(border_style=None, ... color='FF000000') ... ) >>> alignment=Alignment(horizontal='general', ... vertical='bottom', ... text_rotation=0, ... wrap_text=False, ... shrink_to_fit=False, ... indent=0) >>> number_format = 'General' >>> protection = Protection(locked=True, ... hidden=False) >>>
The End
今天的内容就到这里