Office 2007 не может открывать файлы при вызове через JACOB из службы

Я использую JACOB для выполнения COM-вызовов PowerPoint и других приложений Office из Java. В конкретном окне Windows 7 я получаю следующее сообщение довольно часто, но не всегда:

Source: Microsoft Office PowerPoint 2007
Description: PowerPoint could not open the file.

Из Excel я получаю:

ERROR - Invoke of: Open
Source: Microsoft Office Excel
Description: Microsoft Office Excel cannot access the file 'c:\marchena\marchena10\work\marchena\batch_58288\input\content_1.xlsx'. There are several possible reasons:

? The file name or path does not exist.
? The file is being used by another program.
? The workbook you are trying to save has the same name as a currently open workbook.

Ошибка Word просто:

VariantChangeType failed

Вот что я запускаю, ошибка исходит из последней строки.

        ComThread.InitSTA();

        slideApp = new ActiveXComponent("PowerPoint.Application");

        Dispatch presentations = slideApp.getProperty("Presentations").toDispatch();

        Dispatch presentation = Dispatch.call(presentations, "Open", inputFile.getAbsolutePath(),
                MsoTriState.msoTrue.getInteger(), // ReadOnly
                MsoTriState.msoFalse.getInteger(), // Untitled The Untitled parameter is used to create a copy of the presentation.
                MsoTriState.msoFalse.getInteger()  // WithWindow
        ).toDispatch();

Я пробовал поставить точку останова непосредственно перед вызовом Open, и файл уже есть, и я действительно могу открыть его с помощью PowerPoint в графическом интерфейсе, но когда я шагаю, возникает исключение.

Раздражает в этой проблеме то, что с самого начала кажется, что она происходит постоянно, но после того, как вы ее некоторое время ткните (повторный запуск того же кода), она в конечном итоге успешно завершается и больше никогда не повторяется.

Дальнейшие исследования я обнаружил, что это происходит только с файлами .ppt, .doc и .xls, но не с .pptx, .docx и .xlsx. И, насколько я могу судить, это не связано с файловой системой (я заменил механизм, который копирует файлы, и попытался поместить файлы в другую файловую систему).

Я только что заметил, что это происходит только тогда, когда приложение Java работает как служба, а не когда я запускаю catalina.bat start из командной строки.


person Sindri Traustason    schedule 07.09.2010    source источник


Ответы (2)


У меня была такая же проблема (jacob в сервисе не работает), и эта полезная публикация (изменение dcomcnfg) сработала:

http://bytes.com/topic/c-sharp/answers/819740-c-service-excel-application-workbooks-open-fails-when-called-service#post3466746

person Steve S    schedule 01.04.2011
comment
Вот еще более простое решение. В качестве администратора создайте следующие две папки: C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop и C: \ Windows \ System32 \ config \ systemprofile \ Desktop. Вероятно, вам понадобится только один или другой, но это касается обоих случаев в 64-разрядной ОС. Отсюда: ссылка - person Steve S; 01.04.2011
comment
подтверждение этого (создание папки рабочего стола, как указано выше) также устранило проблему для меня - person hello_earth; 08.10.2018

Это работает для вас?

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class PPT {
    private static final String inputFile = "c:\\learning.ppt";
    public static void main(String[] args) {
        ActiveXComponent slideApp = new ActiveXComponent("PowerPoint.Application");
        slideApp.setProperty("Visible", new Variant(true));
        ActiveXComponent presentations = slideApp.getPropertyAsComponent("Presentations");
        ActiveXComponent presentation = presentations.invokeGetComponent("Open",new Variant(inputFile), new Variant(true));
        ComThread.Release();
            }
        }

Обновление. Если это работает, клиент работает и проблемы вызывает автоматизация, вы можете просмотреть http://support.microsoft.com/kb/257757, чтобы узнать о возможных проблемах. Коды ошибок явно разные, но они все равно могут помочь вам в устранении неполадок.

person Todd Main    schedule 14.09.2010
comment
Я получаю ту же ошибку, используя это. Кроме того, это работает как служба, поэтому отключение головы было преднамеренным. - person Sindri Traustason; 14.09.2010
comment
Ваша коробка Win 7 x64 или x86? Если это x64, развернули ли вы 64-битную JVM? - person Todd Main; 14.09.2010
comment
Да, это x64, с 64-битной JVM и x64-версией jacob.dll. - person Sindri Traustason; 19.09.2010
comment
Хорошо, это проблема вызова службы по сравнению с вызовом рабочего стола. на сервере код запускается при вызове с рабочего стола и выдает указанную выше ошибку при вызове из службы (которая работает под учетной записью пользователя рабочего стола и настроена на интерактивность, а служба обнаружения интерактивных служб работает). запускается процесс WINWORD и создается объект Presentations / docs, но затем бум. - person Alexander; 14.12.2010