目录
2.5. 将 pylightxl.Database 写为 excel 文件
1. 安装
安装pylightxl有几种方法。其中最简单的下载方式就是通过pip。但是在某些环境下可能不允许从外部下载内容,因此我们可以简单地复制粘贴所需要的源代码来解决这一问题。
1.1. 通过pypi安装
通过Python模块安装器下载官方最新版:
pip install pylightxl
1.2. 通过GitHub安装
通过GitHub下载最新的主分支版本:
pip install git+https://github.com/PydPiper/pylightxl.git
1.3. 使用Git克隆
通过Git克隆下载:
git clone https://github.com/PydPiper/pylightxl.git
1.4. 下载源文件
从GitHub下载:https://github.com/PydPiper/pylightxl/archive/master.zip
1.5. 复制源文件
创建整个库的副本,用户可以将其直接复制到项目、虚拟环境或 python/lib/site-packages 文件夹中以供一般使用。
1) 创建pylightxl文件夹
2) 在pylightxl文件夹内创建如下文件:
pylightxl
1- __init__.py
2- pylightxl.py
3) 将对应的源代码写入文件:
3.1)文件1:__init__.py
3.2)文件2:pylightxl.py
2. 快速入门指南
2.1. 读写CSV文件
读取有内容的csv文件:
import pylightxl as xl
# 将 CSV 的分隔符设置为您选择的值
# 设置默认工作表以将读取的 CSV 数据写入
db = xl.readcsv(fn='input.csv', delimiter='/', ws='sh2')
# 然后对其进行修改,
# 现在将其写回为 csv;或将其作为 excel 文件修改,请参阅 xl.writexl()
xl.writecsv(db=db, fn='new.csv', ws=('sh2'), delimiter=',')
2.2. 读取Excel文件
import pylightxl as xl
# readxl返回一个包含所有工作表及数据的pylightxl数据库
db = xl.readxl(fn='folder1/folder2/excelfile.xlsx')
# pylightxl也支持pathlib
my_pathlib = pathlib.Path('folder1/folder2/excelfile.xlsx')
db = xl.readxl(my_pathlib)
# pylightxl还支持 django 用户的类文件对象
with open('excelfile.xlsx', 'rb') as f:
db = xl.readxl(f)
# 只读选择的工作表名称
db = xl.readxl(fn='folder1/folder2/excelfile.xlsx', ws=('Sheet1','Sheet3'))
# 返回所有工作表名称
db.ws_names
>>> ['Sheet1', 'Sheet3']
2.3. 访问工作表和单元格数据
下面的例子假定 excelfile.xlsx 包含了一个名为 Sheet1 的工作表且该工作表中有下列单元格内容:
A | B | C | |
1 | 10 | 20 | |
2 | 30 | 40 |
2.3.1. 通过单元格地址访问
db.ws(ws='Sheet1').address(address='A1')
>>> 10
# 如果有公式,访问单元格内的公式
db.ws(ws='Sheet1').address(address='A1', output='f')
>>> ''
# 如果有批注,访问单元格的批注
db.ws(ws='Sheet1').address(address='A1', output='c')
>>> '这是单元格A1的批注!'
# 标记空白单元格会返回一个空字符串
db.ws(ws='Sheet1').address(address='A100')
>>> ''
# 但是可以覆写每个工作表中的默认空值
db.ws(ws='Sheet1').set_emptycell(val=0)
db.ws(ws='Sheet1').address(address='A100')
>>> 0
2.3.2. 通过单元格索引访问
db.ws(ws='Sheet1').index(row=1, col=2)
>>> 20
# 如果有公式,访问单元格内的公式
db.ws(ws='Sheet1').index(row=1, col=2, output='f')
>>> '=A1+10'
# 标记空白单元格会返回一个空字符串
db.ws(ws='Sheet1').index(row=100, col=1)
>>> ''
# 但是可以覆写每个工作表中的默认空值
db.ws(ws='Sheet1').set_emptycell(val=0)
db.ws(ws='Sheet1').index(row=100, col=1)
>>> 0
2.3.3. 通过单元格区间访问
db.ws(ws='Sheet1').range(address='A1')
>>> 10
db.ws(ws='Sheet1').range(address='A1:C2')
>>> [[10, 20, ''], ['', 30, 40]]
# 获取区间中单元格内的公式
db.ws(ws='Sheet1').range(address='A1:B1', output='f')
>>> [['=10', '=A1+10']]
2.3.4. 获取整行或整列
db.ws(ws='Sheet1').row(row=1)
>>> [10,20,'']
db.ws(ws='Sheet1').col(col=1)
>>> [10,'']
2.3.5. 遍历行或列
for row in db.ws(ws='Sheet1').rows:
print(row)
>>> [10,20,'']
>>> ['',30,40]
for col in db.ws(ws='Sheet1').cols:
print(col)
>>> [10,'']
>>> [20,30]
>>> ['',40]
2.3.6. 更新单元格的值
db.ws(ws='Sheet1').address(address='A1')
>>> 10
db.ws(ws='Sheet1').update_address(address='A1', val=100)
db.ws(ws='Sheet1').address(address='A1')
>>> 100
db.ws(ws='Sheet1').update_index(row=1, col=1, val=10)
db.ws(ws='Sheet1').index(row=1, col=1)
>>> 10
2.3.7. 更新单元格的公式
与更新单元格值相同,但条目必须以等号“=”开头
注意:
更新单元格公式会清除先前读取的单元格值。在打开Excel文件之前,公式不会计算其单元格值。
db.ws(ws='Sheet1').update_address(address='A1', val='=B1+100')
db.ws(ws='Sheet1').update_index(row=1, col=1, val='=B1+100')
2.3.8. 获取命名范围
# 定义一个命名范围
db.add_nr(name='Table1', ws='Sheet1', address='A1:B2')
# 查看所有存在的命名范围
db.nr_names
>>> {'Table1': 'Sheet1!A1:B2'}
# 获得命名范围的内容
db.nr(name='Table1')
>>> [[10, 20], ['', 30]]
# 删除一个命名范围
db.remove_nr(name='Table1')
2.3.9. 基于键值获取行或列
注意:需要注意键的数据类型
# 假定我们想要返回一列 that has a cell value = 20 in row=1
db.ws(ws='Sheet1').keycol(key=20, keyindex=1)
>>> [20,30]
# 我们也可以指定一个自定义的keyindex(不仅仅是row=1),比如我们现在根据row=2来匹配的
db.ws(ws='Sheet1').keycol(key=30, keyindex=2)
>>> [20,30]
# 对 keyindex=1 的 keyrow 进行类似操作(在 col=1 中查找匹配项)
db.ws(ws='Sheet1').keyrow(key='', keyindex=1)
>>> ['',30,40]
2.4. 读取半结构化数据
- 请注意,ssd 函数将任意关键字参数作为 KEYROWS/KEYCOLS 标志
- 阅读多个表格的方式与阅读一本书的方式相同。从左到右,然后向下
import pylightxl
db = pylightxl.readxl(fn='Book1.xlsx')
# 请求输出一个半结构化数据(ssd)
ssd = db.ws(ws='Sheet1').ssd(keycols="KEYCOLS", keyrows="KEYROWS")
ssd[0]
>>> {'keyrows': ['r1', 'r2', 'r3'], 'keycols': ['c1', 'c2', 'c3'], 'data': [[1, 2, 3], [4, '', 6], [7, 8, 9]]}
ssd[1]
>>> {'keyrows': ['rr1', 'rr2', 'rr3', 'rr4'], 'keycols': ['cc1', 'cc2', 'cc3'], 'data': [[10, 20, 30], [40, 50, 60], [70, 80, 90], [100, 110, 120]]}
2.5. 将 pylightxl.Database 写为 excel 文件
Pylightxl支持在未安装Excel的机器上写Excel文件。但是它仍会受到限制。操作者只能进行单元格数据的写入(例如:不支持图表、格式、图片、宏等),只能在单元格中写入字符串、数字、公式。
需要注意的是,只有在用户使用Excel打开Excel工作表后,用户键入的公式才会进行计算。
import pylightxl as xl
# 读取现有工作表并更改其单元格的值(与上述相同的工作表)
db = xl.readxl(fn='excelfile.xlsx')
# 覆写已存在的单元格数值
db.ws(ws='Sheet1').index(row=1, col=1)
>>> 10
db.ws(ws='Sheet1').update_index(row=1, col=1, val=100)
db.ws(ws='Sheet1').index(row=1, col=1)
>>> 100
# 写入文本
db.ws(ws='Sheet1').update_index(row=1, col=2, val='twenty')
# 写入公式
db.ws(ws='Sheet1').update_address(address='A3', val='=A1')
xl.writexl(db=db, fn='updated.xlsx')
2.6. 用Python的数据写一份全新的Excel文件
对于不是来自现有 excel 电子表格的新 python 数据。
import pylightxl as xl
# 以此列表为例作为我们想要放入列A的输入数据
mydata = [10,20,30,40]
# 创建空的db
db = xl.Database()
# 向db中添加一份空白工作表
db.add_ws(ws="Sheet1")
# 循环地将我们的数据写入工作表
for row_id, data in enumerate(mydata, start=1)
db.ws(ws="Sheet1").update_index(row=row_id, col=1, val=data)
# 输出db
xl.writexl(db=db, fn="output.xlsx")
(未完待续)