我正在尝试从MS Excel工作表中提取特定单元格中的数据。
Select [A1] from [Sheet1$]
不起作用。
这是我的连接字符串,如果它来自任何帮助。
Provider=Microsoft.ACE.OLEDB.12.0;
User ID=Admin;Data Source=c:\clients.xlsx;
Mode=Share Deny None;
Extended Properties="Excel 12.0 Xml;
HDR=yes";
Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";
Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=37;
Jet OLEDB:Database Locking Mode=0;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don''t Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False;
Jet OLEDB:Support Complex Data=False';
答案 0 :(得分:4)
您已经说过数据有标题(在连接字符串中使用HDR=YES;
),因此您需要使用该标题行中的列名。例如,如果你有一张如下表:
A B
1 CODE DESCRIPTION
2 100 This is an item description
3 200 This is another item
您的SELECT
声明
SELECT Code, Description FROM [Sheet1$] WHERE [Code] = 100
上面的查询将返回
Code Description
100 This is an item description
如果您需要结果列中的特定单元格,则可以在查询后移至该单元格:
ADOQuery1.MoveBy(25); // Move to row 25 of the results
DescriptStr := ADOQuery1.FieldByName('Description').Value;
请注意,使用ADO可能不是访问单个单元格的最佳方式。例如,自动化将更容易:
// You'll need to add ComObj to your uses clause for CreateOleObject
procedure TForm2.Button2Click(Sender: TObject);
var
XLS: Variant;
Range: Variant;
Description: String;
begin
XLS := CreateOleObject('Excel.Application');
try
XLS.WorkBooks.Open('C:\ExcelDocs\MyFile.xls');
// Retrieve the cell
Range := XLS.ActiveWorkBook.WorkSheets[1].Range['B2'];
// Read its content
Description := Range.Value;
ShowMessage(Description); // Displays 'This is an item description'
finally
Range := null; // Release reference
XLS.Quit; // Close Excel application
XLS := null; // Release reference
end;
end;
答案 1 :(得分:4)
您确定ADO是获取特定细胞价值的最佳方式吗? ADO处理exql电子表格,如sql表格,你的问题类似于如何从sql server table'获取记录#5。
最好尝试OLE自动化。在那里,您可以轻松地处理单个细胞或一系列细胞。 Here是微软的一个例子。
答案 2 :(得分:2)
如果你有标题,你选择标题的名称,如果你没有,第一列是F1,然后是F2,依此类推。您可以使用SELECT * ...
进行试验,然后查找字段名称。