One - One Code All

Blog Content

Python 操作Excel ,openpyxl

Python 统计学-科学计算   2019-08-17 09:08:38

引入openpyxl

这里使用openpyxl库来操作Excel。类似的库还有xlrd。


penpyxl的基础使用方法请参见Python openpyxl 处理Excel使用指南。

pip install openpyxl


openpyxl介绍

openpyxl模块可实现对excel文件的读、写和修改,只能处理xlsx文件,不能处理xls文件,使用之前同样需要先安装该模块,再导入 import openpyxl。

对于openpyxl,行数和列数都从1开始,单元格的行和列也从1开始。例如sheet.cell(1,2).value表示第一行第二列单元格的内容

openpyxl读取excel文件

获取工作簿对象:book = openpyxl.load_workbook('excel文件名称')

获取所有工作表名称:names = book.sheetnames

获取工作表对象:sheet1 = book.worksheets[n]、sheet2 = book['工作表名称']、sheet3 = book[book.sheetnames[n]]

获取工作表名称:title = sheet1.title

获取工作表行数:rows = sheet1.max_row

获取工作表列数:cols = sheet1.max_column

获取某一单元格内容:cell = sheet.cell(1,2).value、sheet['单元格'].value例如sheet['B1'].value

假设有一fruit2.xlsx,除后缀名其他与上述fruit.xls完全一样


数据准备

假定数据来自百度指数,以常见的一些搜索指数为例。给后面的操作准备一些数据,把数据写入Excel中。


创建Workbook对象,获取到当前可用的表格(sheet)。

直接使用append方法把一行数据追加写入。最后调用Workbook的保存方法,存储数据。

def create_excel_demo(file_path):
    """
    创建Excel文件,并写入数据
    :param file_path: 目标文件路径
    :return none
    """
    wb = Workbook()
    ws = wb.active
    ws.title = '搜索指数概览'

    ws.append(['关键词', '整体日均值', '移动日均值', '整体同比', '整体环比', '移动同比', '移动环比'])
    ws.append(['excel', 27782, 18181, -0.11, -2, 0.21, 0.02])
    ws.append(['python', 24267, 8204, 0.27, 0.06, 0.56, 0.01])
    ws.append(['文案', 2411, 1690, 0.56, 0.33, 0.91, 0.46])
    ws.append(['okr', 1928, 880, 0.38, 0.15, 0.29, 0.09])
    ws.append(['kpi', 4212, 2784, 0.21, -0.19, 0.36, -0.22])
    wb.save(file_path)

读取数据

访问整个表格的数据

访问表格中所有的数据,并打印出来。

首先我们要知道表格中有数据的单元格的范围,使用sheet.max_row与sheet.max_column获取表格的行列数量。

def read_xlsx_basic(file_path):
    """
    读取Excel的数据并打印出来
    """
    wb = load_workbook(file_path)
    st = wb.active
    end_row = st.max_row + 1
    end_column = st.max_column + 1
    print(st.title, '有', end_row, '行', end_column, '列')
    for row in range(1, end_row):
        for col in range(1, end_column):
            print('{:10}'.format(st.cell(row=row, column=col).value), end='')
        print()

值得注意的是,单元格下标是从1开始的。如果使用了不当的下标,报错信息


ValueError: Row or column values must be at least 1


参考: https://stackoverflow.com/questions/34492322/how-to-scan-all-sheet-cells


修改表格

有了Excel表格后,我们可以修改表格的一些格式和数据。


st表示当前表。


调整列的宽度

用 column_dimensions 来获取列。例如column_dimensions['A']获取到的是第A列。

ord方法是将字符转换为ascii码。ord('A')得到65。


这里调整的是A列到G列的宽度。

for col in range(ord('A'), ord('G') + 1):
        st.column_dimensions[chr(col)].width = 15

设置单元格格式

格式,比如字体大小,对齐模式,粗体斜体等。


字体

首先我们要拿到单元格cell,这里使用st.cell(row=1, column=col)来获取某一个格子。

Cell持有的font是不可修改的。不能使用如cell.font.size = 13这样的操作,会报异常。

copy方法是复制一个对象。这里复制的是font。

cell = st.cell(row=1, column=col)
    font = copy(cell.font)
    font.size = 13
    font.bold = True
    cell.font = font

对齐

对齐模式。使用alignment属性。

cell.alignment = Alignment(horizontal="center", vertical="center")

数据显示

操作Excel时,我们可以设置单元格数据显示的方式,比如常规,数值,货币,百分比等等。

这里使用的是number_format属性。


如果数据(value)是0.02,经过下面的设置后,Excel中显示的是2%。

cell.number_format = '0%'


修改数据

修改单元格的数值(value)。

修改数据首先要拿到那个单元格cell,然后对其value赋值。

st.cell(row=2, column=7).value = 0.42  # 修改数值


示例:

import openpyxl
file=r'cases.xlsx'
#Open the given filename and return the workbook
workbook=openpyxl.load_workbook(file)

#选中工作簿中的表单
sh=workbook['register']

# 读取
# print(sh.rows,type(sh.rows))
# 按行读取,每一行的数据放到一个元组中
res=list(sh.rows)

# print(res,type(res))
title=[i.value for i in res[0]]
# print(title)
cases=[]
#遍历除第一行外的其他行
for item in res[1:]:
    print(item)
    it=[i.value for i in item]
    # 打包成字典
    case=dict(zip(title,it))
    cases.append(case)
print(cases)


def read_excel():
    excel=openpyxl.load_workbook('./cases.xlsx')
    sheet=excel['Sheet2']
    list_tuple=[]
    # 逐行循环读取excel的数据
    for value in sheet.values:
        # 判断当前行第一列的值是否是数字编号
        if type(value[0]) is int:
            # 将每一行读取的内容(元组),装载到list_tuple中
            list_tuple.append(value)
    return list_tuple


参考:


https://stackoverflow.com/questions/12387212/openpyxl-setting-number-format

https://stackoverflow.com/questions/30050716/how-to-put-two-decimals-in-cell-with-type-of-percent

 



上一篇:boto3客户端NoRegionError:仅在某些情况下必须指定区域错误(boto3 client NoRegionError: You must specify a region error only sometimes)
下一篇:php/python/mysql: authentication method unknown to the client [caching_sha2_password] [duplicate]

The minute you think of giving up, think of the reason why you held on so long.