Вопрос, поднятый в данной теме, касается проблемы экспорта файлов Excel в формат PDF с использованием компонентов Delphi. Проблема заключается в том, что при использовании метода ExportAsFixedFormat из Excel, параметр IgnorePrintAreas не работает как ожидается, и области печати не игнорируются при экспорте.
Оригинальный код экспорта Excel в PDF:
function TExportTool.ExportExcelToPDF(aFileName, aNewFileName: String): Boolean;
begin
// ... код для экспорта активного листа в PDF ...
oSheet.ExportAsFixedFormat(0, aNewFileName, EmptyParam, EmptyParam, False, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
end;
Пользователь столкнулся с проблемой, что созданный PDF-файл игнорирует области печати, даже если параметр IgnorePrintAreas был установлен в False. Были попытки передать параметр IgnorePrintAreas как True и False, а также передать все первые пять параметров метода, но проблема не была решена.
Подтвержденное решение:
Проблема заключается в том, что Excel теряет настройки областей печати при открытии файла с использованием автоматизации, особенно в неанглийских версиях программы. Это происходит из-за того, что Excel создает внутренний именованный диапазон для области печати, и при открытии файла через автоматизацию, свойство NameLocal не переводится, что приводит к тому, что именованный диапазон не распознается как область печати. В результате oSheet.PageSetup.PrintArea возвращает пустую строку.
Временное решение:
Перед вызовом ExportAsFixedFormat необходимо восстановить оригинальную область печати. Это можно сделать, установив свойство PrintArea на значение, соответствующее области печати, или используя следующий код:
procedure RestoreOriginalPrintArea(oSheet: OleVariant);
var
i: Integer;
begin
for i := 1 to oSheet.Names.Count do
begin
if VarToStr(oSheet.Names.Item(i).Name).EndsWith('!Print_Area') then
begin
oSheet.PageSetup.PrintArea := 'Print_area';
Break;
end;
end;
end;
Этот код следует вызывать перед экспортом, например:
Также, поскольку файл может быть изменен, необходимо добавить:
oWB.Close(False); // Не сохранять изменения
перед закрытием приложения, чтобы избежать оставления процессов Excel после каждого вызова функции экспорта.
Пример обновленного кода экспорта:
function TExportTool.ExportExcelToPDF(aFileName, aNewFileName: String): Boolean;
begin
// ... инициализация приложения Excel ...
Try
oWb := App.WorkBooks.Open(ExpandUNCFileName(aFileName), 1); // Открыть в режиме чтения
Try
oSheet := oWB.ActiveSheet;
RestoreOriginalPrintArea(oSheet); // Восстановление области печати
oSheet.ExportAsFixedFormat(0, aNewFileName, ..., False, ...);
Result := True;
Finally
oWB.Close(False); // Закрыть книгу без сохранения
End;
Finally
App.Quit;
App := UnAssigned;
End;
end;
Это решение позволяет восстановить корректную работу с областями печати при экспорте Excel в PDF в приложениях, написанных на Delphi.
Вопрос связан с проблемой экспорта файлов Excel в формат PDF в среде Delphi, где области печати не игнорируются в соответствии с настройками, и требуется восстановление этих настроек для корректного экспорта.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS