• Python操作Excel表格


    本文介绍如何通过轻量级、零依赖(仅使用标准库)的 pylightxl 库操作Excel表格。

    官网:Welcome to pylightxl documentation — pylightxl 2019 documentation

    目录

    一、入门

    1. 读写CSV文件

    2. 读Excel文件

    3. 获取工作表和单元格数据

    3.1 通过单元格地址 

    3.2 通过单元格索引

    3.3 通过单元格范围

    3.4 获取整个行或列

    3.5 通过行/列进行迭代

    3.6 更新单元格的值

    3.7 更新单元格公式

    3.8 获取命名范围

    3.9 基于键值获取行/列

    4. 读取半结构化的数据

    5. 将 pylightxl.Database 写入excel 文件

    6. 将 Python 数据写入新的 Excel 文件

    二、进阶


    一、入门

    1. 读写CSV文件

    1. import pylightxl as xl
    2. # 设置CSV文件路径
    3. # 设置CSV文件的分隔符
    4. # 设置默认工作表,将读入的CSV数据写入其中
    5. db = xl.readcsv(fn='input.csv', delimiter='/', ws='sh2')
    6. # 然后对其进行修改
    7. # 现在把它写成csv文件;或者写成excel文件,见xl.writexl()。
    8. xl.writecsv(db=db, fn='new.csv', ws=('sh2'), delimiter=',')

    2. 读Excel文件

    1. import pylightxl as xl
    2. # readxl返回一个持有所有工作表及其数据的pylightxl数据库
    3. db = xl.readxl(fn='folder1/folder2/excelfile.xlsx')
    4. # pylightxl也支持pathlib
    5. my_pathlib = pathlib.Path('folder1/folder2/excelfile.xlsx')
    6. db = xl.readxl(my_pathlib)
    7. # pylightxl也支持django用户的类文件对象。
    8. with open('excelfile.xlsx', 'rb') as f:
    9. db = xl.readxl(f)
    10. # 仅读取选择的工作表
    11. db = xl.readxl(fn='folder1/folder2/excelfile.xlsx', ws=('Sheet1','Sheet3'))
    12. # 返回所有工作表的名字
    13. db.ws_names
    14. >>> ['Sheet1', 'Sheet3']

    3. 获取工作表和单元格数据

    假设表格的数据内容如下图所示:

    3.1 通过单元格地址 

    1. # 访问指定单元格的数据
    2. db.ws(ws='Sheet1').address(address='A1')
    3. >>> 10
    4. # 访问该单元格的公式(如果有的话)
    5. db.ws(ws='Sheet1').address(address='A1', output='f')
    6. >>> ''
    7. # 访问该单元格的注释(如果有的话)
    8. db.ws(ws='Sheet1').address(address='A1', output='c')
    9. >>> 'this is a comment on cell A1!'
    10. # 注意:空单元格的索引将返回一个空字符串。
    11. db.ws(ws='Sheet1').address(address='A100')
    12. >>> ''
    13. # 默认的空值可以覆盖每个工作表。
    14. db.ws(ws='Sheet1').set_emptycell(val=0)
    15. db.ws(ws='Sheet1').address(address='A100')
    16. >>> 0

    3.2 通过单元格索引

    1. # 访问指定单元格的数据
    2. db.ws(ws='Sheet1').index(row=1, col=2)
    3. >>> 20
    4. # 访问该单元格的公式(如果有的话)
    5. db.ws(ws='Sheet1').index(row=1, col=2, output='f')
    6. >>> '=A1+10'
    7. # 注意:空单元格的索引将返回一个空字符串。
    8. db.ws(ws='Sheet1').index(row=100, col=1)
    9. >>> ''
    10. # 默认的空值可以覆盖每个工作表。
    11. db.ws(ws='Sheet1').set_emptycell(val=0)
    12. db.ws(ws='Sheet1').index(row=100, col=1)
    13. >>> 0

    3.3 通过单元格范围

    1. db.ws(ws='Sheet1').range(address='A1')
    2. >>> 10
    3. # 获取指定范围的数据
    4. db.ws(ws='Sheet1').range(address='A1:C2')
    5. >>> [[10, 20, ''], ['', 30, 40]]
    6. # 获取指定范围的公式
    7. db.ws(ws='Sheet1').range(address='A1:B1', output='f')
    8. >>> [['=10', '=A1+10']]
    9. # 用指定值更新指定范围
    10. db.ws(ws='Sheet1').update_range(address='A1:B1', val=10)

    3.4 获取整个行或列

    1. db.ws(ws='Sheet1').row(row=1)
    2. >>> [10,20,'']
    3. db.ws(ws='Sheet1').col(col=1)
    4. >>> [10,'']

    3.5 通过行/列进行迭代

    1. for row in db.ws(ws='Sheet1').rows:
    2. print(row)
    3. >>> [10,20,'']
    4. >>> ['',30,40]
    5. for col in db.ws(ws='Sheet1').cols:
    6. print(col)
    7. >>> [10,'']
    8. >>> [20,30]
    9. >>> ['',40]

    3.6 更新单元格的值

    1. db.ws(ws='Sheet1').address(address='A1')
    2. >>> 10
    3. db.ws(ws='Sheet1').update_address(address='A1', val=100)
    4. db.ws(ws='Sheet1').address(address='A1')
    5. >>> 100
    6. db.ws(ws='Sheet1').update_index(row=1, col=1, val=10)
    7. db.ws(ws='Sheet1').index(row=1, col=1)
    8. >>> 10

    3.7 更新单元格公式

    1. db.ws(ws='Sheet1').update_address(address='A1', val='=B1+100')
    2. db.ws(ws='Sheet1').update_index(row=1, col=1, val='=B1+100')

    3.8 获取命名范围

    1. # 定义一个范围
    2. db.add_nr(name='Table1', ws='Sheet1', address='A1:B2')
    3. # 获取命名范围的数据
    4. db.nr(name='Table1')
    5. >>> [[10, 20], ['', 30]]
    6. # 获取命名范围的位置
    7. db.nr_loc(name='Table1')
    8. >>> ['Sheet1','A1:B2']
    9. # 更新命名范围的值
    10. db.update_nr(name='Table1', val=10)
    11. # 查看所有的命名范围
    12. db.nr_names
    13. >>> {'Table1': 'Sheet1!A1:B2'}
    14. # 删除一个指定的范围
    15. db.remove_nr(name='Table1')

    3.9 基于键值获取行/列

    1. # 假设我们想返回 “行=1, 单元格值=20” 的那一列
    2. db.ws(ws='Sheet1').keycol(key=20, keyindex=1)
    3. >>> [20,30]
    4. # 我们还可以指定一个自定义的键索引(不仅仅是row=1),注意我们现在是根据row=2来匹配的。
    5. db.ws(ws='Sheet1').keycol(key=30, keyindex=2)
    6. >>> [20,30]
    7. # 同样,对于keyindex=1的keyrow也是如此(寻找col=1中的匹配项)。
    8. db.ws(ws='Sheet1').keyrow(key='', keyindex=1)
    9. >>> ['',30,40]

    4. 读取半结构化的数据

    1. import pylightxl
    2. db = pylightxl.readxl(fn='Book1.xlsx')
    3. # 要求半结构化数据(SSD)输出
    4. ssd = db.ws(ws='Sheet1').ssd(keycols="KEYCOLS", keyrows="KEYROWS")
    5. ssd[0]
    6. >>> {'keyrows': ['r1', 'r2', 'r3'], 'keycols': ['c1', 'c2', 'c3'], 'data': [[1, 2, 3], [4, '', 6], [7, 8, 9]]}
    7. ssd[1]
    8. >>> {'keyrows': ['rr1', 'rr2', 'rr3', 'rr4'], 'keycols': ['cc1', 'cc2', 'cc3'], 'data': [[10, 20, 30], [40, 50, 60], [70, 80, 90], [100, 110, 120]]}

    5. 将 pylightxl.Database 写入excel 文件

    Pylightxl支持写excel而不需要在机器上安装excel。然而,它也不是没有限制。写入器只支持单元格数据的写入(即:不支持图形、格式化、图像、宏等),仅仅是单元格中的字符串/数字/方程。

    1. import pylightxl as xl
    2. # 读取现有工作表并改变其单元格的值(与上述工作表相同)。
    3. db = xl.readxl(fn='excelfile.xlsx')
    4. # 覆盖现有的数字值
    5. db.ws(ws='Sheet1').index(row=1, col=1)
    6. >>> 10
    7. db.ws(ws='Sheet1').update_index(row=1, col=1, val=100)
    8. db.ws(ws='Sheet1').index(row=1, col=1)
    9. >>> 100
    10. # 写入文本
    11. db.ws(ws='Sheet1').update_index(row=1, col=2, val='twenty')
    12. # 写入方程
    13. db.ws(ws='Sheet1').update_address(address='A3', val='=A1')
    14. # 将db写入本地Excel文件
    15. xl.writexl(db=db, fn='updated.xlsx')

    6. 将 Python 数据写入新的 Excel 文件

    1. import pylightxl as xl
    2. # 以这个列表为例,作为我们的输入数据,我们想把它放在A列中
    3. mydata = [10,20,30,40]
    4. # 创建一个空白数据库
    5. db = xl.Database()
    6. # 在数据库中添加一个空白工作表
    7. db.add_ws(ws="Sheet1")
    8. # 循环将我们的数据添加到工作表中
    9. for row_id, data in enumerate(mydata, start=1)
    10. db.ws(ws="Sheet1").update_index(row=row_id, col=1, val=data)
    11. # 将db写入新的本地Excel文件
    12. xl.writexl(db=db, fn="output.xlsx")

    二、进阶

    待完成部分

    三、其他读写Excel的库

    除了pylightxl,还有其他很多库可以用于读写Excel文件,例如:xlrd,xlwd,OpenPyXl等

    xlrd与xlwt的使用教程_QQVQQ...的博客-CSDN博客

    教程 — openpyxl 3.0.7 文档

    openpyxl使用教程_Cold autumn的博客

    Python 操作 Excel 库 xlrd与xlwt 常用操作详解

    Excel 神器 —— OpenPyXl - 知乎

    Python操作Excel表格的模块xlrd的简单介绍

  • 相关阅读:
    【医学】基于Matlab实现 3-D 内表面轴细化算法构建骨架模型
    Arduino驱动MAX30102心率血氧传感器模块
    python后端相关知识点汇总(十二)
    『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)
    Thread小案例:线程插队
    Unity Bolt 实现UI拖拽功能
    基础课8——知识图谱
    【C语言学习笔记(七)】C语言重定向输入与输出
    spring框架Bean的作用域?对需要保持会话状态的bean应使用prototype作用域?为啥?
    C语言系统化精讲(二):C语言初探
  • 原文地址:https://blog.csdn.net/hfy1237/article/details/128205154