作为数据库访问电子表格的抽象层
cellbase的Python项目详细描述
Cellbase版本0.1.2
作为数据库访问电子表格的抽象层,构建在上面 第openpyxl页。
用法
在类似数据库的环境中读、写或编辑电子表格,例如:
cellbase=Cellbase().load('simple.xlsx')dao=SimpleDAO(cellbase)# Object inherits from DAOentity=Simple(id=1,name='jp')# Object inherits from Entity# Basic database operationsdao.insert(entity)dao.query({'row_idx':entity.row_idx})entity.name='imjp'dao.update(entity)dao.delete({'row_idx':entity.row_idx})# Format cells' font, fill, border, etc...dao.format({'row_idx':entity.row_idx},fill=PatternFill(fill_type="solid",fgColor="00FFFF00"))# Access openpyxl.cell.Cell directlydao.traverse(lambdacell:do_something(cell),{'row_idx':entity.row_idx},select=['id'])cellbase.save()
安装
从pypi安装:
pip install cellbase
供您参考
cellbase遵循一些规则/概念, 不需要知道,但是被他们唤醒是很好的。
cellbase=workbook=数据库
celltable=工作表=表格
dao是从cellbase访问数据的助手
实体负责将数据转换为dict或从dict转换数据
名为“load”的cellbase用于读取文件,而不是当前的“open” 不打开到文件的连接/流,这意味着所做的任何更改 在调用“另存为”之前不会保存或更新
dao&entity的实现是可选的
大多数方法中的“where”参数要求dict的格式如下:
where={'col_name_1',value_1,'col_name_2':value_2}
遍历格式中的“select”参数预期列表格式如下:
select=['col_name_1','col_name_2']
“row_idx”是电子表格中的实际行索引
“row_idx”从2开始,因为第一行由header获取,这意味着:
dao.query({'row_idx',1})# Will raise KeyError
cellbase不期望输入值(dict)由“row_idx”组成,而是由值组成 query()返回的结果肯定包含“row_idx”
cellbase需要在第一行声明变量名。
空变量将导致忽略整列(第3列)。
行并不重要,空行作为第3行仍然有效 划船。
var_1 var_2 (empty) var_3 data data data data (empty) (empty) (empty) (empty) data data (empty) data
开始
cellbase是一个很容易获取的工具,你可以从python开始。 控制台或实现dao&entity以简化脚本中的代码。
fromcellbaseimportCellbase# Without specifying filename, it will save as 'cellbase.xlsx' by defaultcellbase=CellBase()# Register the format of worksheet to deal with(only for new worksheet)# 'Simple' is the worksheet name, while 'id' and 'name' are column namescellbase.register({'Simple':['id','name']})
没有dao&entity:
row_idx=cellbase.insert('Simple',{'id':1,'name':'jp'})values=cellbase.query('Simple',{'row_idx':row_idx})cellbase.update('Simple',{'row_idx':row_idx,'id':1,'name':'imjp'})cellbase.delete('Simple',{'row_idx':row_idx})
使用DAO&Entity:
首先创建dao,
dao=SimpleDAO(cellbase)
然后按照上一个示例所做的操作,
保存表名声明除外&; 从对象访问数据继承实体
entity=Simple(id=1,name='jp')dao.insert(entity)dao.query({'row_idx':entity.row_idx})entity.name='imjp'dao.update(entity)dao.delete({'row_idx':entity.row_idx})
最后,将其保存到文件
cellbase.save()
更多
cellbase加载、保存、另存为、删除、注册
从文件加载
cellbase.load('filename.xlsx')
保存到加载时使用的文件名,否则, 当前工作目录为“cellbase.xlsx”
cellbase.save()
另存为文件,如果改写为false
,将引发文件IsSeriSerorcellbase.save_as('another_filename.xlsx',overwrite=True)
放下工作表
cellbase.drop('worksheet_name')# or drop with DAOdao.drop()
要处理的工作表的注册表结构(仅对新工作表是必需的), 否则,将工作表创建为cellbase时将引发valueerror 不知道要创建的工作表标题和列名。
cellbase.register({'TABLE_NAME_1':['COL_NAME_1','COL_NAME_2']})
dao&entity
示例dao
fromcellbaseimportDAOclassSimpleDAO(DAO):# Optional, just to make life easierTABLE_NAME='Simple'COL_ID='id'COL_NAME='name'defworksheet_name(self):returnSimpleDAO.TABLE_NAMEdefnew_entity(self):returnSimple()# New instance of entity for query to return result
实体
fromcellbaseimportEntityclassSimple(Entity):def__init__(self,id=0,name=""):super().__init__()# Declare row_idxself.id=idself.name=namedeffrom_dict(self,values):super().from_dict(values)# Inherits to handle row_idxself.id=values[SimpleDAO.COL_ID]self.name=values[SimpleDAO.COL_NAME]returnselfdefto_dict(self):values=super().to_dict()# Inherits to handle row_idxvalues[SimpleDAO.COL_ID]=self.idvalues[SimpleDAO.COL_NAME]=self.namereturnvalues
lambda
在使用cellbase之后,你可能会发现 像这样的平等搜索是不够的:
dao.query({'id':1,'name':'imjp'})
例如,如果需要访问名称包含“jp”的所有记录, 您可能会发现lambda很有用:
dao.query({'name':lambdavalue:'jp'invalue})dao.update(entity,{'name':lambdavalue:'jp'invalue})cellbase.query(worksheet_name,{'name':lambdavalue:'jp'invalue})cellbase.update(worksheet_name,data,{'name':lambdavalue:'jp'invalue})# So as traverse & format...
或使用行idx查找
dao.query({'row_idx':lambdarow_idx:3<=row_idx<=9})dao.update(entity,{'row_idx':lambdarow_idx:3<=row_idx<=9})cellbase.query(worksheet_name,{'row_idx':lambdarow_idx:3<=row_idx<=9})cellbase.update(worksheet_name,data,{'row_idx':lambdarow_idx:3<=row_idx<=9})# So as traverse & format...
魔术方法(必须实现dao&entity)
# Magic method only works with row_idxtotal_row_number=len(dao)# __len__entity=dao[row_idx]# __getitem__dao[row_idx]=entity# __setitem__contains=row_idxindao# __contains__deldao[row_idx]# __delitem# Of course it works with lambda/callable tooentity=dao[lambdarow_idx:3<=row_idx<=9]# __getitem__contains=lambdarow_idx:3<=row_idx<=9indao# __contains__deldao[lambdarow_idx:3<=row_idx<=9]# __delitem# Exception# __setitem__ only support update, insertion will raise warningiflambdarow_idx:3<=row_idx<=9indao:dao[lambdarow_idx:3<=row_idx<=9]=entity# updateelse:dao[lambdarow_idx:3<=row_idx<=9]=entity# no effect at all
格式化
除设置值外,还可以设置单元格格式:
dao.format(where,select,fill,font,border...)# or wrap all formats in CellFormatterdao.format(where,select,cell_formatter)
有关详细信息,请参见CellFormatter。
低级访问
低级可能是一个很强的词,但是您可以直接访问 单元格(openpyxl.cell.cell)通过遍历:
dao.traverse(lambdacell:do_something(cell),where,select)
例如,签出Tests
许可证
这个项目是在麻省理工学院的许可下授权的-详细信息请参见LICENSE.md文件