python操作excel的库

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 文件中的多个工作表。它可以用于将文本、数字和公式写入多个工作表,并支持格式、图像、图表、页面设置、自动筛选、条件格式和许多其他功能

python操作excel的库_第1张图片

一般的组合使用Pandas和openpyxl库是相互互补的。Pandas绝对是Python中处理Excel最快、最好用的库,但是使用 openpyxl 的一些优势是能够轻松地使用样式、条件格式等自定义电子表格

openpyxl库

工作簿、工作表、单元格之间的关系:

  • 一个工作簿(workbook)由多个工作表(worksheet)组成;

  • 一个工作表有多个单元格(cell)组成;

  • 通过行(row)和列(column)可以定位到单元格。

    workbook为工作薄对象(wb),worksheet为工作表对象(ws),cell为单元格对象(cell)

1、操作工作簿

  • 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()

2、获取工作表名

  • 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)

3、从表格中获取单元格

  • 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)  # 单元格行号

4、工作表对象操作

  • 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))

5、工作表写入

  • 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()

6、图片操作

  • 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)

7、单元格对象

  • 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库

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的一下方法,比如索引和切片

读取excel

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())#直接获取一个完整的表格数据分析,更快一点

写入excel

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。

    它也是一个可选参数, 用于指定要冻结的最底部一行和最右边一列。

你可能感兴趣的:(python,python)