当试图访问Delphi 7中的Excel表时提供者select

我正尝试使用TAdoConnection组件连接到Delphi 7的Excel表格。 问题是当我selectMicrosoft.Jet.OLEDB.4.0,Extended Properties =“Excel 8.0;”时,我有时会收到错误,

该外部表格不是预期的格式。

当我select:提供程序= Microsoft.ACE.OLEDB.12.0;扩展属性= Excel 12.0; 那么一些用户会收到以下错误:

“找不到提供程序,可能安装不正确”。

有没有办法解决我的问题?

自从我研究这个以记住细节之后已经太长了,但这里是我们用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.