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

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

Function WorkDay()
Dim sDay As String
sDay="工作日"
if WeekDay(Now) = 1 OR WeekDay(Now) = 7 then
        sDay="休息日"
end if
WorkDay=sDay
End Function

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

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

2. 使用数据库编程

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

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

加法 创建新数据库时,此列表出现在 LibreOffice Base 中:在向导结束时,系统会询问您是否在系统中注册数据库(默认情况下 -注册 ):
在 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 访问数据库 - 基本宏

Function SELPRICE(id)
On Error GoTo ErrorHandler
Dim dbContext, oDataSource, db, pstmt, oResult, s
s=""
If Not IsMissing(id) Then
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName("primer")
db=oDataSource.getConnection("","")
sql=buildSelectPrice(id)
if sql<>"" Then
pstmt=db.prepareStatement(sql)
oResult=pstmt.executeQuery()
Do while oResult.Next
If (s<>"") then
s=s + ","
End If
s=s+oResult.getString(1)
Loop

db.Close
db.dispose()
EndIf
Endif
SELPRICE=s
Return
ErrorHandler:
End Function

Function buildSelectPrice(id)
Dim sql
sql=""
If Not IsMissing(id) Then
sql = "SELECT price FROM offers WHERE offer_id= " + id
EndIf
buildSelectPrice=sql
End Function

2.3.在 Calc 工作表中使用宏

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

其中单元格 A2 包含记录 ID(例如,1)。Calc 中的单元格 B2 将显示 LibreOffice Base 数据库中的价格,该数据库已链接到 MySQL 数据库。

执行带有一个输入参数的 SELECT 查询的结果

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

代码:

Function buildSelectOfferPrice(id, status)
Dim sql
sql=""
If Not IsMissing(id) and Not IsMissing(status) Then
sql = "SELECT price FROM offers WHERE offer_id = " + id + " AND display = " + status
EndIf
buildSelectOfferPrice=sql
End Function

Function SELECTACTUALPRICE(id, status)
on error goto label
Dim dbContext, oDataSource, db, pstmt, oResult, s
s=""
If Not IsMissing(id) and Not IsMissing(status) Then
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName("primer")
db=oDataSource.getConnection("","")

sql=buildSelectOfferPrice(id, status)

if sql<>"" Then
pstmt=db.prepareStatement(sql)
oResult=pstmt.executeQuery()
Do while oResult.Next
If (s<>"") then
s=s + ","
End If
s=s+oResult.getString(1)
Loop

db.Close
db.dispose()
EndIf
Endif
SELECTACTUALPRICE=s
label:
End Function

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

调试宏

如有必要,您可以在宏代码中设置断点,然后运行“数据”->“单元格内容”->“重新计算”(F9)。光标将停在断点处。之后,您可以使用 F8(单步执行)或 Shift+F8(单步跳过)逐行执行语句。要查看错误,如果函数包含“on error goto label”这一行,则需要添加注释字符(撇号),然后保存宏(“文件”->“保存”)。之后,按 F9 和 F8。执行语句 dbContext=createUnoService("com.sun.star.sdb.DatabaseContext") 后,可以通过查看 dbContext 对象变量来查看已注册数据库的名称,该变量的 ElementNames 字段会显示数据库名称的字符串值。

如果在执行操作符 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 文件中,而不是存储在基本编辑器的“我的宏和对话框”部分中。



相关出版物