尝试访问 Delphi 7 中的 Excel 表时的提供程序选择

发布于 2024-08-22 06:07:31 字数 340 浏览 7 评论 0原文

我正在尝试使用 TAdoConnection 组件从 Delphi 7 连接到 Excel 表。 问题是当我选择 Microsoft.Jet.OLEDB.4.0, Extended Properties="Excel 8.0;" 时,我有时会收到错误,

该外部表不在 预期格式。

当我选择: 提供程序=Microsoft.ACE.OLEDB.12.0;扩展属性=Excel 12.0; 然后一些用户收到以下错误:

“找不到提供者。可能没有 正确安装”。

有办法解决我的问题吗?

I am trying to connect to excel table from Delphi 7 using TAdoConnection component.
The problem is when I select Microsoft.Jet.OLEDB.4.0, Extended Properties="Excel 8.0;", I sometimes receive error,

that external table is not in the
expected format.

When i select:
Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;
then some users receive following error:

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

Is there a way to solve my problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

转身以后 2024-08-29 06:07:31

自从我研究这个以来已经太久了,记不起细节了,但这里是我们使用 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.

It's been too long since I researched this to remember the details, but here is a sample of what we are doing with Excel. Hope this helps...

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.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文