Python操作Excel表格的库有不少,我接触到的比较多的主要要“三个”,这篇文章主要是对它们几个之间的区别介绍和基础使用笔记,它们分别是:xlrd+xlwt,openpyxl库,csv库。并整理了对应的官方文档地址, 方便进行使用学习, 干货文章快快收藏吧.
介绍和区别
xlrd+xlwt
xlrd+xlwt是两个库:xlrd用于读取,xlwt用于写入编辑,xlrd和xlwt可以读取格式为.xls的Excel文件.
注:旧版本的xlrd是可以读取xlsx的Excel文件的,新版本的的xlrd不支持读取.xlsx文件(貌似是为了和openpyxl库区分开来)
如果你使用新版本的xlrd打开xlsx文件, 就会报错: xlrd.biffh.XLRDError: Excel xlsx file; not supported. 具体你可以看我这篇文章: Python xlrd 报错xlrd.biffh.XLRDError: Excel xlsx file; not supported…异常解决
xlrd官方文档和GitHub地址
xlwt官方文档和GitHub地址
openpyxl库
openpyxl库:openpyxl用于读取和写入.xlsx格式的Excel文件。
openpyxl库官方文档和Bitbucket地址
csv库
csv库:csv库是Python自带的库,可以用于处理.csv格式的Excel文件,
这里贴一下CSV 和 Excel表格的区别:
CSV 和 Excel 之间的主要区别:
- CSV 是一种将表格信息保存到扩展名为 .csv 的分隔文本文件中的格式,而 Excel 是一种电子表格,可将文件保存为自己的专有格式,即 xls 或 xlsx。
- CSV 是一种纯文本格式,其中包含一系列用逗号分隔的值,而 Excel 是一个二进制文件,其中包含有关工作簿中所有工作表的信息。
- CSV文件不能对数据进行操作,而Excel可以对数据进行操作。
- 比较 CSV 与 Xlsx,CSV 文件速度更快,而且消耗的内存更少,而 Excel 在导入数据时消耗更多的内存。
- 比较 CSV 与 Excel,CSV 文件可以用 Windows 中的任何文本编辑器打开,而 Excel 文件不能用文本编辑器打开
更详细的区别介绍,你可以看这里:https://zhuanlan.zhihu.com/p/571381184
CSV表格注意:
- 由于是纯文本,所以所有的值均为字符串类型
- 无法进行字体操作和单元格操作,比如无法改变字体大小,颜色等,无法改变单元格的大小等
- 无法创建多个工作表
- 无法嵌入图片
CSV官方文档地址
https://docs.python.org/3/library/csv.html
更多信息
如果你想知道更多关于Python操作Excel表格的库,你可以访问这个网站:https://www.python-excel.org/,这个网站收集Python操作Excel表格优秀Python库。
示例代码
xlrd+xlwt
xlrd
安装使用
# -*- coding: utf-8 -*-
# 1. 安装
# pip install xlrd
# 笔记参考 :
# https://zhuanlan.zhihu.com/p/625017437
# https://mp.weixin.qq.com/s/1ErO7hfAqfIIt1AuoeaGeQ
# 2. 使用
# 导入
import xlrd
打开工作簿
# -*- coding: utf-8 -*-
# 导入
import xlrd
# xlrd.open_workbook(filename='excel文件路径') - 打开指定路径对应的excel文件,返回excel文件对应的工作簿对象。
wb = xlrd.open_workbook(filename='data1.xls')
选择工作表
# 一个工作簿中可能包含多个工作表,
# 假设上面的案例文件 data1.xls 文件是一个工作簿,里面包含了两个工作表,分别是:sheet1 和 sheet2。
# 获取excel文件内容的时候需要先确定,需要获取的数据来源于哪个工作表。
# 工作簿对象.sheet_names() - 获取工作簿中所有工作表的表名
s_names = wb.sheet_names()
print(s_names)
# 执行结果:['Sheet1', 'Sheet2']
# 工作簿对象.sheets() - 获取工作簿中所有工作表对应的工作表对象
# 工作簿对象.sheet_by_index(下标) - 获取指定下标对应的工作表对象
# 工作簿对象.sheet_by_name(表名) - 获取指定表名对应的工作表对象
# 以上三个函数都会返回一个xlrd.sheet.Sheet()对象
all_sheet = wb.sheets()
print(all_sheet) # 所有工作表对应的工作表对象
print(len(all_sheet)) # 工作表对象数量
print(type(all_sheet)) # <class 'list'>
print(all_sheet[0]) # 在所有工作表对象中 可以通过索引的方式获取指定的工作表对象
# 获取指定下标对应的工作表对象 注意: excel表的下标也是以0开始的
teacher_s = wb.sheet_by_index(1)
print(teacher_s)
# 获取指定表名对应的工作表对象
worksheet_sheet1 = wb.sheet_by_name('Sheet1')
print(worksheet_sheet1)
# 执行结果:
# [Sheet 0:<Sheet1>, Sheet 1:<Sheet2>]
# Sheet 0:<Sheet1>
# Sheet 1:<Sheet2>
# Sheet 0:<Sheet1>
获取行列信息
# nrows = 工作表对象.nrows
# # 获取该sheet中的行数,注,这里table.nrows后面不带().
#
# 工作表对象.row(rowx)
# # 返回由该行中所有的单元格对象组成的列表,这与tabel.raw()方法并没有区别。
#
# 工作表对象.row_slice(rowx)
# # 返回由该行中所有的单元格对象组成的列表
#
# 工作表对象.row_types(rowx, start_colx=0, end_colx=None)
# # 返回由该行中所有单元格的数据类型组成的列表;
# # 返回值为逻辑值列表,若类型为empy则为0,否则为1
#
# 工作表对象.row_values(rowx, start_colx=0, end_colx=None)
# # 返回由该行中所有单元格的数据组成的列表
#
# 工作表对象.row_len(rowx)
# # 返回该行的有效单元格长度,即这一行有多少个数据
# ncols = table.ncols
# # 获取列表的有效列数
#
# table.col(colx, start_rowx=0, end_rowx=None)
# # 返回由该列中所有的单元格对象组成的列表
#
# table.col_slice(colx, start_rowx=0, end_rowx=None)
# # 返回由该列中所有的单元格对象组成的列表
#
# table.col_types(colx, start_rowx=0, end_rowx=None)
# # 返回由该列中所有单元格的数据类型组成的列表
#
# table.col_values(colx, start_rowx=0, end_rowx=None)
# # 返回由该列中所有单元格的数据组成的列表
# 工作表对象.nrows - 获取工作表中的行数
# 工作表对象.ncols - 获取工作表中的列数
print(worksheet_sheet1.nrows)
print(worksheet_sheet1.ncols)
# 执行结果:
# 5
# 4
# 工作表对象.row_values(行下标) - 获取指定下标对应的行中所有的数据,结果以列表的形式返回
# 工作表对象.col_values(列下标) - 获取指定下标对应的列中所有的数据,结果以列表的形式返回(下标从0开始)
print(worksheet_sheet1.row_values(1))
print(worksheet_sheet1.col_values(0))
# 执行结果:
# ['小明', ' 男', 20.0, 99.0]
# ['姓名', '小明', '张三', '小花', '老王']
#
# 根据之前获取行数结合获取整行的方法,可以通过循环一行一行的将整个excel:
for x in range(worksheet_sheet1.nrows): # 使用worksheet_sheet1.nrows属性获取工作表中的行数,然后使用range()函数生成一个行数范围的迭代器。
# 循环获取每一行
print(worksheet_sheet1.row_values(x))
# 执行结果:
# ['姓名', ' 性别', ' 年龄', ' 分数']
# ['小明', ' 男', 20.0, 99.0]
# ['张三', ' 男', 25.0, 87.0]
# ['小花', ' 女', 22.0, 95.0]
# ['老王', ' 男', 30.0, 77.0]
操作单元格
#
# 工作表对象.row(行下标) - 获取指定下标对应的行中所有的单元格。结果是一个列表,列表中的元素是单元格对象(注意不是单元格内容)
# 工作表对象.col(列下标) - 获取指定下标对象的列中所有的单元格。
# 工作表对象.cell(行下标, 列下标) - 获取指定行下标和列下标对应的单元格对象。
# 单元格对象.value - 获取指定单元格中的值
# 单元格对象.cell_type(rowx,colx)
# # 返回对应位置单元格中的数据类型
# 单元格对象.cell_value(rowx,colx)
# # 返回对应位置单元格中的数据
# 注: 下标索引是0开始的
print(worksheet_sheet1.row(0)) # 获取第一行 - 列名
print(worksheet_sheet1.row(1)) # 获取第二行 -
print(worksheet_sheet1.col(1)) # 获取第二列
print(worksheet_sheet1.cell(3, 0)) # 获取指定单元格, 行下标, 列下标
print(worksheet_sheet1.row(1)[0].value) # 获取指定单元格中的值
print(worksheet_sheet1.col(1)[2].value)
print(worksheet_sheet1.cell(3, 0).value)
xlwt
安装使用
# -*- coding: utf-8 -*-
# 1. 安装
# pip install xlwt
# 2. 使用
# 导入
import xlwt
# xlwt对Excel文件进行写操作的时候,只能对通过xlwt新建的Excel文件进行写操作,无法直接对已经存在的Excel文件进行写操作。
# 如果想要对已经存在的Excel文件进行写操作需要使用后面的xlutils模块。
新建工作簿和工作表
# 导入
import xlwt
#
# 新建工作簿其实就是新建一个Excel文件。
# 和手动通过Excel软件创建Excel文件不同,xlwt新建工作簿的时候不会自动创建工作表,所以在创建完工作簿以后还需要创建至少一个工作表。
# xlwt.Workbook() - 新建一个工作簿对象并且返回
# 工作簿对象.add_sheet(表名) - 在工作簿中新建一个工作表
# 工作簿对象.save(文件路径) - 将工作簿对象对应的Excel文件保存到指定位置(文件必须保存成xls格式的)
new_built_workbook = xlwt.Workbook()
fruits_worksheet = new_built_workbook.add_sheet('水果') # 新建工作表水果
vegetable_s = new_built_workbook.add_sheet('蔬菜') # 新建工作表蔬菜
new_built_workbook.save('data2.xls') # 注: 如果保存的文件名已存在 将会直接覆盖已存在的文件
写入数据到指定单元格
#
# 工作表对象.write(行下标, 列下标, 内容) - 将指定内容写入到指定单元格(通过行下标和列下标可以确定一个唯一单元格)
fruits_worksheet.write(0, 0, '名称')
fruits_worksheet.write(0, 1, '单价')
fruits_worksheet.write(0, 2, '数量')
fruits_worksheet.write(0, 3, '总价')
new_built_workbook.save('data2.xls') # 注意:所有写操作完成后必须保存
# 这个地方有个需要特别注意的是,默认情况下同一个单元格不能重复进行写操作,
# 如果需要对同一个单元格重复进行写操作,在创建工作表的时候必须将参数cell_overwrite_ok的值设置为 True。
# 不然会出现如下错误: Attempt to overwrite cell: ....
try:
fruits_worksheet = new_built_workbook.add_sheet('水果')
fruits_worksheet.write(0, 0, '名称')
fruits_worksheet.write(0, 1, '单价')
fruits_worksheet.write(0, 2, '数量')
fruits_worksheet.write(0, 3, '总价')
fruits_worksheet.write(0, 3, '总计') # 对0、3这个位置的单元格重复进行写操作
new_built_workbook.save('data2.xls')
except Exception as e:
print(e)
# 错误详情: Exception: Attempt to overwrite cell: sheetname='水果' rowx=0 colx=3
#
# 如果创建工作表的时候设置 cell_overwrite_ok 为True,对同一个单元格写多次不会报错:
fruits_worksheet = new_built_workbook.add_sheet('水果', cell_overwrite_ok=True)
fruits_worksheet.write(0, 0, '名称')
fruits_worksheet.write(0, 1, '单价')
fruits_worksheet.write(0, 2, '数量')
fruits_worksheet.write(0, 3, '总价')
fruits_worksheet.write(0, 3, '总计') # 对0、3这个位置的单元格重复进行写操作
new_built_workbook.save('data2.xls')
# 写入字典数据示例代码
data = [
{'name': '张三', 'age': 25, 'city': '北京'},
{'name': '李四', 'age': 30, 'city': '上海'},
{'name': '王五', 'age': 35, 'city': '广州'}
]
wb = xlwt.Workbook()
ws = wb.add_sheet('Sheet1')
# 写入表头
ws.write(0, 0, '姓名')
ws.write(0, 1, '年龄')
ws.write(0, 2, '城市')
# 写入数据
for i, row in enumerate(data): # 利用enumerate将列表转换为索引:元素的字典 获取索引和元素
ws.write(i + 1, 0, row['name'])
ws.write(i + 1, 1, row['age'])
ws.write(i + 1, 2, row['city'])
wb.save('write_dict_test.xls')
xlwt设置字体格式
# -*- coding: utf-8 -*-
import xlwt
# 3.2.3 xlwt设置字体格式
def fun3_2_3():
# 创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding='ascii')
# 创建新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 初始化样式
style = xlwt.XFStyle()
# 为样式创建字体
font = xlwt.Font()
font.name = 'Times New Roman' # 字体
font.bold = True # 加粗
font.underline = True # 下划线
font.italic = True # 斜体
# 设置样式
style.font = font
# 往表格写入内容
worksheet.write(0, 0, "内容1")
worksheet.write(2, 1, "内容2", style)
# 保存
workbook.save("新创建的表格.xls")
设置列宽
# xlwt中列宽的值表示方法:默认字体0的1/256为衡量单位。
# xlwt创建时使用的默认宽度为2960,既11个字符0的宽度
# 所以我们在设置列宽时可以用如下方法:
# width = 256 * 20 256为衡量单位,20表示20个字符宽度
def fun3_2_4():
# 创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding='ascii')
# 创建新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格写入内容
worksheet.write(0, 0, "内容1")
worksheet.write(2, 1, "内容2")
# 设置列宽
worksheet.col(0).width = 256 * 20
# 保存
workbook.save("新创建的表格.xls")
设置行高
# xlwt中没有特定的函数来设置默认的列宽及行高
# 行高是在单元格的样式中设置的,你可以通过自动换行通过输入文字的多少来确定行高
def fun3_2_5():
# 创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding='ascii')
# 创建新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格写入内容
worksheet.write(0, 0, "内容1")
worksheet.write(2, 1, "内容2")
# 设置行高
style = xlwt.easyxf('font:height 360;') # 18pt,类型小初的字号
row = worksheet.row(0)
row.set_style(style)
# 保存
workbook.save("新创建的表格.xls")
合并列和行
def fun3_2_6():
# 创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding='ascii')
# 创建新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格写入内容
worksheet.write(0, 0, "内容1")
# 合并 第1行到第2行 的 第0列到第3列
worksheet.write_merge(1, 2, 0, 3, 'Merge Test')
# 保存
workbook.save("新创建的表格.xls")
添加边框
def fun3_2_7():
# 创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding='ascii')
# 创建新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格写入内容
worksheet.write(0, 0, "内容1")
# 设置边框样式
borders = xlwt.Borders() # Create Borders
# May be: NO_LINE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR,
# MEDIUM_DASHED, THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED,
# MEDIUM_DASH_DOT_DOTTED, SLANTED_MEDIUM_DASH_DOTTED, or 0x00 through 0x0D.
# DASHED虚线
# NO_LINE没有
# THIN实线
borders.left = xlwt.Borders.DASHED
borders.right = xlwt.Borders.DASHED
borders.top = xlwt.Borders.DASHED
borders.bottom = xlwt.Borders.DASHED
borders.left_colour = 0x40
borders.right_colour = 0x40
borders.top_colour = 0x40
borders.bottom_colour = 0x40
style = xlwt.XFStyle() # Create Style
style.borders = borders # Add Borders to Style
worksheet.write(0, 0, '内容1', style)
worksheet.write(2, 1, "内容2")
# 保存
workbook.save("新创建的表格.xls")
设置单元格背景色
def fun3_2_8():
# 创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding='ascii')
# 创建新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格写入内容
worksheet.write(0, 0, "内容1")
# 创建样式
pattern = xlwt.Pattern()
# May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# May be: 8 through 63. 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
style = xlwt.XFStyle()
style.pattern = pattern
# 使用样式
worksheet.write(2, 1, "内容2", style)
设置单元格对齐
# 使用xlwt中的Alignment来设置单元格的对齐方式,其中horz代表水平对齐方式,vert代表垂直对齐方式。
# VERT_TOP = 0x00 上端对齐
# VERT_CENTER = 0x01 居中对齐(垂直方向上)
# VERT_BOTTOM = 0x02 低端对齐
# HORZ_LEFT = 0x01 左端对齐
# HORZ_CENTER = 0x02 居中对齐(水平方向上)
# HORZ_RIGHT = 0x03 右端对齐
def fun3_2_9():
# 创建新的workbook(其实就是创建新的excel)
workbook = xlwt.Workbook(encoding='ascii')
# 创建新的sheet表
worksheet = workbook.add_sheet("My new Sheet")
# 往表格写入内容
worksheet.write(0, 0, "内容1")
# 设置样式
style = xlwt.XFStyle()
al = xlwt.Alignment()
# VERT_TOP = 0x00 上端对齐
# VERT_CENTER = 0x01 居中对齐(垂直方向上)
# VERT_BOTTOM = 0x02 低端对齐
# HORZ_LEFT = 0x01 左端对齐
# HORZ_CENTER = 0x02 居中对齐(水平方向上)
# HORZ_RIGHT = 0x03 右端对齐
al.horz = 0x02 # 设置水平居中
al.vert = 0x01 # 设置垂直居中
style.alignment = al
# 对齐写入
worksheet.write(2, 1, "内容2", style)
# 保存
workbook.save("新创建的表格.xls")
openpyxl库
1-安装
# -*- coding: utf-8 -*-
# 安装
# pip install openpyxl
2-打开、读取excel文件
# -*- coding: utf-8 -*-
# 行 row
# 列 column
# 格子 cell
# 表 sheet
from openpyxl import load_workbook
# 打开一个表格文件
workbook = load_workbook(filename='新建 Microsoft Excel 工作表.xlsx')
# 获取表格文件中的表名
print(workbook.sheetnames)
# 打开唯一活跃的表
sheet = workbook.active
# 打开指定表
sheet = workbook['Sheet1']
# 查看表格范围
print(sheet.dimensions)
# 获取格子
cell1 = sheet['A1']
# 按行、列获取格子
cell2 = sheet.cell(row=1, column=1)
print(cell1)
print(cell2)
# 拿到对应的值
print(cell1.value)
# 获取单元格对应的行、列、坐标位置
print('行:', cell1.row)
print('列:', cell1.column)
print('坐标:', cell1.coordinate)
# 获取列范围单元格
cells = sheet['A1:A5']
print(cells)
# 获取指定列
cells = sheet['A']
# 获取指定范围列
cells = sheet['A:F']
# 获取指定行和列范围 按行返回数据
# .iter_rows(min_row=最低行数, max_row=最高行数, min_col=最低列数, max_col=最高列数)
# 获取指定行和列范围 按列返回数据
# .iter_cols(min_row=最低行数, max_row=最高行数, min_col=最低列数, max_col=最高列数)
# 返回表格所有行
# .rows
for row in sheet.rows:
print(row)
# 返回表格所有列
# .cols
for col in sheet.cols:
print(col)
3-向excel表格写入
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
# 打开一个表格文件
workbook = load_workbook(filename='新建 Microsoft Excel 工作表.xlsx')
# 获取表格文件中的表名
print(workbook.sheetnames)
# 打开唯一活跃的表
sheet = workbook.active
# 写入单元格有两种基本方法:使用工作表的键(例如 A1 或 D3),或通过cell()方法使用行和列表示法。
cell1 = sheet['A1']
cell1.value = 'hello'
# sheet.cell(row=2, column=2).value = 2
workbook.save(filename='新建 Microsoft Excel 工作表.xlsx')
data = [
['a', 1],
['b', 2],
['c', 3],
['d', 4],
]
for row in data:
# append()方法是openpyxl模块中Worksheet对象的一个方法。
# 这个方法可以将一行数据作为一个列表传入,然后将这个列表的数据依次写入工作表中的下一行。
sheet.append(row)
# 插入列
sheet.insert_cols(idx=2)
# 插入指定列数
sheet.insert_cols(idx=2, amount=3)
# 插入列
sheet.insert_rows(idx=2)
# 删除列、列
sheet.delete_rows(idx=1)
sheet.delete_cols(idx=1, amount=2)
# 移动格子
sheet.move_range('移动的格子', rows=2, cols=2)
# 正整数为向下或向右、负整数为向左或向上
# 创建新的sheet
sheet = workbook['表格2']
# 删除sheet
workbook.remove('要删除的表格')
# 复制sheet
workbook.copy_worksheet('要复制的表格')
# 修改sheet名称
sheet.title = '新名字'
# 创建新excel表格文件
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet.title = '表格名称'
# 保存
workbook.save(filename='这是新创建的表格.xlsx')
# 冻结窗格
sheet.freeze_panes = 'B2'
# 筛选
sheet.auto_filter.ref = sheet.dimensions # 代表选中整个表格
# 对表格做完操作后需要保存才能生效
workbook.save(filename='新建 Microsoft Excel 工作表.xlsx')
# 写入字典数据示例代码
from openpyxl import Workbook
data = [
{'name': '张三', 'age': 25, 'city': '北京'},
{'name': '李四', 'age': 30, 'city': '上海'},
{'name': '王五', 'age': 35, 'city': '广州'}
]
wb = Workbook()
ws = wb.active
# 写入表头
ws.append(['姓名', '年龄', '城市'])
# 写入数据
for row in data:
ws.append([row['name'], row['age'], row['city']])
wb.save('write_dict_test.xlsx')
4-批量调整字体、样式
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
# 修改字体需要导入对应的类
from openpyxl.styles import Font
# 打开一个表格文件
workbook = load_workbook(filename='新建 Microsoft Excel 工作表.xlsx')
# 获取表格文件中的表名
print(workbook.sheetnames)
# 打开唯一活跃的表
sheet = workbook.active
cell1 = sheet['A1']
# Font(name=字体名称, size=字体大小,bold=是否加粗,italic=是否斜体,color=字体颜色)
font = Font(name='字体名称', site=20, bold=True, italic=True, color='ff0000')
# 获取表格中字体样式
cell1_info = cell1.font
print(cell1_info.name, cell1_info.size, cell1_info.bold, cell1_info.italic)
# 设置对齐样式
# Alignment(horizontal=水平对齐模式,vertical=垂直对齐模式,text_rotation=旋转角度, wrap_text=是否自动换行)
# cell1.alignment = Alignment(horizontal=水平对齐模式,vertical=垂直对齐模式,text_rotation=旋转角度, wrap_text=是否自动换行)
# 参数:
# 水平对齐: 'distributed', 'justify', 'center, 'left', 'ill, 'centerContinuous', 'right,'general'
# 垂直对齐: 'bottom', 'distributed', "justify', 'center', 'top'
# 设置边框样式
# Side(style=边线样式,color=边线颜色)
# Border(left=左边线样式, right=右边线样式, top=.上边线样式, bottom=下边线样式, )
# side1 = (style=边线样式,color=边线颜色)
# border = Border(left=side1)
# cell1.border = border
# 样式代码去官网或者网上找吧
# 设置填充样式
# 普通填充
# PatternFill(fill_type=填充样式,fgColor=填充颜色)
# 渐变填充
# GradientFill(stop=(渐变颜色1,渐变颜色2, ....))
# pattern_fill = PatternFill(fill_type=填充样式,fgColor=填充颜色)
# gradient_fill = GradientFill(stop=(渐变颜色1,渐变颜色2, ....))
# cell.fill = pattern_fill
# cell.fill = gradient_fill
# 设置行高和列宽
# .row_dimensions[行编号].height=行高
# .column_dimensions[列编号].width=列宽
sheet.row_dimensions[1].height = 50
sheet.column_dimensions['B'].width = 20
# 合并单元格
# .merge_cells(待合并的格子编号)
# .merge_cells(start_row=起始行号, start_column=起始列号, end_row=结束行号,
# end_column=结束列号)
# sheet.merge_cells('C1:D2')
# sheet.merge_cells(start_row=7, start_column=1, end_row=8, end_column=4)
# 取消合并单元格 unmerge_cells = merge_cells
5-1-往excel插入图片
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
# 插入图片
from openpyxl import load_workbook
# 打开一个表格文件
workbook = load_workbook(filename='新建 Microsoft Excel 工作表.xlsx')
# 获取表格文件中的表名
print(workbook.sheetnames)
# 打开唯一活跃的表
sheet = workbook.active
# 准备图片
excel_img = Image('图片.jqp')
# 设置高度
excel_img.height = 100
# 设置宽度
excel_img.width = 100
# sheet.add_image(准备的图片,'位置')
sheet.add_image(excel_img, 'A1')
# 对表格做完操作后需要保存才能生效
workbook.save(filename='新建 Microsoft Excel 工作表.xlsx')
5-2-插入柱状图
# -*- coding: utf-8 -*-
from openpyxl import load_workbook
from openpyxl.chart import BarChart, Reference
# 打开一个表格文件
workbook = load_workbook(filename='新建 Microsoft Excel 工作表.xlsx')
# 获取表格文件中的表名
print(workbook.sheetnames)
# 打开唯一活跃的表
sheet = workbook.active
# 新建一个柱状图
chart = BarChart()
# 数据引用范围
data = Reference(workbook=sheet, min_row=1, max_row=7, min_col=2, max_col=3)
# X轴项目名称
categories = Reference(sheet, min_col=1, min_row=2, max_row=7)
# 给柱状图添加数据、titles_from_data代表数据源中有标题(数据范围第一行就是标题的情况下,设置为True)
chart.add_data(data, titles_from_data=True)
# 设置X轴类目
chart.set_categories(categories)
# 将图表添加到工作表中 为添加的图表设置一个单元格(可选)
sheet.add_chart(chart, 'E2')
# 对表格做完操作后需要保存才能生效
workbook.save(filename='新建 Microsoft Excel 工作表.xlsx')
5-3-插入条形图
from openpyxl import load_workbook
from openpyxl.chart import LineChart, Reference
# 打开一个表格文件
workbook = load_workbook(filename='新建 Microsoft Excel 工作表.xlsx')
# 获取表格文件中的表名
print(workbook.sheetnames)
# 打开唯一活跃的表
sheet = workbook.active
# 新建一个条形图
chart = LineChart()
# 数据引用范围
data = Reference(workbook=sheet, min_row=1, max_row=7, min_col=2, max_col=3)
# X轴项目名称
categories = Reference(sheet, min_col=1, min_row=2, max_row=7)
# 给柱状图添加数据
# from_rows=True 数据是横向的
# titles_from_data代表数据源中有标题(数据范围第一行就是标题的情况下,设置为True)
chart.add_data(data, from_rows=True, titles_from_data=True)
# 设置X轴类目
chart.set_categories(categories)
# 将图表添加到工作表中 为添加的图表设置一个单元格(可选)
sheet.add_chart(chart, 'E2')
# 对表格做完操作后需要保存才能生效
workbook.save(filename='新建 Microsoft Excel 工作表.xlsx')
csv库
读取CSV文件
# -*- coding: utf-8 -*-
import codecs
import csv
# 读取 CSV 文件的最简单示例:
with open('some.csv', newline='') as f:
reader = csv.reader(f) # 返回读取器对象
# 遍历csvreader对象的每一行内容并输出
for row in reader:
print(row)
# 默认使用系统当前编码 使用encoding='' 指定编码格式
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
读取特定列
# 假设CSV文件的第一行是列名
header = next(reader) # 读取并忽略第一行
column_index = header.index('column_name') # 找到列名所在的索引
for row in reader:
value = row[column_index] # 获取指定列的值
# 对该值进行处理代码...
写入新的CSV文件
# writer.writerow(row_data)方法用于将单行数据写入CSV文件。
# 它接受一个可迭代对象作为参数,该可迭代对象表示一行数据中的各个字段。
with open('new_file.csv', 'w', newline='') as newfile:
# 返回一个编写器对象
writer = csv.writer(newfile)
for row_data in reader:
# 在CSV文件中,第一行通常用于指定列名。
# 要在Python中使用csv模块指定列名,可以在写入CSV文件之前先将列名作为一行数据写入文件。
# 假设列名是: row_data = ['姓名', '年龄', '城市']
# writer.writerow(row_data) # 写入单行
# 对每一行数据进行处理
# 将处理后的数据写入新的CSV文件
# 假设row_data = ['张三', '25', '北京']
writer.writerow(row_data) # 写入单行
写入列名
with open('new_file.csv', 'w', newline='') as newfile:
# 返回一个编写器对象
writer = csv.writer(newfile)
# 在CSV文件中,第一行通常用于指定列名。
# 要在Python中使用csv模块指定列名,可以在写入CSV文件之前先将列名作为一行数据写入文件。
row_data = ['姓名', '年龄', '城市'] # 假设列名
writer.writerow(row_data) # 写入单行
写入多行
# 假设row_data
# row_data = [
# ['姓名', '年龄', '城市'],
# ['张三', '25', '北京'],
# ['李四', '30', '上海'],
# ['王五', '35', '广州']
# ]
# 写入新的CSV文件:
# writer.writerows(row_data)方法用于将多行数据写入CSV文件。
# 它接受一个可迭代对象作为参数,其中每个元素表示一行数据。
with open('new_file.csv', 'w', newline='') as newfile:
# 返回一个编写器对象
writer = csv.writer(newfile)
writer.writerows(row_data) # 写入多行 # 会直接将第一个元素['姓名', '年龄', '城市']作为列名
出现多余的空行解决
# 在Windows系统中使用csv模块写入CSV文件时没有指定newline参数时,可能会出现多余的空行
# 使用newline=''参数,指定换行符为空字符串,这样就可以避免生成空行。
# 其他解决方法: 未测试的其他代码中的笔记: w模式在windows下写入csv的时候会多出一个空行,所以要用wb模式就可以忽略
# chatgpt详细解释
# 在默认情况下,csv模块使用系统的默认换行符
# 因为在Windows系统中,换行符由两个字符组成:回车符(\r)和换行符(\n)。
# 而在其他操作系统(如Linux和Mac)中,换行符只有一个字符,即换行符(\n)。
# 当你在写入CSV文件时没有指定newline参数时,csv模块会将行数据写入文件时,会在每一行的末尾添加一个额外的回车符(\r),从而导致生成的CSV文件中出现空行。
字典数据写入csv文件
# 使用csv模块将字典写入CSV文件时, 可以使用csv.DictWriter类来实现
# 可以直接将字典键对应列名的方式把值直接写入
data = [
{'Name': 'John', 'Age': 25, 'City': 'New York'},
{'Name': 'Alice', 'Age': 30, 'City': 'London'},
{'Name': 'Bob', 'Age': 35, 'City': 'Paris'}
]
fieldnames = ['Name', 'Age', 'City']
with open('data.csv', 'w', newline='') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames) # fieldnames设置列名
writer.writeheader()
writer.writerows(data)
直接读取为字典格式数据
# 假设csv数据格式
# first_name last_name
# Eric Idle
# John Cleese
with open('names.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile) # 返回可迭代对象DictReader 每个元素是个字典
for row in reader:
# print(type(row)) # <class 'dict'>
# print(row) # {'first_name': 'John', 'last_name': 'Cleese'}
print(row['first_name'], row['last_name']) # 取值打印
写入的中文乱码
# 如果写入的中文乱码 则可能是没有加入BOM的原因
# 在没有BOM的情况下,许多应用程序可能无法正确识别文件的编码方式,从而导致乱码等问题。
# 我们可以加入BOM
# 添加BOM可以告诉文本编辑器和其他应用程序该文件使用UTF-8编码。这对于包含非ASCII字符的文件尤其重要
with open('new_file.csv', 'w', newline='') as newfile:
# 加入BOM
newfile.write(codecs.BOM_UTF8.decode('utf-8'))
# 返回一个编写器对象
writer = csv.writer(newfile)
# 其他代码...
# 一般写文本时,默认是没有BOM头的,即编辑器不知道这个文本文件是什么编码(只能依靠编辑器识别选择 如果选择的不合适 就会乱码)
# 注: 一旦加入后,头部会增加2~3个字节,也有可能会导致一些情况下读取错误
# 部分笔记参考: https://www.cnblogs.com/DjangoBlog/p/3670774.html