Проблема с использованием JACOB для открытия электронной таблицы Excel, созданной с помощью POI в Office 2010 - PullRequest
1 голос
/ 06 декабря 2010

На работе у нас есть очень старый, но стабильный апплет, который принимает две таблицы Excel (одна действует как шаблон, а другая как источник данных).Шаблон создается пользователем в Excel, но источник данных создается с помощью POI в веб-приложении.Внутри апплета обе таблицы открываются через Java / COM Bridge (JACOB), используя следующий метод:

/**
 * Opens an excel workbook
 */
public Object openExcelWorkBook(ActiveXComponent xlActx, MailMergeArgs args, String dataSourceDocName, Object xlObj,
                                boolean isTemplate) {
  final String functionName = "openExcelWorkBook";
  Object activeWorkBookOj;
  String workbook;
  // get the workbooks object
  Object wrkBooksObj = Dispatch.get(xlActx, ExcelConstants.APPLICATION_WORKBOOKS).toDispatch();

  if ((!args.isTemplateExistsOnHost()) && (isTemplate)) {
    debug("Skipping opening template...", functionName);
  }
  // it is on host
  else {
    if (isTemplate) {
      workbook = getTemplateDocLoc(args);
    } else {
      if (!this.standaloneApp) {
        workbook = TMP_DIR + dataSourceDocName;
      } else {
        workbook = dataSourceDocName;
      }
    }

    debug("Opening workbook..." + workbook, functionName);
    Dispatch.call(wrkBooksObj, ExcelConstants.WORKBOOKS_OLE_OPEN, workbook).toDispatch();

  }

  debug("Locating workbook...", functionName);
  activeWorkBookOj = Dispatch.get(xlActx, ExcelConstants.APPLICATION_ACTIVEWORKBOOK).toDispatch();

  debug("End", functionName);
  return activeWorkBookOj;
}

Из журнала апплета и файла hs_err_pid. Я знаю, что таблица шаблонов прекрасно открывается с помощью JACOB, но данные не отображаются на Dispatch.call.

Из файла hs_err_pid:

> Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
> j  com.jacob.com.Dispatch.invokev(Ljava/lang/Object;Ljava/lang/String;III[Lcom/jacob/com/Variant;[I)Lcom/jacob/com/Variant;+0
> j  com.jacob.com.Dispatch.invokev(Ljava/lang/Object;II[Lcom/jacob/com/Variant;[I)Lcom/jacob/com/Variant;+27
> j  com.jacob.com.Dispatch.callN(Ljava/lang/Object;I[Ljava/lang/Object;)Lcom/jacob/com/Variant;+11
> j  com.jacob.com.Dispatch.call(Ljava/lang/Object;ILjava/lang/Object;)Lcom/jacob/com/Variant;+10
> j  com.perceptive.ctms.applets.ImpactApplet.openExcelWorkBook(Lcom/jacob/activeX/ActiveXComponent;Lcom/perceptive/ctms/applets/MailMergeArgs;Ljava/lang/String;Ljava/lang/Object;Z)Ljava/lang/Object;+122
> j  com.perceptive.ctms.applets.ImpactApplet.doExcelMailMerge(Lcom/perceptive/ctms/applets/MailMergeArgs;Ljava/lang/String;Ljava/lang/String;I)V+234
> j  com.perceptive.ctms.applets.ImpactApplet.runOrams(Lcom/perceptive/ctms/applets/MailMergeArgs;)V+320
> j  com.perceptive.ctms.applets.ImpactApplet.start()V+94
> j  sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run()V+1159
> j  java.lang.Thread.run()V+11
> v  ~StubRoutines::call_stub

Эта проблема возникла только после тестирования на Office 2010.

Мы используем POI 2.5.1 и JACOB 1.9, которые оба перешли в последние несколько лет, я собираюсь попробовать обновить их, но я хотел бы знать, есть ли известные проблемы с каким-либо проектом и Office 2010. Хотя POI 3.xподдерживает OOXML, наш код должен оставаться обратно совместимым с более ранними версиями Office, поэтому мы бы предпочли использовать генерацию с использованием HSSF.

...