作为数据库访问电子表格的抽象层

cellbase的Python项目详细描述


Build StatusBuild Status

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_1var_2(empty)var_3
    datadatadatadata
    (empty)(empty)(empty)(empty)
    datadata(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

,将引发文件IsSeriSeror
cellbase.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文件

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何向第二个组合框模型项添加数组值从第一个组合框所选项获取数组名称?   使用Java与WebSphere的SSL握手错误   eclipse线程“main”Java中的第一个Java程序异常。lang.NoClassDefFoundError   java将Javafx应用作为Web应用移植的最佳方式   IDE的java右JVM文件夹   java如何在基本适配器中停止文本到语音   java If block使用substring和equals方法以假值执行   在本例中,如何在java中返回多个值?   java第二个主类在maven构建期间覆盖第一个主类   如何在java中设置运行时ArrayList的泛型类型?   java从主机读取文件