1

職場では、2つのExcelスプレッドシート(​​1つはテンプレートとして機能し、もう1つはデータソースとして機能する)を使用する、非常に古いが安定したアプレットがあります。テンプレートはExcelでユーザーが作成しますが、データソースはWebアプリケーションでPOIを使用して作成されます。アプレット内では、次の方法を使用して、両方のスプレッドシートがJava / COMブリッジ(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フレーム:(J =コンパイルされたJavaコード、j =解釈された、Vv = VMコード)
> 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 /オブジェクト;+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

この問題は、Office2010でのテスト以降にのみ発生しています。

ここ数年で移行したPOI2.5.1とJACOB1.9を使用しているので、アップグレードしてみようと思いますが、プロジェクトとOffice2010のどちらにも既知の問題があるかどうかを知りたいです。POI3.x OOXMLをサポートするため、コードは以前のOfficeバージョンとの下位互換性を維持する必要があるため、HSSFを使用した生成に固執することをお勧めします。

4

0 に答える 0