Исключение из HRESULT: 0x800A01A8 Dynamic Navision 2016

Я написал код, в котором пользователь фильтрует исходный номер из таблицы, код получает исходный номер и открывает файл Excel с тем же номером в папке, записывает другие данные в файл, а затем сохраняет во временную папку. Программа работала для некоторых файлов Excel в папке, но не работала для большинства файлов. Когда он закончит работу, он скажет Exception from HRESULT: 0x800A01A8, файл будет сохранен во временной папке, но данные в нее не записываются.

https://stackru.com/images/6390a443b45df7232b140405ef96c0faf55d0960.png

Я искал по всему Google, но похоже, что никто не сталкивался с той же проблемой, что и я, и я понятия не имею, что означает это исключение. Ниже приведен код.

      ProductionOrder - OnAfterGetRecord()

  CLEAR(xlApplication);
  CLEAR(xlWorkbooks);
  CLEAR(xlWorksheet);
  CLEAR(xlshape);

  // Open excel
  IF CREATE(xlApplication, FALSE, TRUE) THEN BEGIN
    xlApplication.SheetsInNewWorkbook := 1;
    xlApplication.ScreenUpdating(TRUE);
    xlWorkbooks := xlApplication.Workbooks;
  END ELSE ERROR('Could not start Excel.');

  xlWorkbooks.Open('C:\PROCESS CHECKSHEET\' + ProductionOrder."Source No." + '.xlsx');
  xlWorkbook := xlApplication.ActiveWorkbook;
  xlSheets := xlWorkbook.Worksheets;

  FOR i := 1 TO xlSheets.Count DO BEGIN
    xlWorksheet := xlSheets.Item(i);
    xlWorksheet.Activate;

    xlRange := xlWorksheet.Range(xlsCell(14,7));
    xlRange.Value := ProductionOrder."No.";

    xlRange := xlWorksheet.Range(xlsCell(14,8));
    xlRange.Value := FORMAT(ProductionOrder.Quantity);

    xlWorkbook._SaveAs('C:\temp\' + ProductionOrder."Source No.");
    xlWorkbook.Close(TRUE);
    xlApplication.Quit;
  END;

  CurrReport.QUIT;

LOCAL xlsCol(col : Integer) : Text

    IF col > 26 THEN BEGIN
      ColFirst := col DIV 26;
      col := col MOD 26;
    END
    ELSE
      ColFirst := 0;
      Letters := 'ABCDEFGHIJKLMNOPQRSTUVYWXYZ';
    IF ColFirst <> 0 THEN
      EXIT (STRSUBSTNO('%1%2',Letters[ColFirst],Letters[col]))
    ELSE
      EXIT (STRSUBSTNO('%1',Letters[col]));

LOCAL xlsCell(col : Integer;row : Integer) : Text[15]

  EXIT (STRSUBSTNO('%1%2',xlsCol(col),row));

Редактировать:

Я попытался отладить. Отладчик сообщает об ошибке в строке "xlWorksheet:= xlSheets.Item(i);". В файле Excel есть только один лист, к которому я пытаюсь получить доступ. Чего я не понимаю, так это того, что это будет работать с другими файлами Excel, но не с этим файлом, к которому я сейчас пытаюсь получить доступ.

Я также обнаружил, что если я скопирую содержимое в новый файл Excel, код будет работать в новом файле Excel. Может ли это быть проблемой версии Excel?

1 ответ

Я решил это самостоятельно.

Поскольку файлы Excel были переданы мне моим HOD на работе (и эти файлы Excel были написаны другим отделом), я не знал, что внутри этих файлов Excel был скрытый лист, поэтому он выдавал ошибку исключения, потому что мой код был индексирует только файл Excel, который имеет только один лист. Я изменил свой индекс на 2, и это сработало. Примечание для себя, в следующий раз нужно проверить скрытые листы.

Я не знаю, есть ли для каждого листа эквивалент для программирования C/AL, потому что я новичок в этом языке, поэтому я использовал 2 цикла for для решения проблемы.

        CLEAR(xlApplication);
  CLEAR(xlWorkbooks);
  CLEAR(xlWorksheet);
  
  IF CREATE(xlApplication, FALSE, TRUE) THEN BEGIN
    xlApplication.SheetsInNewWorkbook := 1;
    xlApplication.ScreenUpdating(TRUE);
    xlWorkbooks := xlApplication.Workbooks;
  END ELSE ERROR('Could not start Excel.');

  xlWorkbooks.Open('C:\13. PROCESS CHECKSHEET\' + ProductionOrder."Source No." + '.xlsx');
  xlWorkbook := xlApplication.ActiveWorkbook;
  xlSheets := xlWorkbook.Worksheets;

  FOR I := 1 TO xlSheets.Count DO BEGIN
    xlWorksheet := xlSheets.Item(I);
    xlWorksheet.Activate;

    xlRange := xlWorksheet.Range(xlsCell(14,7));
    xlRange.Value := ProductionOrder."No.";

    xlRange := xlWorksheet.Range(xlsCell(14,8));
    xlRange.Value := FORMAT(ProductionOrder.Quantity);
  END;

  FOR I := 2 TO xlSheets.Count DO BEGIN
    xlWorksheet := xlSheets.Item(I);
    xlWorksheet.Activate;

    IF (FORMAT(xlWorksheet.Name) = 'PROCESS CHECKSHEET') OR (FORMAT(xlWorksheet.Name) = 'Process Checksheet') THEN BEGIN
      xlRange := xlWorksheet.Range(xlsCell(14,7));
      xlRange.Value := ProductionOrder."No.";

      xlRange := xlWorksheet.Range(xlsCell(14,8));
      xlRange.Value := FORMAT(ProductionOrder.Quantity);
    END;
  END;

   xlWorkbook.SaveAs('C:\13. PROCESS CHECKSHEET\temp\' + ProductionOrder."Source No.");
   MESSAGE('Success');
   xlWorkbook.Close(TRUE);
   xlApplication.Quit;
   CurrReport.QUIT;
Другие вопросы по тегам