OLE在Excel文件中的名称冲突

bn31dyow  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(126)

开发程序转换从Excel文件到PDF格式。下面是我的代码:

procedure ExcelToPDF(const InputFileName, OutputFileName: string);
  var
    Excel: Variant;
    Workbook: Variant;
  begin
    try
      CoInitializeEx(nil, 0);

      //Открытие Excel
      Excel := CreateOleObject('Excel.Application');
//      Excel.Application.EnableEvents := False;
      Excel.Application.DisplayAlerts := False;
      Excel.Visible := False;

      if not VarIsNull(Excel) then
      begin
        //Открытие файла
        Workbook := Excel.Workbooks.Open(InputFileName);
        //Сохранение в PDF
        Workbook.ExportAsFixedFormat(xlTypePDF, OutputFileName);        

        Writeln('OK');
      end
      else
      begin
        raise Exception.Create('Не удалось открыть Excel');
      end;
    finally
      if not VarIsNull(Excel) then
      begin
        Excel.Quit;
        Excel := 0;
      end;
    end;
  end;

它工作正常,但对于一些工作簿有一个错误输入对话框,当程序试图打开工作簿(也看截图):
名称冲突
名称不能与内置名称相同。
旧名称:打印区域
新名称:
确定取消

旧名称可以是Print_Area或_FilterDatabase或其他名称。这是非常常见的错误,但我没有找到真实的的解决方案。但关键问题是:当我自己在Excel中打开有问题的工作簿时,它可以正常工作,没有任何对话框,只有当我通过OLE在程序中打开它时,它才出现。如果在OLE中我们只使用Excel,那会怎么样?所以Excel可能使用其他参数打开文件?我正在试验打开方法参数,但什么也没有。

abithluo

abithluo1#

谢谢你所有的意见。我找到了解决方案。在VBA中有GetObject函数。我在互联网上找到了 Delphi 实现它。它是:

function GetObject(const AFileName: TFileName): IDispatch;
  var
    vDispatch : IDispatch;
    vBindCtx : IBindCtx;
    vMoniker : IMoniker;
    vChEaten : Integer;
  begin
    Result := nil;
    vDispatch := nil;
    vBindCtx := nil;
    if CreateBindCtx(0, vBindCtx) = S_OK then
    begin
      vMoniker := nil;
      if MkParseDisplayName(vBindCtx, PWideChar(WideString(AFileName)),
        vChEaten, vMoniker) = S_OK then
      begin
        if vMoniker.BindToObject(vBindCtx, nil, IDispatch, vDispatch) = S_OK then
          Result := vDispatch;
      end;
    end;
  end;

所以,不用这两行:

Excel := CreateOleObject('Excel.Application');
Workbook := Excel.Workbooks.Open(InputFileName);

仅使用一个:

Workbook := GetObject(InputFileName);
92vpleto

92vpleto2#

它接缝有一个包在XL文件。在我的情况下,我导出数据到scv,然后保存到xlsb。这帮助我避免了错误。

相关问题