我从使用Excel as a database的组织请求某些合同工作,并希望通过真实数据库对Excel数据进行一些工作。 (是的,我知道,不要介意......)
客户有一张Excel表,他们在内部使用这些表来跟踪某些政府计划。此Excel工作表中的数据曾经通过CSV作为中间格式手动导入SQL数据库,并通过一个小型Web应用程序提供。电子表格或数据库中的更改是手动完成的(由不同的人员完成),并且必须手动保持同步。
新功能的规范包括:
电子表格(实际上,它是工作簿中的几个)实现了与其他机构交互所必需的一些准则,因此在导入之前和之后必须保持结构相同。它包含大量格式化,隐藏列和排序按钮以及不同工作表中单元格之间的大量数据链接。
我不想从头开始重现电子表格以提供导出,也不想在导入之前手动将正确的列提取到CSV中。我正在寻找一种方法来加载Excel,“查询”某些字段,将它们写入数据库,然后从数据库加载数据并仅操作正确单元格的内容。
有没有办法以编程方式与现有电子表格连接,只能读取或更改您需要的位?
答案 0 :(得分:10)
Excel是'COM Capable Application',因此您可以使用COM访问和操作Excel文档中的数据。你没有说你正在使用什么平台 - 但如果它是.NET那么它真的很容易。有关如何开始使用C#的信息,请参阅http://support.microsoft.com/kb/302084。
如果您没有使用.net,那么任何可以与COM组件交互的语言都可以使用。
答案 1 :(得分:4)
VBA使用的相同API可通过外部COM接口使用。有关此主题的quite a few本书。我推荐Steven Roman的O'Reilly one,但你的口味可能会有所不同。
答案 2 :(得分:3)
您没有指定语言,因此如果您与语言无关.Net为您提供了一些非常强大的数据处理类:
打开csv文件:
Imports System.Data.OleDb, 导入Excel = Microsoft.Office.Interop.Excel
Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DataFolder + "\;Extended Properties='text;HDR=Yes'"
Dim conn As New System.Data.OleDb.OleDbConnection(ConnectionString)
conn.Open()
Dim CommandText As String = CommandText = "select * from [" + CSVFileName + "]"
If Filter.Length > 0 Then
CommandText += " WHERE " + Filter
End If
Dim daAsset As New OleDbDataAdapter(CommandText, conn)
Dim dsAsset As New DataSet
daAsset.Fill(dsAsset, "Asset")
在工作簿中打开工作表是非常相似的 - 您指定了工作表名称,然后可以用整个工作表填充DataSet - 然后您可以访问Tables()。DataSet的Rows()以获取每个行和字段,迭代每一行等。
答案 3 :(得分:2)
我们正在通过Apache POI阅读和操作Excel-Data,这在解码Excel文件时并不完整(即公式单元格不完全支持),但我们的客户对我们非常满意。
POI是一个Java库,所以如果你是一个纯粹的Windows商店,可能还有其他更自然的选择,但正如我所说,我们对POI的体验非常好,人们很高兴。此外:我相信已经听说过Excel ODBC驱动程序 - 也许这就是你想要/需要的东西? (对不起,我从未与他们合作过)
答案 4 :(得分:1)
您可能对Excel 2007 Collaboration features感兴趣(就像在网上编辑xls一样)。
答案 5 :(得分:1)
另一种方法是编写一个直接与数据库对话的excel函数,并将结果作为数组返回。
如果您认为这种方法可以正常运行,您可以尝试XLLoop - 这样您就可以轻松地在Java,Python,Ruby,Perl,R,Lisp,Erlang中编写excel函数。