Исключение из 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;