我正在开发一个需要数据库后端的 excel 应用程序。我的偏好是使用 SQLite 3 并使最终用户尽可能无缝和可移植。
最近我了解到 Excel 2007 文件只是一个带有 xlsm 扩展名的 zip 存档。我的问题是,我可以将我的后端 SQLite 3 数据库存储在 Zip 存档中并使用 ODBC 与数据库进行交互。如果是这样,任何人都可以向我指出一些背景信息、文章和实现这一目标的指导。这种方法是否有任何缺点或我应该知道的更好的选择。
感谢您的输入。
一些笔记。到目前为止,没有人抱怨文件打不开。请注意,在运行 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
参考:
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
这是一个替代方案。
1) 在打开时(VBA 中的事件)从 Excel .xlsm、sqlite 和 dbFile 中解压缩。
2)处理你......
3)在保存(VBA 中的事件)书时,然后在 Excel .xlsm 中附加 Excel .xlsm、sqlite、dbFile。
Excel 每次保存文件时都会重写文件,因此您自己添加的文件将被删除。此外,没有 SQLite 驱动程序可以访问 zip 存档中的数据库文件。
当您的应用程序检测到数据库文件丢失时,您必须将数据库文件与 Excel 文件一起提供,或者使用 SQL 命令列表重新创建数据库。
这仍然需要在用户的机器上安装一些 SQLite (ODBC) 驱动程序。
如 Remou 所述,将数据存储在 Excel 文件中的最无缝和可移植的方式是将其存储在 Excel 工作表中。但是,ADO 驱动程序可能会拒绝打开已经在 Excel 中打开的文件,因此您必须使用 Excel 函数来访问数据。
尝试使用http://code.google.com/p/pyinex/ 这将 Python 解释器嵌入 Excel