python在操作excel的时候,用到很多库,常用的有xlwings、xlrd、xlwt、xlutils、xlsxwriter、openpyxl、pandas。这几个库都是第三方库,需要install和import才能使用
xlrd和xlwt是早期支持操作excel的库,目前最新版本都只支持xls格式,不支持xlsx格式文件。xlrd负责读取excel文件,xlwt负责对excel进行写的操作。xlwt 和 xlrd 不光名字像,连很多函数和操作格式也是完全相同。xlrd和xlwt不支持xlxs的原因:XLSX 是 Microsoft Office 2007 之后的 Excel 文件格式,它采用了基于 XML 的文件结构。与之前的 XLS 格式相比,XLSX 格式有更好的扩展性和兼容性。然而,xlrd 库是基于旧的二进制 XLS 文件格式开发的,因此无法直接读取 XLSX 文件。
xlutils(excel utilities)是一个提供了许多操作修改 excel 文件方法的库。xlutils 库也仅仅是通过复制一个副本进行操作后保存一个新文件,xlutils 库就像是 xlrd 库和 xlwt 库之间的一座桥梁,因此,xlutils 库是依赖于 xlrd 和 xlwt 两个库的。简单来说,xlrd
负责读、xlwt
负责写、xlutils
负责提供辅助和衔接
xlwings 能够非常方便的读写 Excel 文件中的数据,并且能够进行单元格格式的修改
openpyxl通过 工作簿 “workbook - 工作表 sheet - 单元格 cell” 的模式对 .xlsx
文件进行读、写、改,并且可以调整样式。它是由于缺乏从 Python 中读取 / 编写 Office Open XML 格式的现有库而诞生的。
pandas 是基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具
xlsxwriter是用于创建 Excel XLSX 文件的 Python 模块,可用于将文本、数字、公式和超链接写入 Excel2007 + XLSX 文件中的多个工作表。它可以用于将文本、数字和公式写入多个工作表,并支持格式、图像、图表、页面设置、自动筛选、条件格式和许多其他功能
一般的组合使用Pandas和openpyxl库是相互互补的。Pandas绝对是Python中处理Excel最快、最好用的库,但是使用 openpyxl 的一些优势是能够轻松地使用样式、条件格式等自定义电子表格
工作簿、工作表、单元格之间的关系:
一个工作簿(workbook)由多个工作表(worksheet)组成;
一个工作表有多个单元格(cell)组成;
通过行(row)和列(column)可以定位到单元格。
workbook为工作薄对象(wb),worksheet为工作表对象(ws),cell为单元格对象(cell)
workbook():新建excel文件,新建文件时默认有一个名为Sheet工作表
load_workbook(path):加载指定路径的excel文件
wb.save() : 保存工作簿
wb.close() : 关闭工作簿
# 新建一个工作簿,也是实例化workbook这个类 wb_new=openpyxl.Workbook() # 加载一个工作簿 path="C:/Users/Desktop/数据接入_defaulbm_HttpLog_20230831104123.xlsx" wb=openpyxl.load_workbook(path) # 保存工作簿到指定文件中,若文件不存在会新建,若文件存在会覆盖。 wb.save("openpyxl_test.xlsx") # 关闭工作簿,编辑保存完文件后及时关闭文件,以免文件被误修改或被占用,一般save()和close()一起使用。 wb.close()
wb.active :获取第一张工作表对象
wb[sheet_name] :获取指定名称的工作表对象
wb.sheetnames :获取所有工作表名 称
wb.worksheets:获取所有工作表对象,wb.worksheets[0]可以根据索引获取工作表,0代表第一个
wb.title :获取sheet的名称
# 加载一个工作簿 path = "C:/Users/Desktop/数据接入_defaulbm_HttpLog_20230831104123.xlsx" wb = openpyxl.load_workbook(path) active_sheet = wb.active # 获取excel当前工作表 get_sheet_byname = wb["Sheet1"] # 根据工作表名称获取工作表 get_all_sheet_name = wb.sheetnames # 获取所有的工作表名称 get_sheet_byindex = wb.worksheets[0] # 根据工作表索引获取工作表 print(get_sheet_byindex.title)
ws.["行号,列号"]:通过索引的方式获取单元格
ws.cell():通过row和colum获取单元格对象,并设置单元格的值。cell(row, column, value=None)
ws.rows:获取所有数据以行的格式组成的可迭代对象
ws.columns:获取所有数据以列的格式组成的可迭代对象
ws.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None):获取指定边界范围并以行的格式组成的可迭代对象,默认所有行
ws.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None):获取指定边界范围并以列的格式组成的可迭代对象,默认所有列
ws.values:获取所有单元格数据值的可迭代对象,可以通过for循环迭代或通过list(ws.values)转换为数据列表。
给单元格赋值的三种方式:1.根据row和column获取单元格对象,再设置单元格的值。设置时需要用特定的参数变量value;2.在获取单元格对象时直接赋值;3、先通过坐标获取单元格对象,在设置单元格的值
cell.row:单元格的行号
cell.column:单元格的列表
cell.coordinae :单元格的坐标
# 通过索引的方式获取单元格 a = ws['A1'] # 获取第一行第一列的数据,单引号和双引号都可以通过 c = ws["A1:d2"] #获取A1到D2范围内的单元格对象 b = ws['1'] # 获取第一行的全部数据 e = ws["A"] # 获取第一列的全部数据 f = ws['A:B'] # 获取第一列到第三列全部数据 g = ws["1:3"] # 获取第一行到第三行全部数据 ws.cell(9, 1, "tets122") # 通过row和colum获取单元格,并设置单元格的值。cell(row, column, value=None) print("-" * 30) for i in ws.rows: # 获取所有数据以行的格式组成的可迭代对象 print(i) print("-" * 30) for i in ws.columns: # 获取所有数据以列的格式组成的可迭代对象 print(i) print("-" * 30) for row in ws.iter_rows(min_row=1, max_row=2, min_col=1, max_col=2): # 获取指定边界范围并以列的格式组成的可迭代对象,以列的方式返回 print(row) print("-" * 30) for column in ws.iter_cols(min_row=1, max_row=2, min_col=1, max_col=2): # 获取指定边界范围并以列的格式组成的可迭代对象,以列的方式返回 print(column) print("-" * 30) for i in ws.values: # 获取所有单元格数据的可迭代对象,可以通过for循环迭代或通过list(ws.values)转换为数据列表 print(i) print(list(ws.values)) print("-" * 30) # 获取单元格并给单元格赋值方式有三种:1.根据row和column获取单元格对象,再设置单元格的值。设置时需要用特定的参数变量value;2.在获取单元格对象时直接赋值;3、先通过坐标获取单元格对象,在设置单元格的值 cell = ws.cell(1, 1) cell.value = "100" cell = ws.cell(8, 3, value=1000) cell1 = ws.cell(3, 3, 1000) ws["D4"] = 10000 print(cell.coordinate) # 单元格坐标 print(cell.column) # 单元格数据的列号 print(cell.row) # 单元格行号
ws.sheet_properties.tabColor:设置sheet的样式
ws.max_row:获取sheet的最大行数
ws.max_column:获取sheet的最大列数
ws.merge_cells():合并指定单元格。合并的单元格不能冲突,否则导致文件损坏.使用"或者'都可以
ws.unmerge_cells():取消合并指定单元格
# ------------------------------工作表对象------------------------- path = "C:/Users/Desktop/数据接入_defaulbm_HttpLog_20230831104123.xlsx" wb = openpyxl.load_workbook(path) ws = wb.worksheets[0] # 遍历获取工作表名 for sheet in wb: print(sheet.title) ws.title = "alter_sheet_name" # 修改工作表名称 ws.sheet_properties.tabColor = "1072BA" # 设置sheet的样式。默认情况下,包含该标题的选项卡的背景颜色为白色。你也可以使用RRGGBB颜色来改变属性 print(ws.max_row) # 获取sheet的最大行数 print(ws.max_column) # 获取sheet的最大列数 ws.merge_cells('A2:D3') # 合并指定单元格。合并的单元格不能冲突,否则导致文件损坏.使用"或者'都可以 ws.unmerge_cells('A2:D3') # 取消合并指定单元格 ws.merge_cells(start_row=4, end_row=4, start_column=1, end_column=4) # 合并指定单元格。 ws.unmerge_cells(start_row=4, end_row=4, start_column=1, end_column=4) # 取消合并指定单元格 print(ws.merged_cells) # 获取sheet中所有的合并的单元格 # 遍历取消合并单元格 a = ws.merged_cells.ranges[:] for i in a: print(str(i)) ws.unmerge_cells(str(i))
wb.create_sheet(sheet_name,index=“end”):创建并返回一个工作表对象,默认位置最后,0代表第一个
wb.copy_worksheet(sheet):在当前工作簿复制指定的工作表并返回复制后的工作表对象
wb.remove(sheet):删除指定的工作表
ws.append():在文件行尾增加数据.追加的数据为list,只能追加一行数据
ws.insert_rows(row_index,amount=1):在第row_index行上方插入amount列,默认插入1列
ws.insert_cols(col_index,amount=1):在第col_index列左侧插入amount列,默认插入1列
ws.delete_rows(row_index,amount=1):从row_index行开始向下删除amount行,默认删除1行
ws.delete_cols(col_index,amount=1):从col_index列开始向右删除amount行,默认删除1列
# 加载一个工作簿 path="C:/Users/Desktop/数据接入_defaulbm_HttpLog_20230831104123.xlsx" wb=openpyxl.load_workbook(path) create_sheet = wb.create_sheet("Sheet_test",1) # 创建指定名称和位置的工作表,create_sheet(sheet_title,index)。 copy_sheet_value = wb.copy_worksheet(wb.worksheets[0]) # 在当前工作簿复制指定的工作表并返回复制后的工作表对象。入参为指定工作表,而不是工作表名称 copy_sheet_value.title = "copy" #修改工作表的名称 copy_sheet_name=wb[copy_sheet_value.title] wb.remove(copy_sheet) # 删除指定的工作表,入参为工作表,而不是工作表名称 wb.remove(create_sheet) # 删除指定的工作表 #在行尾追加数据 ws.append(["a", "b", "c"]) # 在文件行尾增加数据.追加的数据为list,只能追加一行数据 #删除行或者列 ws.insert_rows(1,2) # 在第一行前插入两行 delete_col_index = [1,3] # 删除1、3两列 """为避免删除多列时前面列对后面列产生影响,采取从后面列往前面列删的策略,行同理""" delete_col_index.sort(reverse=True) # 从大到小排序 for col_index in delete_col_index: ws.delete_cols(col_index) wb.save(path) wb.close()
ws.add_img(img,“坐标”):添加图片到指定单元格位置
img.height,img.width设置图片的大小
ws._images:获取当前工作表的图片列表
from openpyxl import Workbook from openpyxl.drawing.image import Image wb = Workbook() ws = wb.active img = Image("C:\\Users\\Desktop\\0880c08b011088bc8728.jpg") # 加载图片对象 img.height, img.width = 140, 140 # 设置图片大小 ws.row_dimensions[1].height = 140 # 设置第一行高度为140 ws.add_image(img, 'A1') # 将图片插入到表格的固定位置 data = ws._images[0]._data() # 工作表第一个图片对象 with open("image.png", "wb") as img: # 将图片写入到image.png img.write(data)
cell.data_type : 获取或设置单元格数据类型, ’s‘ = string字符串,‘n’ = number数值,会根据单元格值自动判断类型。所以需要在单元格赋值后再设置单元格数据类型。如果单元格不能转换成设置的格式就会报错,导致文件损坏。
cell.number_format :获取或设置单元格数字的显示格式,默认”General“常规,详见excel自定义数据类型
cell.hyperlink:获取或设置单元格超链接(可以是网址或者本地文件路径)
cell.font :获取或设置单元格字体样式
cell.border : 获取或设置单元格边框
cell.alignment : 获取或设置单元格水平、垂直对齐方式、自动换行等
cell.fill:获取或设置单元格填充颜色
from openpyxl import * from openpyxl.styles import Font, Border, Alignment, PatternFill, Side from copy import copy path = "C:/Users/Desktop/test.xlsx" wb = load_workbook(path) ws = wb.active # 查看和修改单元格的数据格式 cell2 = ws.cell(1, 1, 100) print(cell2.data_type) cell2.data_type = "n" # 获取或设置单元格内数字的显示格式 cell2.number_format = '@' print(cell2.number_format) # 获取或设置单元格超链接 cell1 = ws.cell(2, 1, "www.baidu.com") cell1.hyperlink = "https://www.baidu.com" print(cell1.hyperlink) print(cell1.hyperlink.target, cell1.hyperlink.tooltip) print("---" * 10) # 获取或设置单元格字体样式 cell1.font = Font(color="0000FF", underline='single') print(cell1.font) cell = ws['A3'] """设置单元格文字样式""" cell.font = Font(bold=True, # 加粗 italic=True, # 倾斜 name="楷体", # 字体 size=13, # 文字大小 color="FF0000", # 字体颜色为红色 underline='single' # 下划线 ) """复制单元格样式""" cell2 = ws.cell(1, 2, "学号") cell2.font = copy(cell.font) """设置单元格边框为黑色边框""" cell.border = Border(bottom=Side(style='thin', color='000000'), right=Side(style='thin', color='000000'), left=Side(style='thin', color='000000'), top=Side(style='thin', color='000000')) """设置单元格对齐方式为水平居中和垂直居中,单元格内容超出范围自动换行""" cell.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) """设置单元格底纹颜色为黄色""" cell.fill = PatternFill(fill_type='solid', start_color='FFFF00') """ 白色:FFFFFF,黑色:000000,红色:FF0000,黄色:FFFF00 绿色:00FF00,蓝色:0000FF,橙色:FF9900,灰色:C0C0C0 常见颜色代码表:https://www.osgeo.cn/openpyxl/styles.html#indexed-colours """ wb.save(path) wb.close()
ws.row_dimensions[行号]:获取行对象(非行数据,包括行的相关属性、行高等)
ws.column_dimensions[字母列标]:获取列对象(非行数据,包括行的相关属性、列宽等)
get_column_letter(index):根据列的索引返回字母
column_index_from_string(string):根据字母返回列的索引
row.height:获取或设置行高
column.width:获取或设置列宽
from openpyxl import Workbook from openpyxl.utils import get_column_letter, column_index_from_string wb = Workbook() ws = wb.active row = ws.row_dimensions[1] # 获取第一行行对象 print("行高", row.height) # 默认的行高为None row.height = 20 # 设置行高 print("行高", row.height) print("行号", row.index) column = ws.column_dimensions["A"] # 根据字母列标获取第一列列对象 column.width = 15 # 设置列宽 print("列宽", column.width) column = ws.column_dimensions[get_column_letter(1)] # 根据数字列标获取第一列列对象 print("字母列标",column.index) print("数字列标",column_index_from_string(column.index)) wb.save(path) wb.close()
pandas库是Python中的一个强大的数据处理库,它提供了高效的数据分析方法和数据结构。相比于其他的数据处理库,pandas更适用于处理具有关系型数据或者带标签数据的情况,在时间序列分析方面也有着不错的表现。
pandas库中最常用的数据类型是Series和DataFrame。Series一种增强的一维数组,类似于列表,由索引(index)和值(values)组成。DataFrame是一个类似表格的二维数据结构,索引包括列索引和行索引,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame的每一行和每一列都是一个Series。
dataframe的属性
print(data.values)#获取全部数据,返回类型是一个二维数组
print(data.index) #获取行标签
print(data.columns) #获取列表标签,返回类型是一个
print(data.shape) #获取
print(data.size) #获取列表标签
datarame可以继承list和dic的一下方法,比如索引和切片
pandas读取文件之后,将内容存储为DataFrame,然后就可以调用内置的各种函数进行分析处理。读取excel用的是read_excel()函数,常用参数如下:
pd.read_excel(io, sheetname=0,header=0,skiprows=None,index_col=None,names=None, arse_cols=None,date_parser=None,na_values=None,thousands=None, convert_float=True,has_index_names=None,converters=None,dtype=None, true_values=None,false_values=None,engine=None,squeeze=False,**kwds)
io,#路径对象或类似文件的对象
sheet_name=0,#指定选择的excel表格名字,默认为sheet_name=0,读取第一个表。也可以指定sheet_name,sheet_name="python_test"
header=0,#指定标题行。默认是header=0,取第一行为表头,表头以上数据都会丢弃掉。header=None,表示取消header读取,默认选取从0开始的一串数字来作为标题行
names=None,#自己设置表头,会替换掉原有的表头,将原有表头数据丢弃,不想丢弃表格数据header=None。names的值需要是list,names=["a","b","c","d","e","f"]
index_col=None,#指定列索引。默认为None,表示不指定列索引。指定列索引后,指定数据会被作为索引。
usecols=None,#指定要选择读取数据的列号,如果是None,表示读取所有列。可以设置为list,usecols=[0,2,4,6,8]
dtype=None,#指定数据类型。dtype={'age': float}
skiprows=None,#跳过指定行的数据
encoding:文件编码方式,不设置此选项, Pandas 默认使用 UTF-8 来解码。
read_excel()对象的是dataframe,一些处理手段如下:
print(data.values)#获取全部数据,返回类型是一个二维数组
print(data.index) #获取行标签
print(data.columns) #获取列表标签,返回类型是一个
print(data.shape) #获取
print(data.size) #获取列表标签
print(data.index.values)#获取行索引,返回对象是一个list
print(data.columns.values)#获取列索引,返回对象是一个list
print(data.ilco[i,j]) #获取第i行第j列的数据
print(data.values[i,j])#获取第i行第j列的数据
print(data.values[i])#获取第i行的数据
print(data.values[[i,j,k]])#获取第i,j,k行数据
print(data.values[:,i])#获取第i列的数据
print(data.values[:,[i,j,k]])#获取第i,j,k列的数据
print(data.shape)#获取整体数据的行数和列
print(data.head(4))#只获取前四行数据
print(data.tail(4))#只获取最后四行数据
print(data.info())#直接获取一个完整的表格数据分析,更快一点
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None,header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True,encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)
excel_writer:文件路径或现有的ExcelWriter。
sheet_name:它是指包含DataFrame的工作表的名称。
na_repr:缺少数据表示形式。
float_format:这是一个可选参数, 用于格式化浮点数字符串。
columns:指要写入的列。
header:写出列名。如果给出了字符串列表, 则假定它是列名的别名。
index:写入索引。
index_label:引用索引列的列标签。如果未指定, 并且标头和索引为True, 则使用索引名称。如果DataFrame使用MultiIndex, 则应给出一个序列。
startrow:默认值0。它指向转储DataFrame的左上单元格行。
startcol:默认值0。它指向转储DataFrame的左上方单元格列。
engine:这是一个可选参数, 用于写入要使用的引擎, openpyxl或xlsxwriter。
merge_cells:返回布尔值, 其默认值为True。它将MultiIndex和Hierarchical行写为合并的单元格。
encoding:这是一个可选参数, 可对生成的excel文件进行编码。仅对于xlwt是必需的。
inf_rep:它也是一个可选参数, 默认值为inf。它通常表示无穷大。
verbose:返回一个布尔值。它的默认值为True。 它用于在错误日志中显示更多信息。
freeze_panes : 整数的元组(长度2),默认为None。
它也是一个可选参数, 用于指定要冻结的最底部一行和最右边一列。