8
6月
2023
如何从 LibreOffice Calc 查询 MySQL 数据库?
17:33

如何从 LibreOffice Calc 查询 MySQL 数据库?

8 6月 2023 17:33

在本文中,我将告诉您如何使用与 MySQL 关联的 LibreOffice Base 查询来使用数据填充 LibreOffice Calc 表格单元格。

前言

正如我之前告诉过你的,在工作中,我大约每月必须在 MS Excel 表和 MySQL 数据库之间进行一次协调。 实现链接(外部)表的中间链接是 LibreOffice Base。 Base与MySQL连接的实现描述 在上一篇文章中,在使用可访问数据库的 Calc 宏之前必须完成其中的_所有_点。

本文的目的- 展示如何从 Calc 查询到 Base 并使用宏填充单元格。 本文专门讨论 LibreOffice Calc 电子表格中的“办公编程”,面向新手程序员。 软件工具内置于 LibreOffice 包中。 假设前两篇文章中提到的附加组件MySQL、Base和Connector都已配置。

从 LibreOffice Calc 访问 MySQL 数据库的程序连接图

舍玛

DBMS MySql <-> mysql ODBC/JDBC 连接器 <-> LibreOffice Base <-> Libreoffice Calc

1. LibreOffice Calc 编程简介

LibreOffice 用户手册位于本地 PC 上的文件夹中
SCalc 文档(文件 main0000.html)

cd /usr/share/libreoffice/help/ru/text/scalc/
xdg-open main0000.html

帮助里建议的方法 插入外部数据的方法,参见 webquery.html 文件

cd /usr/share/libreoffice/help/ru/text/scalc/guide
xdg-open webquery.html

没有编程就不好,因为......它用于处理来自相同 Calc / Excel 文件的平面表,我们对数据库感兴趣 LibreOffice基地。 因此,我转向了 LibreOffice Basic 编程文档

help.libreoffice.org/latest/ru/text/sbasic/shared/main0601.html

要将数据放入单元格中,请编写一个函数,例如:

函数 WorkDay()
暗淡 sDay 作为字符串
sDay=“工作日”
如果工作日(现在)= 1 或 工作日(现在)= 7 那么
sDay="выходной"
结束如果
工作日=sDay
结束函数

菜单项 工具 - 宏 - 管理宏 - 基本- 选择左侧的文件并按右侧的按钮 创建:
选择所有内容并将其删除。 插入文本 - 保存,关闭。 让我们起一个文件名:
1) 创建宏1
2) 创建宏2
3) 创建宏3
4) 创建宏4

在工作表的单元格中,我们用方括号写入函数的名称(可以在其中传递输入参数),
在函数名称之前我们放置等号(“=”)
表1
示例:
=工作日()
并按 Enter 键。 结果:
表2

2. 使用数据库编程

2.1 查看系统中注册的LibreOffice Base数据库名称

可以在 LibreOffice 包中的任何程序的菜单中查看已注册的数据库:
*服务 - 选项 ->*
LibreOffice 基础 -> 数据库**
已注册

加法 创建新数据库时,此列表出现在 LibreOffice Base 中:在向导结束时,系统会询问您是否在系统中注册数据库(默认情况下 -注册 ):
注册

数据库示例:

路径/home/user/.config/libreoffice/4/user/database/biblio.odb
名称 参考书目

就我而言,我创建了一个同名“primer”的 Calc 数据库

路径/home/user/primer.odb
名称 底漆

! !!可以在此处用俄语指定数据库名称。 此外,LibreOffice Base 的数据库名称可能与 ODBC/JDBC 连接器的 MySQL 数据库名称不同。

! LibreOffice Base 数据库现已在系统中注册。 您可以从 LibreOffice Calc 电子表格中查询它。

2.2.使用 LibreOffice Calc 访问数据库 - 基本宏

函数 SELPRICE(id)
发生错误时转到 ErrorHandler
暗淡 dbContext、oDataSource、db、pstmt、oResult、s
s=“”
如果不是 IsMissing(id) 那么
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName("primer")
db=oDataSource.getConnection("","")
sql=buildSelectPrice(id)
如果 sql<>"" 那么
pstmt=db.prepareStatement(sql)
oResult=pstmt.executeQuery()
在 oResult.Next 时执行
如果 (s<>"") 那么
s=s + “,”
结束如果
s=s+oResult.getString(1)
循环

数据库关闭
db.dispose()
结束如果
恩迪夫
SELPRICE=s
返回
错误处理程序:
结束功能

函数 buildSelectPrice(id)
昏暗的sql
sql=“”
如果不是 IsMissing(id) 那么
sql = "从优惠中选择价格 WHERE Offer_id= " + id
结束如果
buildSelectPrice=sql
结束函数

2.3.在 Calc 工作表中使用宏

在单元格 B2 中我们编写一个宏调用:
=SELPRICE(A2)

其中 A1 包含条目 ID(例如 1)。 来自连接到 MySQL 数据库的 LibreOffice Base 数据库的价格将显示在 Calc 单元格中。
使用一个输入参数执行 SELECT 查询时的结果

2.4 在 SELECT 查询中使用多个字段

代码:

函数 buildSelectOfferPrice(id, status)
昏暗的sql
sql=“”
如果不是 IsMissing(id) 且不是 IsMissing(status) 那么
sql = "选择 价格优惠 哪里 报价 ID=“+id+”并且 显示=“+状态
结束如果
buildSelectOfferPrice=sql
结束功能

函数 SELECTACTUALPRICE(id, 状态)
出错时转到标签
暗淡 dbContext、oDataSource、db、pstmt、oResult、s
s=“”
如果不是 IsMissing(id) 且不是 IsMissing(status) 那么
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName("primer")
db=oDataSource.getConnection("","")

sql=buildSelectOfferPrice(id, 状态)

如果 sql<>"" 那么
pstmt=db.prepareStatement(sql)
oResult=pstmt.executeQuery()
在 oResult.Next 时执行
如果 (s<>"") 那么
s=s + “,”
结束如果
s=s+oResult.getString(1)
循环

数据库关闭
db.dispose()
结束如果
恩迪夫
选择实际价格=s
标签:
结束函数

结果如下所示(第一列功能参数显示=1,第二列显示=0):
执行带有两个输入参数的 SELECT 查询时的结果

调试宏

Есл如果需要,您可以在宏代码中设置断点并运行 数据 - 单元格内容 - 重新计算 (F9)。 光标将停在停止点处。 然后,您可以使用按键逐行、逐步执行语句 F8- “介入”或 Shift+F8——“一步一步走弯路”。 要查看错误,您需要设置注释符号 - 撇号(如果函数中有一行) '出错时转到标签 并保存宏文件 - 保存。 然后按 F9 和 F8。 执行该语句后可以看到注册的数据库名称 dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")- 通过查看对象变量 数据库上下文,在该领域 元素名称 数据库名称的字符串值是可见的。

如果在执行操作符 db=oDataSource.getConnection("","") 时,抛出异常“[unixODBC][DriverManager]Data source name not find and no default driver specified at”,则当我们正在访问的 *.ODB 数据库文件是从其他用户传输过来时,就会发生这种情况。 它在服务通信中的连接配置不正确。 删除 Libre Office Base (*.ODB) 文件并创建新的 Base DB 文件会更容易。 您可以在其中正确配置与 ODBC/JDBC 连接器的连接以及本计算机上的数据源的名称:

在 LibreOffice Base 中注册新数据库,建立与外部 ODBC 源的连接

  1. 启动 LibreOffice Base
  2. 在“连接到现有数据库”向导中
  3. ODBC
  4. 下一页
  5. ODBC 源名称 - 浏览 - 确定
  6. 下一页
  7. 用户名为空。 连接测试。
  8. 完成
  9. 指示数据库的名称和位置
    10.保存

! 文章对此进行了详细讨论。如何将 LibreOffice Base 与 MySQL 链接

现在连接正常了 - 外部数据库表在 LibreOffice Base 窗口中可见,并且宏从 Calc 运行,没有错误。

在Base save中选择“文件”-“另存为”,将Base*.ODB文件以明确的名称保存在用户的主目录中。 在 Calc 中 - 因此,我们将带有 Calc 宏的电子表格保存到 *.ODS 文件中。

帮助(编程用户指南)

LibreOffice Basic 的文档位于磁盘上

cd /usr/share/libreoffice/help/ru/text/sbasic/shared/
xdg-open main0601.html

Internet 上的 LibreOffice Basic 帮助,包含连接到数据库的示例:
*基本指南

UNO 对象帮助:

cd /usr/share/libreoffice/help/ru/text/sbasic/shared/
xdg-open uno_objects.html

有关访问 LibreOffice 中的数据库的帮助

LibreOffice 数据源帮助:

结论

从 LibreOffice Calc 到 LibreOffice Base 数据库,然后到 MySQL 的查询工作。

其他链接、参考资料:

有关 dbContext=createUnoService("com.sun.star.sdb.DatabaseContext") 对象的指导,请参阅以下文章:


添加。 关于存储宏的注意事项

宏可以存储在 Calc 电子表格文件本身 (*.ODS) 中或用户的共享宏存储中。 我推荐第一种方法,因为...此类文件可以在 PC 驱动器之间或用户之间传输,而不会丢失宏。 第二种方法是将宏存储在存储器中,如果 PC 的硬盘出现故障,宏就会丢失(因为方法 2 中 ODS 文件不包含宏,所以这是一个问题)。 因此,最好将宏存储在 ODS 文件中,而不是存储在基本编辑器的“我的宏和对话框”部分中。



相关出版物