2010-02-22 1 views
2

Я пытаюсь подключиться к таблице Excel из Delphi 7 с использованием компонента TAdoConnection. Проблема заключается в том, когда я выбираю Microsoft.Jet.OLEDB.4.0, Extended Properties = "Excel 8.0;", я иногда получить ошибку,Выбор поставщика при попытке доступа к таблице Excel в Delphi 7

that external table is not in the expected format.

Когда я выбираю: Provider = Microsoft.ACE.OLEDB.12.0 Расширенные свойства = Excel 12.0; то некоторые пользователи получают следующую ошибку:

"Provider cannot be found. It may not be properly installed".

Есть ли способ, чтобы решить мою проблему?

+0

Интересно, что в обоих случаях именно клиент получает эту ошибку, а не я. Для меня работают программы Bot, для того же файла excel, который используется клиентом. –

+0

Я решил проблему «Поставщик не может быть найден. Возможно, он не установлен правильно», установив поставщика с страницы Microsoft, но теперь пользователь снова получает «ту внешнюю таблицу не в ожидаемом формате». Я совершенно смущен. Я также пробовал Excel версии 11, потому что я думаю, что файл был подготовлен в Excel 2003, но затем получена ошибка «Не удалось найти Installable ISAM». –

ответ

4

Это было слишком долго, так как я исследовал это, чтобы запомнить детали, но вот пример того, что мы делаем с 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. 
+0

Что такое TAgCustomPlugin? И можете ли вы кратко описать, как использовать этот класс? –

+0

TAgCustomPlugin в основном такой же, как объект TForm. Это пользовательский объект, который мы создали, который получен из TForm. –