跳转至

1. xlrd_xlwt

简介

python操作excel主要用到xlrd,xlwt和xlutils能将xlrd这三个库 - xlrd是只能读excel的库, - xlwt是只能新建excel的库。 - xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改

pip install xlrd
pip install xlwt
pip install xlutils

1. xlrd库使用

Book(class) 由xlrd.open_work("example.xls")返回

nsheets:                      sheets数
sheet_names:                  sheet名称列表
sheets:                       sheet列表
sheet_by_index(sheetx):       按序号提取sheet
sheet_by_name(sheet_name):    按名称提取sheet

Sheet(class) 由Book object相关方法返回

name:                         sheet名
nrows:                                          行数
ncols:                                          列数
cell(rowx,colx):                                第rows行colx列的单元格
cell_type(rowx,colx):                           数据类型
cell_value(rows,colx):                          数值
col(colx):                                      第colx列所有单元格组成的列表
col_slice(colx,start_rowx=0,end_rowx=None):     第colx列指定单元格组成的列表
col_types(colx,start_rowx=0,end_rowx=None):     第colx列指定单元格数值类型组成的列表
col_values(colx,start_rowx=0,end_rowx=None):    第colx列指定单元格数值组成的列表
row同样有col的各项操作,此处略去

Cell(class) 由Sheet object(s)相关方法返回

ctype:    一个int型变量,对应不同的数值类型
value:    单元格的值

2. xlwt库使用

Workbook(class) 由xlwt.Workbook()返回

encoding:                 编码方案
add_sheet(sheet_name):    添加sheet
get_sheet(Sheet_name):    选择sheet
save(file_name):          保存

Worksheet(class) 由Workbook object相关方法返回 

write(rows,colx,cell_value,style):         编辑单元格
row(rowx).write(colx,cell_value,style):    编辑行
flush_row_data():                          减少内存压力,flush之前行不可再修改
col(colx),write(rows,cell_value,style):    编辑列

easyxf(function) 创建XFStyle instance,格式控制

expression syntax: (<element>:(<attribute> <value>,)+;)+
<element> - <attribute> - <value>:
(加粗为默认格式,以下所列并非全部)
font      - bold          - True or False
          - colour        - {colour}
          - italic        - True or False
          - name          - name of the font, Arial
          - underline     - True or False

alignment - direction     - general, lr, rl
          - horizontal    - general, left, center, right, filled 
          - vertical      - bottom, top, center, justified, distributed
          - shrink_to_fit - True or False

bolders   - left          - an integer width between 0 and 13
          - right         - an integer width between 0 and 13
          - top           - an integer width between 0 and 13
          - bottom        - an integer width between 0 and 13
          - diag          - an integer width between 0 and 13
          - left_colour   - {colour}*, automatic colour
          - right_colour  - {colour}*, automatic colour
          - ...

pattern   - back_color    - {colour}*, automatic colour
          - fore_colour   - {colour}*, automatic colour
          - pattern       - none, solid, fine_dots, sparse_dots



{colous}*: black, (dark_)(light_)blue, gold, (dark_)(light_)green, ivory, lavender,

           (light_)orange, pink, (dark_)red, rose, violet, white, (dark_)(light_)yellow, ...

3. xlutils库使用

copy:       将xlrd.Book转为xlwt.Workbook
styles:     读取xlrd.Workbook的每一个单元格的style
display:    简单而安全地呈现xlrd读取的数据
filter:     拆分与整合多个xls文件
margins:    查看表格稀疏程度
save:       序列化xlrd.Book,转存为binary xls或stream

tips

1. xlrd.open_workbook(fomatting_info=):当formatting_info=Ture,读取workbook并保留格式
2. xlrd.open_workbook(on_demand=): 当on_demand=True,只有被要求时才将worksheet载入内存,读取大文件时使用
3. xlwt.Worksheet.flush_row_data(): 减少内存占用,被刷新的行不能再访问或修改,建议每1000行刷新一次(若列很多当调整)
4. xlwt.Workbook(encoding=): 选择创建的workbook的编码

案例

1.对excel的写操作实例:

将一个列表的数据写入excel, 第一行是标题,下面行数具体的数据

#!/usr/bin/python
# _*_ coding: utf-8 _*_
"""
@Time    : 2019/1/23 14:08
@File    : 1.py
@Software: PyCharm
"""
import xlwt

# 只能写不能读
stus = [['姓名', '年龄', '性别', '分数', '手机号码'],
        ['张三', 22, '女', 50,   '12776238304'],
        ['李四', 25, '男', 72.5, '11228374621'],
        ['王五', 33, '男', 100, '12372615263'],
        ['赵六', 42, '女', 66.8, '11129374727']
        ]
book = xlwt.Workbook()  # 新建一个excel
sheet = book.add_sheet('case1_sheet')  # 添加一个sheet页,页名字是case1_sheet
row = 0  # 控制行
for stu in stus:
    col = 0  # 控制列
    for s in stu:  # 再循环里面list的值,每一列
        sheet.write(row, col, s)
        col += 1
    row += 1
book.save('stu_1.xls')  # 保存到当前目录下
运行结果

 D:\code\code-django\库\excel操作 的目录

2019/01/23  14:12    <DIR>          .
2019/01/23  14:12    <DIR>          ..
2019/01/23  14:12               796 1.py
2019/01/23  14:12             5,632 stu_1.xls    # 产生这个文件
2019/01/23  14:08               129 __init__.py
               3 个文件          6,557 字节
               2 个目录 28,743,331,840 可用字节
保存的excel表格 stu_1.xls

姓名 年龄 性别 分数 手机号码
张三 22 50 12776238304
李四 25 72.5 11228374621
王五 33 100 12372615263
赵六 42 66.8 11129374727

2.对excel 的读操作:

import xlrd

# 只能读不能写
book = xlrd.open_workbook('stu_1.xls')  # 打开一个excel
sheet = book.sheet_by_index(0)  # 根据顺序获取sheet
sheet2 = book.sheet_by_name('case1_sheet')  # 根据sheet页名字获取sheet
print(sheet.cell(0, 0).value)  # 指定行和列获取数据
print(sheet.cell(0, 1).value)
print(sheet.cell(0, 2).value)
print(sheet.cell(0, 3).value)
print(sheet.ncols)  # 获取excel里面有多少列
print(sheet.nrows)  # 获取excel里面有多少行
print(sheet.get_rows())  #
for i in sheet.get_rows():
    print(i)  # 获取每一行的数据
print(sheet.row_values(0))  # 获取第一行
for i in range(sheet.nrows):  # 0 1 2 3 4 5
    print(sheet.row_values(i))  # 获取第几行的数据

print(sheet.col_values(1))  # 取第一列的数据
for i in range(sheet.ncols):
    print(sheet.col_values(i))  # 获取第几列的数据
运行结果

"C:\Program Files\Python37\python.exe" D:/code/code-django/库/excel操作/read.py
姓名
年龄
性别
分数
5
5
<generator object Sheet.get_rows.<locals>.<genexpr> at 0x00000231D5D0D4F8>
[text:'姓名', text:'年龄', text:'性别', text:'分数', text:'手机号码']
[text:'张三', number:22.0, text:'女', number:50.0, text:'12776238304']
[text:'李四', number:25.0, text:'男', number:72.5, text:'11228374621']
[text:'王五', number:33.0, text:'男', number:100.0, text:'12372615263']
[text:'赵六', number:42.0, text:'女', number:66.8, text:'11129374727']
['姓名', '年龄', '性别', '分数', '手机号码']
['姓名', '年龄', '性别', '分数', '手机号码']
['张三', 22.0, '女', 50.0, '12776238304']
['李四', 25.0, '男', 72.5, '11228374621']
['王五', 33.0, '男', 100.0, '12372615263']
['赵六', 42.0, '女', 66.8, '11129374727']
['年龄', 22.0, 25.0, 33.0, 42.0]
['姓名', '张三', '李四', '王五', '赵六']
['年龄', 22.0, 25.0, 33.0, 42.0]
['性别', '女', '男', '男', '女']
['分数', 50.0, 72.5, 100.0, 66.8]
['手机号码', '12776238304', '11228374621', '12372615263', '11129374727']

3.对excel的修改操作:

将excel中的某个值修改并重新保存

from xlutils.copy import copy
import xlrd

# xlutils:修改excel
book1 = xlrd.open_workbook('stu_1.xls')
book2 = copy(book1)              # 拷贝一份原来的excel
# print(dir(book2))
sheet = book2.get_sheet(0)       # 获取第几个sheet页,book2现在的是xlutils里的方法,不是xlrd的
sheet.write(1, 3, 100)           # 修改分数
sheet.write(1, 0, '张三他姥爷')  # 修改姓名
book2.save('stu.xls')

运行后结果

姓名 年龄 性别 分数 手机号码
张三她姥爷 22 100 12776238304
李四 25 72.5 11228374621
王五 33 100 12372615263
赵六 42 66.8 11129374727