前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python使用openpyxl模块读写excel文件

Python使用openpyxl模块读写excel文件

作者头像
Python碎片公众号
发布2021-02-26 14:33:00
4.3K0
发布2021-02-26 14:33:00
举报
文章被收录于专栏:Python碎片公众号的专栏

openpyxl是一个用于写入和读取xlsx格式的excel文件的Python模块。

excel2010后的后缀名为xlsx,不再是xls,使用openpyxl是最适合对xlsx文件进行读取的库。

一、安装openpyxl

代码语言:javascript
复制
pip install openpyxl

二、使用openpyxl将数据写入excel文件

代码语言:javascript
复制
import openpyxl
 
 
openpyxl_data = [
    ('我', '们', '在', '这', '寻', '找'),
    ('我', '们', '在', '这', '失', '去'),
    ('p', 'y', 't', 'h', 'o', 'n')
]
output_file_name = 'openpyxl_file.xlsx'
 
 
def save_excel(target_list, output_file_name):
    """
    将数据写入xlsx文件
    """
    if not output_file_name.endswith('.xlsx'):
        output_file_name += '.xlsx'
 
    # 创建一个workbook对象,而且会在workbook中至少创建一个表worksheet
    wb = openpyxl.Workbook()
    # 获取当前活跃的worksheet,默认就是第一个worksheet
    ws = wb.active
    title_data = ('a', 'b', 'c', 'd', 'e', 'f')
    target_list.insert(0, title_data)
    rows = len(target_list)
    lines = len(target_list[0])
    for i in range(rows):
        for j in range(lines):
            ws.cell(row=i + 1, column=j + 1).value = target_list[i][j]
 
    # 保存表格
    wb.save(filename=output_file_name)
 
 
save_excel(openpyxl_data, output_file_name)

代码描述:

1.我们先将需要保存的数据解析好,保存成固定的数据类型(一个由元组或列表构成的列表)。

2.我们将保存数据到excel文件的代码封装成一个函数,方便重用。

主要步骤为:

(1).创建一个openpyxl.Workbook()对象,也就是创建一个表格对象wb。

(2).wb对象中会默认打开一个worksheet,默认是第一张表,使用active方法可以获取到这张表。

(3).将数据一个单元格一个单元格的依次写入到表中。

(4).保存文件,指定自己想保存成的文件名字。

运行结果:

上面的代码执行后,会在代码同级目录下创建一个名字为openpyxl_file.xlsx的excel文件,并写入openpyxl_data的数据,使用excel打开结果如下:

三、使用openpyxl读取excel文件中的数据

代码语言:javascript
复制
import openpyxl
 
 
input_file_name = 'openpyxl_file.xlsx'
 
 
def read_excel(input_file_name):
    """
    从xlsx文件中读取数据
    """
    workbook = openpyxl.load_workbook(input_file_name)
    print(workbook)
    # 可以使用workbook对象的sheetnames属性获取到excel文件中哪些表有数据
    print(workbook.sheetnames)
    table = workbook.active
    print(table)
    rows = table.max_row
    cols = table.max_column
 
    for row in range(rows):
        for col in range(cols):
            data = table.cell(row + 1, col + 1).value
            print(data, end=' ')
 
 
read_excel(input_file_name)

代码描述:

1.通过openpyxl的load_workbook()方法可以打开一个xlsx文件,返回一个workbook对象,这个对象是一个文件对象。

2.可以通过文件对象workbook的sheetnames获取文件中有哪些表是有数据的。

3.通过active可以获取到当前的激活的表,默认是第一张sheet,也可以使用workbook的get_sheet_by_name()方法来获取表,返回一个表格对象table。

4.通过表格对象table的max_row和max_colum方法可以获取表格中有多少行和列。

5.根据行和列就可以读取到表格中每一个单元格的数据了。

注意:使用openpyxl读数据时,索引是从1开始的,使用xlrd索引是从0开始的。

运行结果:

代码语言:javascript
复制
<openpyxl.workbook.workbook.Workbook object at 0x0000026B1A87F4E0>
['Sheet']
<Worksheet "Sheet">
a b c d e f 我 们 在 这 寻 找 我 们 在 这 失 去 p y t h o n 

使用openpyxl读取excel数据可以有很多方式实现,可以根据情况灵活使用。

四、使用openpyxl对excel进行高级操作

openpyxl除了常规的写入数据和读取数据外,还提供了非常多的高级操作。

如:设置列宽、行高,设置自动换行,设置文字居中、字体大小、字体颜色,用数据画图等。

做这些操作需要用的方法或函数在openpyxl.utils或openpyxl.styles中可以找到。在实际的使用中,需要用到什么设置可以根据自己的需求去查找对应的方法。

我们就不全部例举了,下面结合写入数据的例子给出一段代码作为参考。

代码语言:javascript
复制
import openpyxl
from openpyxl.utils import get_column_letter
from openpyxl.styles import Font, colors, Alignment
import time
 
 
openpyxl_data = [
    ('我', '们', '在', '这', '寻', '找'),
    ('我', '们', '在', '这', '失', '去'),
    ('p', 'y', 't', 'h', 'o', 'n')
]
output_file_name = 'openpyxl_file.xlsx'
 
 
def save_excel(target_list, output_file_name):
    """
    将数据写入xlsx文件
    """
    if not output_file_name.endswith('.xlsx'):
        output_file_name += '.xlsx'
 
    # 创建一个workbook对象,而且会在workbook中至少创建一个表worksheet
    wb = openpyxl.Workbook()
    # 获取当前活跃的worksheet,默认就是第一个worksheet
    ws = wb.active
    title_data = ('a', 'b', 'c', 'd', 'e', 'f')
    target_list.insert(0, title_data)
    rows = len(target_list)
    lines = len(target_list[0])
    for i in range(rows):
        for j in range(lines):
            ws.cell(row=i + 1, column=j + 1).value = target_list[i][j]
 
    # 获取每一列的内容的最大宽度
    i = 0
    col_width = list()
    # 每列
    for col in ws.columns:
        # 每行
        for j in range(len(col)):
            if j == 0:
                # 数组增加一个元素
                col_width.append(len(str(col[j].value)))
            else:
                # 获得每列中的内容的最大宽度
                if col_width[i] < len(str(col[j].value)):
                    col_width[i] = len(str(col[j].value))
        i = i + 1
    # print(col_width)
    # 设置列宽
    for i in range(len(col_width)):
        # 根据列的数字返回字母
        col_letter = get_column_letter(i + 1)
        # 当宽度大于40,宽度设置为45
        if col_width[i] > 40:
            ws.column_dimensions[col_letter].width = 45
            # for j in range(len(list(ws.columns)[i])):
            #     if len(list(ws.columns)[i][j].value) > 40:
            #         ws.row_dimensions[j].height = 15 * (len(list(ws.columns)[i][j].value) // 40 + 1)
        else:
            ws.column_dimensions[col_letter].width = col_width[i] + 3
    # 设置单元格对齐格式
    for col in ws.columns:
        for cell in col:
            cell.alignment = Alignment(horizontal='left', vertical='center', wrap_text=True)
            cell.font = Font(size=10)
 
    # 设置到期日期超过当前时间的值为红色字体
    for col in ws.columns:
        if col[0].value == '到期日期':
            for j in range(1, len(col)):
                if col[j].value and col[j].value != 'None':
                    due_time = time.mktime(time.strptime(col[j].value, '%Y-%m-%d'))
                    local_time = time.mktime(time.localtime())
                    if int(due_time) <= int(local_time):
                        # print('due_time', int(due_time), 'local_time', int(local_time))
                        col[j].font = Font(color=colors.RED)
    # 保存表格
    wb.save(filename=output_file_name)
 
 
save_excel(openpyxl_data, output_file_name)

需要了解更多可以看openpyxl文档,

openpyxl documentation: https://openpyxl.readthedocs.io/en/stable/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档