一、7大库优缺点对比
库名称 功能描述 优缺点
openpyxl 读写Excel 的xlsx/xlsm/xltm/xltx文件 简单易用,功能广泛,单元格格式/图片/表格/公式/筛选/批注/文件保护等功能应有尽有;缺点是对VBA的支持不够好,读取文件效率较其他库低。
xlutils xlrd/xlwt 老牌Python包 xlrd:读xls/xlsx xlwt:写xls xlutils=xlrd+xlwt 读写效率高,功能单一;不支持写xlsx文件
xlsxwriter 创建xlsx文件 支持图片/表格/图表/筛选/格式/公式等,功能与openpyxl相似,优点是相比openpyxl还支持VBA文件导入,缺点是不能打开/修改已有文件
win32com 不仅可以处理Excel,还可以处理office;该库不单独存在,可以通过安装pywin32获取。 相当于是windows COM的封装,自身并没有很完善的文档,新手使用会有点痛苦。
xlwings 支持xls读,xlsx读写。可结合VBA实现对Excel编程 支持numpy array 和pandas DataFrame数据类型。除读写等基本操作外,大部分功能通Win32 COM PAI 实现。
pandas Pandas 将Excel作为输入/输出数据的容器。数据处理才是pandas的主要用途。 读取xls调用xlrd,读取xlsx调用xlrd或openpyxl。写入Excel调用openpyxl或xlswriter。
Microsoft Excel API 直接与Excel进程通信 需安装pywin32,可以做任何在Excel里可以做的事情,但比较慢。
二、xlrd读取Excel表
xlrd读取Excel表数据非常快,支持.xls和.xlsx
1、安装xlrd模块
pip install xlrd
2、xlrd读取Excel表
1)打开Excel表
错误:
xlrd-2.0.1不支持xlsx,需要卸载,安装1.2版本,需要自行解决
pip install xlrd=1.2.0
2)获取全部表名
import xlrd #打开文件 wb = xlrd.open_workbook("test.xls") list_name = wb.sheet_names() print(list_name)
3)指定sheet表
import xlrd #打开文件 wb = xlrd.open_workbook("test.xls") #按名称指定 sheet1 = wb.sheet_by_name('test') print(sheet1) #按索引指定,索引是从0开始计算 sheet2 = wb.sheet_by_index(0) print(sheet2)
4)sheet表的行操作
参数列表:行数rowx从0开始算起,不包含结束列end_colx,默认值None
方法 说明
Sheet.nrows 获取该sheet中的有效行数
Sheet.row(rowx) 获取sheet中的第rowx行数据 行数rowx从0开始算起
Sheet.row_slice( rowx=*, start_colx=0, end_colx=None) 获取sheet中rowx行指定列(开始列start_colx,结束列end_colx前)的数据(包含了数据类型) 行数rowx从0开始算起,不包含结束列end_colx
Sheet.row_values(rowx=*, start_colx=0, end_colx=None) 获取sheet中rowx行指定列(开始列start_colx,结束列end_colx前)的数据(不包含数据类型) 行数rowx从0开始算起,不包含结束列end_colx
Sheet.row_len(rowx) 获取第rowx行的有效单元格长度
import xlrd # 打开文件 wb = xlrd.open_workbook("test.xls") # 通过sheet索引获得sheet对象 sheet = wb.sheet_by_index(0) print(sheet) # 获取该表总行数 nrows = sheet.nrows print("总行数是:", nrows) # 显示单行数据,索引从0开始计算 print(sheet.row(0)) # sheet.row(0) == sheet.row_slice(0) 效果相同 print(sheet.row_slice(0)) # 显示单行数据 索引从0开始计算 print(sheet.row_values(1)) # rowx第几行,start_colx从第几列开始,第几列结束 默认值end_colx=None print(sheet.row_values(rowx=2, start_colx=0, end_colx=1)) # 行的有效长度 print("行的有效长度:", sheet.row_len(0)) # 循环打印里面所有数据 for i in range(nrows): print(sheet.row_values(i))
5)sheet表的列操作
参数列表 列数colx从0开始算起,不包含结束行end_rowx,默认值None
方法 说明
Sheet.ncols 获取某sheet中的有效列数
Sheet.col()或Sheet.col_slice(colx, start_rowx=0, end_rowx=None) 获取sheet中第colx列从start_rowx行到end_rowx行的数据(包含了数据类型)
Sheet.col_values(self, colx, start_rowx=0, end_rowx=None) 获取sheet中第colx列从start_rowx行到end_rowx行的数据(不包含数据类型)
import xlrd # 打开文件 wb = xlrd.open_workbook("test.xls") # 通过sheet索引获得sheet对象 sheet = wb.sheet_by_index(0) print(sheet) # 获取该表总列数 ncols = sheet.ncols print("总列数是:", ncols) # 显示单列数据,索引从0开始计算 print(sheet.col(0)) # sheet.col(0) == sheet.col_slice(0) 效果相同 # 带列名 print(sheet.col_slice(0)) print("=" * 40) # 不带列名 print(sheet.col_slice(0, 1)) print("=" * 40) # 循环打印里面所有数据 for i in range(ncols): print(sheet.col_values(i))
三、xlwt写入Excel表
xlwt写入Excel表数据,支持.xls和.xlsx
1、安装xlwt包
pip install xlwt
2、写入单条数据
import xlwt # 创建Excel对象 并指定编码格式 ws = xlwt.Workbook(encoding='utf-8') # 创建sheet表 sheet = ws.add_sheet('sheet1') # 第一个参数是行 # 第二个参数是列 # 第三个参数需要写入的内容 sheet.write(0, 0, 'python') # 保存数据名字和格式 ws.save('test1.xls') # 保存正常,但是打开报错,后续在解决 ws.save('test2.xlsx')
3、多条数据写入
import xlwt # 定义写入数据 data_list = [("张三", 35, '男'), ('李四', 32, '男'), ('凤姐', 33, '女'), ('小明', 12, '男')] # 创建Excel对象 并指定编码格式 ws = xlwt.Workbook(encoding='utf-8') # 创建sheet表 sheet = ws.add_sheet('sheet1') # 自定义列名表头 col_name = ('姓名', '年龄', '性别') # 循环写入sheet表单第一行 for i in range(0, len(col_name)): sheet.write(0, i, col_name[i]) # 循环写入数据 for i in range(0, len(data_list)): data = data_list[i] for j in range(0, len(col_name)): sheet.write(i + 1, j, data[j]) ws.save('test1.xls')
结果:
4、设置宽度和高度
sheet.col(“行索引”).width = 256 * 24
sheets.row(“行索引”).height_mismatch = True 默认行高是和文字的高度进行匹配的,即 值是 False,我们设置行高不会生效
sheets.row(“行索引”).height = 20*20 # 其中一个20代表单位,想要行高是多少乘以多少就行了。
import xlwt # 定义写入数据 data_list = [("张三", 35, '男'), ('李四', 32, '男'), ('凤姐', 33, '女'), ('小明', 12, '男')] # 创建Excel对象 并指定编码格式 ws = xlwt.Workbook(encoding='utf-8') # 创建sheet表 sheet = ws.add_sheet('sheet1') # 自定义列名表头 col_name = ('姓名', '年龄', '性别') # 循环写入sheet表单第一行 for i in range(0, len(col_name)): # 设置宽度 sheet.col(i).width = 256 * 24 # 设置高度 sheet.row(i).height_mismatch = True sheet.row(i).height = 20*20 sheet.write(0, i, col_name[i]) # 循环写入数据 for i in range(0, len(data_list)): data = data_list[i] for j in range(0, len(col_name)): sheet.write(i + 1, j, data[j]) # 设置高度 sheet.row(i+1).height_mismatch = True sheet.row(i+1).height = 20*20 ws.save('test1.xls')
5、自定义单元格样式
参数说明:
参数 说明
xlwt.Font() 字体设置
xlwt.Patter() 背景设置
xlwt.Borders() 边框设置
xlwt.Alignment() 对准设置
import xlwt
# 定义写入数据 data_list = [("张三", 35, '男'), ('李四', 32, '男'), ('凤姐', 33, '女'), ('小明', 12, '男')] # 创建Excel对象 并指定编码格式 ws = xlwt.Workbook(encoding='utf-8') # 创建sheet表 sheet = ws.add_sheet('sheet1') # 实例化表格样式对象 xstyle = xlwt.XFStyle() # 设置字体样式 xfont = xlwt.Font() xfont.colour_index = 0x04 # 设置字体颜色 xfont.bold = True # 字体加粗 xfont.height = 20 * 18 # 设置字体高度(20是基数不变,18是字号用于调整大小) xfont.underline = 0x01 # 设置字体带下划线 xfont.name = '华文彩云' # 设置字体 # 将字体对象赋值给样式对象 xstyle.font = xfont # 自定义列名表头 col_name = ('姓名', '年龄', '性别') # 循环写入sheet表单第一行 for i in range(0, len(col_name)): # 设置宽度 sheet.col(i).width = 256 * 24 # 设置高度 sheet.row(i).height_mismatch = True sheet.row(i).height = 20 * 20 sheet.write(0, i, col_name[i], style=xstyle) # 循环写入数据 for i in range(0, len(data_list)): data = data_list[i] for j in range(0, len(col_name)): sheet.write(i + 1, j, data[j], style=xstyle) # 设置高度 sheet.row(i + 1).height_mismatch = True sheet.row(i + 1).height = 20 * 20 ws.save('test1.xls')