我正在尝试使用 TAdoConnection 组件从 Delphi 7 连接到 Excel 表。 问题是当我选择 Microsoft.Jet.OLEDB.4.0, Extended Properties="Excel 8.0;"时,我有时会收到错误,
that external table is not in the expected format.
当我选择: 提供程序=Microsoft.ACE.OLEDB.12.0;扩展属性=Excel 12.0; 然后一些用户收到以下错误:
"Provider cannot be found. It may not be properly installed".
有办法解决我的问题吗?
最佳答案
自从我研究这个问题以来已经太久了,记不起细节了,但这里是我们使用 Excel 所做的示例。希望这有帮助...
type
TConvertExcel = class(TAgCustomPlugin)
ADOConnection1: TADOConnection;
procedure FormCreate(Sender: TObject);
private
FSheetName: string;
FExcelVersion: Currency;
procedure ConnectToExcel;
function ExcelSupported: Boolean;
function GetExcelVersion: Currency;
end;
var
ConvertExcel: TConvertExcel;
implementation
uses ...
{$R *.dfm}
{
TConvertExcel.FormCreate
---------------------------------------------------------------------------
}
procedure TConvertExcel.FormCreate(Sender: TObject);
begin
FExcelVersion := GetExcelVersion;
if ExcelSupported = False then
begin
grpConvertExcel.Visible := False;
if FExcelVersion = 0 then
lblNoExcel.Caption := 'Microsoft Excel Not Installed!'
else
lblNoExcel.Caption := 'Microsoft Excel Version Not Supported!';
lblNoExcel.Caption := lblNoExcel.Caption + AsciiCRLF + AsciiCRLF +
'Microsoft Excel 2003 or 2007 must be installed before an excel file can be converted.';
lblNoExcel.Visible := True;
exit;
end;
end;
{
TConvertExcel.GetExcelVersion
---------------------------------------------------------------------------
}
function TConvertExcel.GetExcelVersion: Currency;
var
ClassID: TCLSID;
strOLEObject: string;
Excel: OleVariant;
begin
result := 0;
strOLEObject := 'Excel.Application';
if (CLSIDFromProgID(PWideChar(WideString(strOLEObject)), ClassID) = S_OK) then
begin
Excel := CreateOleObject(strOLEObject);
// qqqxxx - Should we be casting this differently?
result := Excel.Version;
end;
end;
{
TConvertExcel.ExcelSupported
---------------------------------------------------------------------------
}
function TConvertExcel.ExcelSupported: Boolean;
begin
result := False;
if (FExcelVersion = 11.0) or // Excel 2003
(FExcelVersion = 12.0) then // Excel 2007
result := True;
end;
{
TExcelConverterPreview.ConnectToExcel
---------------------------------------------------------------------------
}
procedure TConvertExcel.ConnectToExcel;
var
strConn: widestring;
SheetNameList: TStringList;
begin
/*
when connecting to Excel "database",
extended properties are used to set the Excel file version.
For an Excel95 workbook this value is "Excel 5.0" (without the quotes),
for versions Excel 97, Excel 2000, Excel 2002 or ExcelXP the value is "Excel 8.0".
IMEX=1;" tells the driver to always read the registry at
Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/ImportMixedTypes.
If ImportMixedTypes=Text then intermixed types will always be cast to Text.
If ImportMixedTypes=Majority Type then intermixed types will result in Null values.
Luckily Text seems to be the default.
*/
SheetNameList := nil;
if FExcelVersion = 11.0 then
strConn :='Provider=Microsoft.Jet.OLEDB.4.0;' +
'Data Source="' + txtInputFile.Text + '";' +
'Extended Properties="Excel 8.0;HDR=No;IMEX=1"'
else if FExcelVersion = 12.0 then
strConn := 'Provider=Microsoft.ACE.OLEDB.12.0;' +
'Data Source="' + txtInputFile.Text + '";' +
'Extended Properties="Excel 12.0 Xml;HDR=No;IMEX=1"'
else
raise (Exception.Create(
'The Excel Version "' + CurrToStr(FExcelVersion) +
'" is not supported by the Excel Conversion.'));
AdoConnection1.Connected := False;
AdoConnection1.ConnectionString := strConn;
try
SheetNameList := TStringList.Create();
try
AdoConnection1.Open;
ADOConnection1.GetTableNames(SheetNameList, False);
FSheetName := SheetNameList[0];
except
ShowMessage('Unable to connect to Excel!' + AsciiCRLF +
'Make sure the Excel file ' + txtInputFile.Text + ' exists with '+
'sheet name ' + FSheetName + '.');
raise;
end;
finally
FreeAndNil(SheetNameList);
end;
end;
end.
关于delphi - 尝试访问 Delphi 7 中的 Excel 表时的提供程序选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310199/