Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Технологии
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.08.2019, 13:17
Аватар для Xalexo
Xalexo Xalexo вне форума
Прохожий
 
Регистрация: 04.02.2010
Адрес: Вселенная,Млечный путь,3 планета от Солнца и т.д.
Сообщения: 40
Версия Delphi: Delphi XE3-5
Репутация: 10
Радость Ошибка "Вызов был отклонен" при передаче текста в окно Excel.Application

Доброй минуты, уважаемые знатоки всей этой "нелегкой"
с OleObject в Delphi..

Была задача сделать программу-конвертер, для т.с. поточной обработки текстовых файлов, и вывода с разбиением на колонки (если выбрано) в итоговые *.xls файлы по заранее заданным путям. С задачей, как мне казалось, я успешно справился.. Но не тут то было.. Заказчик стал жаловаться на ошибку в самом начале запущенного процесса — "Неверный индекс".. На которую у меня (Windows10x64, Excel 2016) при разностороннем тестировании и намека не было.

Ок, вроде бы нашел решение, почитал на форуме, что такое часто случается, если именно в инструкции
Код:
"..Workbooks['Name'].."
, где к имени книги обращаются по имени, была рекомендация заменить на индекс.. Сделано. После этого у заказчика нарисовался новый крэш — "OLEObjectError: Вызов был отклонен". Тоже погуглил, и тоже как будто нашел решение. Советовали вычитать из реестра версию "Excel.Application", поправил, получилось что-то вроде:
Код:
xlapp := CreateOleObject('Excel.Application.16'); 
В аргументе считанное значение. То есть у меня все отлично работало и без этих бесконечных правок. Проверял и на батиной машине с древнючим Office и win10x32, — тоже все тип-топ. Подозрения, что заказким мутит отпали, т.к. он выкладывал мне скрины с перечисленными ошибками.

Ниже выложил экзешник, если у Вас стоит какой-либо Excel на машине, и найдется 2-3 минуты свободного времени (нужно будет нажать одну кнопку, (средняя в верхнем ряду), — пожалуйста проверьте какой у Вас "полет". Все настройки уже заданы, и нужно только, чтобы в папке на раб.столе (источник) был хоть один *.TXT файл.
Робко надеюсь на Ваше внимание!

Ниже код инициализации обьекта Excel.Application, который в моей пр-ме выполняется один лишь раз при 1ом запуске задачи:


Код:
      
ver:= ExcelVer; // получаем версию Excel из реестра,  — у меня это строка "Excel.Application.16"
      xlapp := CreateOleObject(ver); // xlapp  — глобальная переменная
      xlapp.Application.EnableEvents := false;
      xlapp.Visible :=       false;
      xlapp.displayalerts := false;
      xlapp.workbooks.add; // в прошлой версии после add здесь был аргумент (-4167), убрал его в соответствии с рекомендациями о устранении ошибки "Неверный индекс"


После нажатия кнопки "Запуск Enter", в цикле по всем найденным файлам в источнике , выполняется вот эта функция (откомментировал все, что только смог:

Код:
function Xls_Save(ASheetName, AFileName: string; var err_mes:string): Boolean;
const
  xlWBATWorksheet = -4167;
var
  Row, Col: Integer;
  GridPrevFile: string;
  Sheet: OLEVariant;
  i, j, r, c: Integer;
  er: string;
begin
    Result := False;
    // grid  — это глоб. строковый массив (array of array)
    r:=length(Grid); // получаем общую длину
    c:=length(Grid[0]); // получаем длину 1ого элемента подмассива grid
    {все это требуется, чтобы ниже можно было очистить диапазон ранее заполненный на предыдущем витке цикла, так как XLApp  — единственный глоб.обьект}
    if r>max_r then max_r:= r; if c>max_c then max_c:= c;

try
try
    {очистка обознач.выше}
    try XLApp.Range['A1:A'+inttostr(max_r)].ClearContents; except end;
    try XLApp.Range['A:'+for_(max_c)].ClearContents;       except end;

    Sheet := XLApp.Workbooks[1].WorkSheets[1];
    Sheet.Name := ASheetName;

     {Заполнение ячеек}
     for j:= 1 to r do
       for i:= 1 to c do
       begin
         application.ProcessMessages;
         sheet.cells[j,i]:=grid[j-1][i-1];
       end;
    {тут оставил на всякий случай двойной вариант сохр., хотя у меня работает и тот и другой}
    try
      {если убрать "56" - размер файла станет меньше, но Excel может ругаться при открытии}
      XLApp.Workbooks[1].SaveAs(AFileName,56);
      result := True;
    except
      XLApp.Workbooks[1].SaveAs(AFileName);
      result := True;
    end;

  finally
    {освобождение лок.переменной sheet}
    if not VarIsEmpty(XLApp) then
    begin
      Sheet := Unassigned;
    end;
  end;

  except
    on E: Exception do
    if first then
    begin
      {нужно было пройти цикл до конца, в любом случае, поэтому сделал флажок First}
      first:= false;
      er:= E.ClassName+': '+E.Message;
      err_mes:= er;
      {application.MessageBox(pchar(er),'', MB_ICONINFORMATION+MB_OK)}
    end;

  end;
end;

Несколько дней уже парюсь, никак не выходит долбаный аленький цветочек (((, помогите, ребят..

Архив с экзешником приложил ниже
Вложения
Тип файла: zip Project2.zip (1.13 Мбайт, 4 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter