職場では、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を使用した生成に固執することをお勧めします。