Skip to main content

Excel 文件的小型 SQL 引擎,基于 Openpyxl

项目描述

pyxl-sql:一个用于 excel 的小型 SQL 引擎

pyxl-sql 是一个小型的 SQL 实现,用于 Excel 工作簿。

  • 基于 Openpyxl for Excel 文件格式的读/写
  • 适用于遵循具有唯一列标题的“表格”格式的 Excel 工作簿
  • SQL 查询写在“Pyxl SQL”表中
  • 使用 python 表达式
  • 使用 Excel 公式,带有列名
  • 通常用于例行地将多个 Excel 文件中的信息合并/连接到一个新文件中。
  • 支持 SELECT INTO、UPDATE、FROM、AS、

pyxl-sql 可以用作命令行工具。在这种情况下,它会在目录中查找 Excel 文件并执行在“Pyxl SQL”表上找到的命令。命令行选项允许更改行为。

因此,命令行工具的执行可以通过 Excel 宏自动执行,例如附加到“按钮”

pyxl-sql 也可以作为python库使用

pyxl-sql 是带有 tox 和 cov 的测试。查看源代码树中的“测试”目录

pyxl-sql 已记录在案。查看源代码树中的“doc”目录

与标准 SQL 的区别:限制和补充

  • SQL 语法不管理中间(虚拟)表,因此没有(还)命令的子命令(例如 SELECT INTO 应用于 SELECT)
  • 仅管理一部分 SQL 命令
  • 列名可以包含空格,并在用于表达式或公式时包含在 {} 中
  • 默认情况下,表格(即 Excel 工作表)按照它们在命令中的出现编号,从 0 开始,因此语法 @1{FIELD NAME} 表示表格/工作表编号 1 中的“FIELD NAME”,即别名(“ AS") 是自动创建的
  • SET 子句用于指定在 SELECT 命令(或等效命令)中创建的字段,其方式类似于 UPDATE 命令中的 SET 子句
  • 在 SET 子句中,正确的成员不限于字段名称,它可以是任意 PYTHON 表达式,以 ':=' 开头,例如:

SET Priority = ':= "Major" if @0{Range} in ("High", "Medium") and #0{Potential 2021} > 100000 else "Minor"'

  • 也接受以“=”开头的 Excel 公式,例如:

SET Mean = '=SUM(M2:Q2)/SUM(R2:V2)'

  • SET 语法以 WHEN 子句递增,类似于 WHERE,但对每个 SET 子句单独执行。例如,以下子句将根据 KPI 行的值在“Basic 2019”或“Medium 2019”列中为列 2019 分配值,从而将行分段转换为行分段。

SET Basic 2019 = 2019 WHEN := @1{KPI} == "Basic"

SET Medium 2019 = 2019 WHEN := @1{KPI} == "Medium"

  • AGGREGATES 子句允许将 python 表达式作为 MAX、MIN 等的概括...
  • IMPORT 命令允许导入 python 模块
  • FORMAT 命令为列指定 Excel 格式
  • COMMENTS 命令引入注释

pyxl-sql 文件格式

pyxl-sql 假设:

  • OpenPyxl 可以读取 excel 文件
  • 表格被格式化为“表格”,即第一行(默认)是列标题
  • 列标题都不同
  • 一个文件包含将要执行的 pyxl-sql 命令和子句
  • 关键字大写

在空工作表的情况下(由 pyxlsql 使用“SELECT INTO”完成),标题后的第一行可能包含“示例”,其中可以包含将为每一行复制的格式或公式。此示例行将被“SELECT INTO”删除参见“基本”示例

pyxl-sql 命令

pyxl-sql 命令和子句存储在一个特殊的工作表中(默认情况下为“Pyxl SQL”)命令存储在一行上命令由下一行后面的子句完成

命令分为几列:

  • COMMAND:保存命令名称,例如“LEFT JOIN”,或关联子句的名称,例如“WHERE”
  • 目标:保存目标工作表的名称(或列在 CLAUSES 的情况下)
  • KEY:保存完成命令定义的关键字。例如“LEFT JOIN”总是由“FROM”完成
  • 源:保存将分配给目标中每个元素的值。根据命令或子句,“源”可以是字段名称、Excel 公式、Python 表达式......

对于某些条款,在同一行上的第二组(条件、目标测试、比较、源测试)完成了定义

其余列用于 COMMENTS,可以是任意单元格,不进行解析

表描述符

工作表由它们的名称描述。例如

  • 'USA commands':用于正在执行的文件中的工作表(即包含'Pyxl SQL'工作表)
  • 'Northwind.xlsx[Orders Details]':用于不同 Excel 文件中的工作表

字段描述符

字段可以用以下语法表示:

  • 仅“字段名称”,如果没有歧义
  • '(@|#)N{field name}',如果有歧义。N是张数
  • '(@|#)alias{field name} alias 是工作表的别名

在最后两个示例中:

  • @ 表示一个字符串
  • # 表示一个数字

这种类型指示简化了 n 个空单元格的管理,
因为 excel 在数字上下文中将空视为 0,在字符串上下文中将 "" 视为空,而 Python 将其视为无。因此“类型”指示允许将 None 转换为 0 或“”,这简化了表达式

例子

示例取自https://www.w3schools.com/sql/default.asp 并使用著名的 Northwind 示例数据库(V1 和 V2)

测试和示例

使用 tox 和 cov 进行测试。要运行测试,只需在根目录中运行 'tox' (venv) PyxlSQL> tox

有关更多详细信息,请参阅源代码中的 tests/ 目录。

当前覆盖率为93%,大部分未覆盖的代码是防御性的

pyxl-sql 作为工具

pyxl-sql 也是一个命令行工具,带有命令行选项。了解更多信息:

pyxlsql.py --help

文档

使用 Sphinx https://www.sphinx-doc.org/构建文档

文档在https://fabien_battini.gitlab.io/pyxlsql/html/中生成

gitlab 存储库:https ://gitlab.com/fabien_battini/pyxlsql

领英:https ://www.linkedin.com/in/fabien-battini-supelec/

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

open_pyxl_sql-0.11.0.tar.gz (32.0 kB 查看哈希)

已上传 source

内置分布

open_pyxl_sql-0.11.0-py3-none-any.whl (39.1 kB 查看哈希

已上传 py3