python实现——处理Excel表格(超详细)

Posted lainwith

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现——处理Excel表格(超详细)相关的知识,希望对你有一定的参考价值。

  • 一个Excel电子表格文档称为一个工作簿
  • 一个工作簿保存在一个扩展名为.xlsx的文件中
  • 一个工作簿可以包含多个表
  • 用户当前查看的表(或关闭Excel前最后查看的表)称为活动表
  • 在特定行和列的方格称为单元格、格子

处理Excel表格需要用到openpyxl模块,该模块需要手动安装pip install openpyxl

xls和xlsx

简单来说:
xls是excel2003及以前版本所生成的文件格式
xlsx是excel2007及以后版本所生成的文件格式
(excel 2007之后版本可以打开上述两种格式,但是excel2013只能打开xls格式)
进一步的详细解释参见:excel后缀.xls和.xlsx有什么区别

基本操作

用到的test.xlsx表格
在这里插入图片描述

1:用openpyxl模块打开Excel文档,查看所有sheet表

openpyxl.load_workbook()函数接受文件名,返回一个workbook数据类型的值。这个workbook对象代表这个Excel文件,这个有点类似File对象代表一个打开的文本文件。

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')	# 返回一个workbook数据类型的值
print(workbook.sheetnames)	# 打印Excel表中的所有表


# 结果:
# ['Sheet1', 'Sheet2']

2.1:通过sheet名称获取表格

在第10行,使用workbook['Sheet1']获取指定sheet表

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
print(workbook.sheetnames)  # 打印Excel表中的所有表

sheet = workbook['Sheet1']  # 获取指定sheet表
print(sheet)

# 结果:
# ['Sheet1', 'Sheet2']
# <Worksheet "Sheet1">

2.2:获取活动表

使用workbook.active获取活动表

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active     # 获取活动表
print(sheet)

# 结果:
# <Worksheet "Sheet1">

3.1:获取表格的尺寸

这里所说的尺寸大小,指的是excel表格中的数据有几行几列,针对的是不同的sheet而言
使用sheet.dimensions获取表格的尺寸
下面打印的A1:B7是什么意思呢?

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook['Sheet1']  # 获取指定sheet表
print(sheet.dimensions)     # 获取表格的尺寸大小

# 结果:
# A1:B7

4.1:获取单元格中的数据

方法1:指定坐标的方式
sheet[“A1”]

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active     # 获取活动表
# print(sheet.dimensions)     # 获取表格的尺寸大小

cell1 = sheet['A1']         # 获取A1单元格的数据
cell2 = sheet['B7']         # 获取B7单元格的数据
# cell2 = sheet['B7'].value		# 另一种写法

# 正确示范
# cell1.value获取单元格A1中的值
# cell2.value获取单元格B7中的值
print(cell1.value,cell2.value)  # 姓名 18

# 错误示范
print(cell1,cell2)  # <Cell 'Sheet1'.A1> <Cell 'Sheet1'.B7>

方法2: 指定行列的方式
sheet.cell(row=, column=)方式

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active     # 获取活动表
# print(sheet.dimensions)     # 获取表格的尺寸大小

cell1 = sheet.cell(row=1,column=1)         # 获取第1行第1列的数据
cell2 = sheet.cell(row=3,column=2)         # 获取第3行第4的数据

# 正确示范
# cell1.value获取单元格A1中的值
# cell2.value获取单元格B7中的值
print(cell1.value,cell2.value)  # 姓名 41

4.2:获取单元格的行、列、坐标

  • .row 获取某个格子的行数;
  • .columns 获取某个格子的列数;
  • .coordinate 获取某个格子的坐标;
import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
# print(sheet.dimensions)     # 获取表格的尺寸大小

cell = sheet.cell(row=3, column=2)  # 获取第3行第4的数据

print(cell.value, cell.row, cell.column, cell.coordinate)

'''
结果:
41 3 2 B3
'''

5:获取区间内的数据

获取单行单列数据的时候,使用一层for循环;获取多行多列、指定区间的数据时,使用两层for循环

获取指定区间的数据

  1. 使用sheet['A1:A5']拿到指定区间
  2. 使用两个for循环拿到数据
import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:')
print(sheet)

cell = sheet['A1:A5']  # 获取A1到A5的数据

print(cell)

# 打印A1到A5的数据
for i in cell:
    for j in i:
        print(j.value)

# 结果:
# 当前活动表是:
# <Worksheet "Sheet1">
# ((<Cell 'Sheet1'.A1>,), (<Cell 'Sheet1'.A2>,), (<Cell 'Sheet1'.A3>,), (<Cell 'Sheet1'.A4>,), (<Cell 'Sheet1'.A5>,))
# 姓名
# 张三
# 李四
# 王五
# 赵六

获取指定行列的数据

  • sheet[“A”] — 获取A列的数据
  • sheet[“A:C”] — 获取A,B,C三列的数据
  • sheet[5] — 只获取第5行的数据

下面的代码,获取一列数据的时候,使用一层for循环

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

cell = sheet['2']  # 获取第2行的数据

# 打印A1到A5的数据
for i in cell:
    print(i.value)

# 结果:
# 当前活动表是:<Worksheet "Sheet1">
# 张三
# 74

下面代码,获取两列数据的时候,使用两层for循环。注意到,两列的结果打印到一起了,可读性较差

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

cell = sheet['A:B']  # 获取AB列的数据

# 打印AB列数据
for i in cell:
    for j in i:
        print(j.value)

# 结果:
# 当前活动表是:<Worksheet "Sheet1">
# 姓名
# 张三
# 李四
# 王五
# 赵六
# alice
# bob
# 年龄
# 74
# 41
# 56
# 12
# 17
# 18

按行、列获取值

iter_rows():按行读取
iter_cols():按列读取

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

# 按行获取值
print('按行获取值')
for i in sheet.iter_rows(min_row=2, max_row=5, min_col=1, max_col=2):
    for j in i:
        print(j.value)

# 按列获取值
print('按列获取值')
for i in sheet.iter_cols(min_row=2, max_row=5, min_col=1, max_col=2):
    for j in i:
        print(j.value)

# 结果:
# 当前活动表是:<Worksheet "Sheet1">
# 按行获取值
# 张三
# 74
# 李四
# 41
# 王五
# 56
# 赵六
# 12
# 按列获取值
# 张三
# 李四
# 王五
# 赵六
# 74
# 41
# 56
# 12

获取活动表的行列数

方法1:使用
sheet.max_row 获取行数
sheet.max_column 获取列数

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('2.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

rows = sheet.max_row        # 获取行数
column = sheet.max_column   # 获取列数

print(rows)
print(column)

'''
结果:
当前活动表是:<Worksheet "Sheet1">
381
6
'''

方法2:自己写一个for循环

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

row = []
column = []
# 获取当前活动表有多少行
for i in sheet.rows:
    row.append(list(i))         # i是元组类型,转为列表

# 获取当前活动表有多少列
for i in sheet.columns:
    column.append(list(i))    # i是元组类型,转为列表

print('行数:'+str(len(row)))
print('列数:'+str(len(column)))

'''
结果:
当前活动表是:<Worksheet "1号sheet">
行数:12
列数:3
'''

操作

创建新的excel

第9行代码用来指定创建的excel的活动表的名字:

  • 不写第9行,默认创建sheet
  • 写了第9行,创建指定名字的sheet表
import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = '1号sheet'
workbook.save('1.xlsx')

修改单元格、excel另存为

第9行代码,通过给单元格重新赋值,来修改单元格的值
第9行代码的另一种写法sheet['B1'].value = 'age'
第10行代码,保存时如果使用原来的(第7行)名字,就直接保存;如果使用了别的名字,就会另存为一个新文件

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
sheet['A1'] = 'name'
workbook.save('test.xlsx')

添加数据

插入有效数据

使用append()方法,在原来数据的后面,按行插入数据

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

data = [
    ['素子',23],
    ['巴特',24],
    ['塔奇克马',2]
]
for row in data:
    sheet.append(row)   # 使用append插入数据
workbook.save('test.xlsx')

插入空行空列

  • insert_rows(idx=数字编号, amount=要插入的行数),插入的行数是在idx行数的下方插入
  • insert_cols(idx=数字编号, amount=要插入的列数),插入的位置是在idx列数的左侧插入
import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

sheet.insert_rows(idx=3, amount=2)
sheet.insert_cols(idx=2, amount=1)
workbook.save('test.xlsx')

删除行、列

  • delete_rows(idx=数字编号, amount=要删除的行数)
  • delete_cols(idx=数字编号, amount=要删除的列数)
import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

sheet.delete_rows(idx=10)           # 删除第10行
sheet.delete_cols(idx=1, amount=2)  # 删除第1列,及往右共2列
workbook.save('test.xlsx')

移动指定区间的单元格(move_range)

move_range(“数据区域”,rows=,cols=):正整数为向下或向右、负整数为向左或向上

import os
import openpyxl

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

sheet.move_range('D11:F12',rows=0,cols=-3)  # 移动D11到F12构成的矩形格子
workbook.save('test.xlsx')

字母列号与数字列号之间的转换

核心代码

from openpyxl.utils import get_column_letter, column_index_from_string

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

举个例子:

import os
import openpyxl
from openpyxl.utils import get_column_letter, column_index_from_string

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('2.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:' + str(sheet))

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

字体样式

查看字体样式

import os
import openpyxl
import openpyxl.styles

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print('当前活动表是:'+str(sheet))

cell = sheet['A1']
font = cell.font
print('当前单元格的字体样式是')
print(font.name, font.size, font.bold, font.italic, font.color)

'''
当前活动表是:<Worksheet "1号sheet">
当前单元格的字体样式是
等线 11.0 False False <openpyxl.styles.colors.Color object>
Parameters:
rgb=None, indexed=None, auto=None, theme=1, tint=0.0, type='theme'
'''

修改字体样式

openpyxl.styles.Font(name=字体名称,size=字体大小,bold=是否加粗,italic=是否斜体,color=字体颜色)
其中,字体颜色中的color是RGB的16进制表示

import os
import openpyxl
import openpyxl.styles

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print(sheet)

cell = sheet['A1']
cell.font = openpyxl.styles.Font(name="微软雅黑", size=20, bold=True, italic=True, color="FF0000")

workbook.save('test.xlsx')

再者,可以使用for循环,修改多行多列的数据,在这里介绍了获取的方法

import os
import openpyxl
import openpyxl.styles

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  # 获取活动表
print(sheet)

cell = sheet['A']
for i in cell:
    i.font = openpyxl.styles.Font(name="微软雅黑", size=20, bold=True, italic=True, color="FF0000")

workbook.save('test.xlsx')

设置对齐格式

Alignment(horizontal=水平对齐模式,vertical=垂直对齐模式,text_rotation=旋转角度,wrap_text=是否自动换行)
水平对齐:‘distributed’,‘justify’,‘center’,‘left’, ‘centerContinuous’,'right,‘general’
垂直对齐:‘bottom’,‘distributed’,‘justify’,‘center’,‘top’

import os
import openpyxl.styles

path = r"C:\\Users\\asuka\\Desktop"
os.chdir(path)  # 修改工作路径

workbook = openpyxl.load_workbook('test.xlsx')  # 返回一个workbook数据类型的值
sheet = workbook.active  使用python实现随机正态分布数据,并导出到表格(超详细)

Python - Win32Com - 如何从 Excel 电子表格单元格中提取超链接?

使用PHPExcel实现数据批量导出为excel表格

python垃圾回收机制(超详细)

Python Pandas库教程(超详细)

信号处理-基于希尔伯特解调(包络谱)的轴承故障诊断实战,通过python代码实现超详细讲解