python操作Excel
in Python with 4 comments
Read:1119

python操作Excel

in Python with 4 comments

python对excel的操作,需要引用的常用模块

xlrd:是一个从Excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件。
xlwt:是一个用于将数据和格式化信息写入旧Excel文件的库(如.xls)。
xlwings:是一个可以实现从Excel调用Python,也可在python中调用Excel的库。
openpyxl:是一个用于读取和编写Excel xlsx/xlsm/xltx/xltm文件的库。
xlsxwriter:是一个用于创建Excel .xlsx文件的库。
win32com:库存在于pywin32中,是一个读写和处理Excel文件的库。

puthon操作excel的思维:
有三个概念:Workbooks,Sheets,Cells。Workbook就是一个打开的excel文件,即excel工作簿;Sheet是工作簿中的一张表,即工作表;Cell就是一个简单的单元格。

每个方法都试试

xlrd实现对Excel的读取

导入模块

import xlrd as xl

打开excel文件

data=xl.open_workbook("D:\excel\ex.xlsx")#打开excel文件

获取excel里面的工作表

table=data.sheet_by_name('Sheet1')#通过excel里面的表名获取工作表
table=data.sheet_by_index(0)#通过excel里面的索引获取工作表
table=data.sheets()[0]#通过excel里面的索引获取工作表

table=data.sheet_names()#获取excel的全部表名,返回列表
table=data.sheet_names()[0]#通过索引获得表名,返回字符串,不是返回工作表

检查工作表是否导入成功

istrue=data.sheet_loaded(sheet_name or indx)   # 检查某个sheet是否导入完毕,输入表名或者索引

读取行的数据

row=table.row_values(0)#根据索引读取一行的数据,参数:行索引,开始列索引,结束列索引(不包含)
row=table.row_values(0,2)#读取第一行,从第三列开始以后的全部数据
row=table.row_values(0,2,4)#读取第一行,从第3列开始到第4列的数据(索引为4,因该是第5列,但不包含第五列)

读取列的数据具体同row_values()一样的操作

col=table.col_values(0)#根据索引获取列的值

获取行和列的数量

nrow=table.nrows#行数量
ncol=table.ncols#列数量

获取单元格数据
可以通过row_values(index,start_col,end_col)row_values(index,start_col,end_col)获取

cell_A1 = table.cell(0,0).value#通过行列索引获得单元格数据,A1
cell_D3 = table.cell(2,3).value#在excel中第3行的行号是3,第四列的列号是D,所以单元格为D3

cell_A2 = table.row(1)[0].value#通过行的索引获得单元格数据,第二行第一个数据就是A2
cell_B4 = table.col(1)[3].value#第2列第4个单元格数据,B4

获取excel单元格里面的时间
excel里面的时间格式xrld获取到为浮点数

date_value = xl.xldate_as_tuple(cell_A1,0)#获得一个时间的元组,自己转换成各种时间类型

xlrd读取的excel数据,如果合并了单元格,值在大单元格所对应的第一个小单元格,其他剩下的小单元格为空

xlwt写入数据到excel表

这个玩意只能创建.xls文件,不能创建.xlsx

导入模块

import xlwt as wt

写入数据的流程

workbook=wt.Workbook(encoding = 'utf-8')#创建工作簿,并设置编码
sheet=workbook.add_sheet('SheetX')#在工作簿里面添加一个工作表
sheet.write(0,0,"A1")#写入数据,参数:行索引,列索引,值
workbook.save("D:\excel\wt.xls")#保存文件在相应目录

在保存文件之前,可以设置表格样式

style=wt.XFStyle()#设置初始样式
#可以设置6个样式类,font,border,alignment,pattern,protection,num_format_str
#1.字体样式
font = wt.Font()#为样式创建字体
font.name = '宋体'
font.height = 0x00C8  #默认高度
font.bold = True # 粗体
font.underline = True # 下划线
font.italic = False #斜体
style.font = font#设定样式
#2.边框
#DASHED虚线,NO_LINE没有,THIN实线
borders = wt.Borders()
borders.right = borders.THIN #有多种类型可选,也可以直接写数字代替
borders.top = borders.THIN
borders.bottom = borders.THIN
borders.left_colour='fffff'#设置边框颜色
style.borders = borders
# 3.alignment设置
alignment = wt.Alignment()
alignment.vert = alignment.VERT_CENTER  # 垂直居中
alignment.horz = alignment.HORZ_CENTER  # 水平居中
alignment.wrap = alignment.WRAP_AT_RIGHT  # 自动换行
style.alignment = alignment
#4.背景色pattern
pattern = wt.Pattern()
pattern.pattern = pattern.SOLID_PATTERN
# 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue,
# 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue,
# 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal,
# 22 = Light Gray, 23 = Dark Gray, the list goes on...
pattern.pattern_fore_colour = 5
pattern.pattern_back_colour = 4
style.pattern = pattern
#5.num_format_str 设置显示的样式
style.num_format_str = "MMM-YY" #设置时间的样式,显示为月份的缩写加上年份的最后两位
# 可以是:D-MMM-YY, D-MMM, MMM-YY, h:mm, h:mm:ss, h:mm, h:mm:ss, M/D/YY h:mm, mm:ss, [h]:mm:ss, mm:ss.0

关于写入工作表

sheet.col(0).width = 1000# 设置第一列单元格宽度
sheet.write(1, 1, wt.Formula('SUM(A1,B1)'))#向这个单元格添加一个excel的公式
sheet.write(0,2, wt.Formula('HYPERLINK("http://www.google.com";"Google")'))#向这个单元格添加一个超链接
sheet.write(0,0,"A1",style)#写入数据,参数:行索引,列索引,值,样式。如果有样式加样式,没有就不用加

最后用workbook.save()保存到本地

openpyxl对excel表的读取

导入模块

from openpyxl import load_workbook

打开excel文件

wb=load_workbook("D:\excel\ex.xlsx")#打开excel表

获取工作表--Sheet

#两个sheetname都是获取全部表名,推荐第二种
sheetname=wb.get_sheet_names()
sheetname=wb.sheetnames

#两个sheet都是根据名字获得工作表,推荐第二种
sheet = wb.get_sheet_by_name('Sheet1')
sheet=wb["Sheet1"]

#两个activesheet都是获取excel正在value显示的表,推荐第二种
activesheet=wb.get_active_sheet()
activesheet = wb.active

获取单元格

# 获取某个单元格的值,观察excel发现也是先字母再数字的顺序,即先列再行
b4 = sheet['B4'].value

# 除了用excel编号的方式获得,还可以用cell函数, 换成数字,这个表示B4
b4_too = sheet.cell(row=4, column=2)

value=b4_too.value#获取这个单元格的值
coordinate=b4_too.coordinate#获得这个单元格的坐标B4
column=b4_too.column#获取这个单元格的列编号,第几列
row=b4_too.row#获取这个单元格的行编号,第几行

在openpyxl中为了和Excel中的表达方式一致,并不和编程语言的习惯以0表示第一个值。第一个数的索引为1

获取全部行和列

max_row=sheet.max_row#最大行数
max_col=sheet.max_column#最大列数

rows=sheet.rows#获取表里面的全部行的数据
cols=sheet.columns#获取全部列的数据
#循环遍历出每一个单元格的值,因为按行,所以返回A1, B1, C1这样的顺序
for row in rows:
    for cell in row:
        print(cell.value)
# cols同理,按A1, A2, A3这样的顺序

上面的代码就可以获得所有单元格的数据。如果要获得某行的数据呢?给其一个索引就行了,因为sheet.rows是生成器类型,不能使用索引,转换成list之后再使用索引,list(sheet.rows)[2]这样就获取到第三行的tuple对象。

获取区间单元格的数据

#通过行列索引
for i in range(1,4):
    for t in range(1,3):
        print(sheet.cell(row=i, column=t))
#通过切片方式
for row_cell in sheet['A1':'B3']:
    for cell in row_cell:
        print(cell)

根据字母获得列号,根据列号返回字母
需要导入, 这两个函数存在于openpyxl.utils

from openpyxl.utils import get_column_letter, column_index_from_string

# 根据列的数字返回字母
print(get_column_letter(2))  # B
# 根据字母返回列的数字
print(column_index_from_string('D'))  # 4

修改表名和移除表

sheet.title="XX"#修改表名
wb.remove(sheet)#删除表
del wb[sheet]#删除表

openpyxl对excel表的写入

写入需要导入的模块

from openpyxl import Workbook

创建excel文件

wb = Workbook()#这样就新建了一个新的excel文件(只是还没被保存)会建立一个默认的表Sheet
# 新建一个工作表,可以指定索引,适当安排其在工作簿中的位置,0为第一个位置
wb.create_sheet('SheetX', index=1)
sheet=wb["SheetX"]#获取SheetX表

写入单元格

sheet['A1'] = 'good'# 直接给单元格赋值就行
sheet['B9'] = '=AVERAGE(B2:B8)'# 可以写公式,B9处写入平均值

但是如果是读取的时候需要加上data_only=True这样读到B9返回的就是数字,如果不加这个参数,返回的将是公式本身'=AVERAGE(B2:B8)'

一次添加一行或者多行数据
从第一行空白行开始(下面都是空白行)写入。

# 添加一行
row = [1 ,2, 3, 4, 5]
sheet.append(row)
# 添加多行
rows = [
    ['one', 'two', 'three'],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 10],
    [6, 25, 5],
    [7, 50, 10],
]
for row_i in rows:
    sheet.append(row_i)

设置单元格样式
先导入需要的类

from openpyxl.styles import Font, colors, Alignment
#设置字体样式
font = Font(name='等线', size=24, italic=True, color=colors.YELLOW, bold=True)
sheet['A1'].font = font#设置到相应的单元格
#设置对其方式
alignment = Alignment(horizontal='center', vertical='center')#垂直居中和水平居中
sheet['B1'].alignment = alignment
#设置单元格高度和宽度
# 第2行行高
sheet.row_dimensions[2].height = 40
# C列列宽
sheet.column_dimensions['C'].width = 30

合并单元格与拆分单元格

# 合并单元格, 往左上角写入数据即可
sheet.merge_cells('B1:G1') # 合并一行中的几个单元格
sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格
#拆分单元格,拆分后值回到A1位置
sheet.unmerge_cells('A1:C3')

所谓合并单元格,即以合并区域的左上角的那个单元格为基准,覆盖其他单元格使之称为一个大的单元格。相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。合并后只可以往左上角写入数据,也就是区间中:左边的坐标。如果这些要合并的单元格都有数据,只会保留左上角的数据,其他则丢弃。

保存文件

#最后什么都弄好了,保存文件到相应的位置
wb.save(r'D:\excel\ok.xlsx')

如果对你有帮助,打钱

赞赏



Responses
  1. python很是火热啊,爬去数据据说很厉害

    Reply
  2. 学习

    Reply
  3. python真是个好东西

    Reply
  4. 学到了,谢大佬

    Reply