4

我正在开发一个需要数据库后端的 excel 应用程序。我的偏好是使用 SQLite 3 并使最终用户尽可能无缝和可移植。

最近我了解到 Excel 2007 文件只是一个带有 xlsm 扩展名的 zip 存档。我的问题是,我可以将我的后端 SQLite 3 数据库存储在 Zip 存档中并使用 ODBC 与数据库进行交互。如果是这样,任何人都可以向我指出一些背景信息、文章和实现这一目标的指导。这种方法是否有任何缺点或我应该知道的更好的选择。

感谢您的输入。

4

4 回答 4

4

一些笔记。到目前为止,没有人抱怨文件打不开。请注意,在运行 ADO 代码之前保存 Excel 文件。

非常隐蔽:

ThisWorkbook.Worksheets("Courses").Visible = xlVeryHidden
ThisWorkbook.Worksheets("System").Visible = xlVeryHidden

一段代码:

    Const gCN = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="

<...>

Set rs = CreateObject("ADODB.Recordset")
Set cn = CreateObject("ADODB.Connection")
Set fs = CreateObject("Scripting.FileSystemObject")

scn = gCN & ThisWorkbook.FullName _
& ";Extended Properties=""Excel 8.0;HDR=Yes;"";"

cn.Open scn

''If they do not have an ID, they do not exist.

sSQL = "SELECT ID,FirstName,LastName, " _
& "CourseName,AdditionalText,Format(ExpiryDate,'dd/mm/yyyy') As ExpiryDate " _
& "FROM [Applicants$] WHERE DateCancelled Is Null AND ID Is Not Null " _
& "AND (FirstName Is Null OR LastName Is Null Or CourseName Is Null " _
& "Or ExpiryDate Is Null) " & sWhere

rs.Open sSQL, cn

参考:

Excel ADO
连接字符串

Jet 可用的大多数方法都可以与 Excel 一起使用

基础 Microsoft Jet SQL for Access 2000
中级 Microsoft Jet SQL for Access 2000
高级 Microsoft Jet SQL for Access 2000

编辑重新评论

我没有发现泄漏特别严重,但我没有运行很多迭代,这是一台相当不错的机器。

下面的代码使用 DAO,它不会导致内存泄漏。

'Reference: Microsoft Office 12.0 Access Database Engine Object Library
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sDb As String
Dim sSQL As String

sDb = ActiveWorkbook.FullName

Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(sDb, False, True, "Excel 8.0;HDR=Yes;")

sSQL = "SELECT * FROM [Sheet1$];"
Set rs = db.OpenRecordset(sSQL)

Do While Not rs.EOF
    For i = 0 To rs.Fields.Count - 1
        Debug.Print rs.Fields(i)
    Next

    rs.MoveNext
Loop

rs.Close
db.Close
ws.Close

 'Release objects from memory.
Set rs = Nothing
Set db = Nothing
Set ws = Nothing

致谢:http ://www.ozgrid.com/forum/showthread.php?t=37398

于 2012-11-02T13:44:35.903 回答
2

这是一个替代方案。

1) 在打开时(VBA 中的事件)从 Excel .xlsm、sqlite 和 dbFile 中解压缩。

2)处理你......

3)在保存(VBA 中的事件)书时,然后在 Excel .xlsm 中附加 Excel .xlsm、sqlite、dbFile。

于 2013-07-05T21:06:53.923 回答
1

Excel 每次保存文件时都会重写文件,因此您自己添加的文件将被删除。此外,没有 SQLite 驱动程序可以访问 zip 存档中的数据库文件。

当您的应用程序检测到数据库文件丢失时,您必须将数据库文件与 Excel 文件一起提供,或者使用 SQL 命令列表重新创建数据库。
这仍然需要在用户的机器上安装一些 SQLite (ODBC) 驱动程序。

如 Remou 所述,将数据存储在 Excel 文件中的最无缝和可移植的方式是将其存储在 Excel 工作表中。但是,ADO 驱动程序可能会拒绝打开已经在 Excel 中打开的文件,因此您必须使用 Excel 函数来访问数据。

于 2012-10-31T10:03:22.927 回答
0

尝试使用http://code.google.com/p/pyinex/ 这将 Python 解释器嵌入 Excel

于 2012-11-06T09:52:52.800 回答