У меня есть функция в плагине, которая экспортирует некоторые элементы контрольного списка в файл Excel. Раньше все работало нормально, но несколько дней назад я получил ошибку $Proxy10.Open() при попытке открыть книгу Excel. Я не знаю, актуальна ли эта информация, но я могу воспроизвести эту проблему только на нескольких компьютерах, на некоторых из них я могу воспроизвести ее, только если я подключаюсь к ней удаленно.
Ошибка:
java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy10.Open(Unknown Source)
Caused by: java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask.get(FutureTask.java:205)
at com.sun.jna.platform.win32.COM.util.ComThread.execute(ComThread.java:157)
at com.sun.jna.platform.win32.COM.util.Factory$ProxyObject2.invoke(Factory.java:93)
... 5 more
Вот как я инициализирую подсистему COM:
Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, Ole32.COINIT_MULTITHREADED);
facade.comFactory = new Factory();
Вот как я инициализирую приложение Excel:
ComExcel_Application excel = facade.comFactory.createObject(ComExcel_Application.class);
facade.excelApp = excel.queryInterface(Application.class);
facade.excelApp.setVisible(true);
System.out.println("Using Excel version: " + facade.excelApp.getVersion());
И здесь выбрасывается исключение:
Workbook myWorkbook = excelApp.getWorkbooks().Open(fullName.toString());
Я хочу спросить, в чем основная проблема этой ошибки, и любые подсказки приветствуются. Я пытался найти любые связанные вопросы или ошибки, но ничего не нашел.
@ButiriDan спасибо, что обратили мое внимание на редактирование поста. Надеюсь, я правильно отредактировал
Проблема возникла из-за того, что Factory() инициализируется для создания COM-объекта. com.sun.jna.platform.win32.COM.util.Factory использует поток для выполнения вызовов, и этот поток устанавливает верхний предел времени выполнения, который по умолчанию составляет 5000 мс. Поэтому я увеличил время выполнения потока до 15000 мс.
facade.comFactory = new Factory(new ComThread("COM Thread", 15000, new
Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
// do something intelligent
}
}));
Добро пожаловать в
Stack Overflow
вы должны прочитать Как задать хороший вопрос?, а затем отредактировать свой пост