WordPress课程广告

Python Excel常用操作库+使用笔记分享

释放双眼,带上耳机,听听看~!

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地址

Documentation | GitHub

xlwt官方文档和GitHub地址

Documentation  | GitHub

openpyxl库

openpyxl库:openpyxl用于读取和写入.xlsx格式的Excel文件。

openpyxl库官方文档和Bitbucket地址

Documentation | 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

笔记参考以及相关好文

xlutils模块 – 简书

经典!Python中使用xlrd与xlwt操作Excel文件详解

Python+Excel 报表自动化详解

Python写UTF8文件,UE、记事本打开依然乱码的问题

给TA打赏
共{{data.count}}人
人已打赏
Python RequestsPython异常处理Python爬虫Python笔记

Python requests 异常InsecureRequestWarning: Unverified HTTPS request is being made to host '***domain'. Adding certificate verification is strongly advised. See...解决

2023-12-7 12:04:41

Python异常处理Python笔记

Python xlrd 报错xlrd.biffh.XLRDError: Excel xlsx file; not supported异常解决

2023-12-8 16:28:38

WordPress网站建设宣传图片
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
展开目录