質問: **・エクスポートについて** xssfworkbookで生成したxlsxファイルを出力しています↓ ``` HttpServletResponse.getOutputStreamにXSSFWorkbook.writeを実行し、ブラウザからダウンロード ``` xssfworkbookでxlsxを生成する際は、テンプレートとなるxlsxファイル(ファイルには2行分の記載がある)を取得し、そのファイルに対し編集を行い、上記流れで出力します。 **・インポートについて** 生成されたファイルをインポートする際は、Javascriptで上記でエクスポートされたxlsxファイルを読み込みます。 使用Jqueryは以下になります。 ・Sheet.js(xlsx.full.min.js) ・shim.js ・jszip.js **・今回の問題について** 今回の問題は、エクスポートされたxlsxファイルが一度も編集されていない状態でインポートされる際に、エクスポートのテンプレートとなるxlsxファイル時に記載されていた範囲(2行)までしかインポートされず、xssfworkbookで追記した3行目以降が読み込まれません。 また、エクスポートされたxlsxファイルに対し一度編集を行うと正常に全行が読み込まれます。 原因や解決方法の分かる方がいましたら、ご教授お願い致します。
回答: ・エクスポートについて テンプレートファイルに対し、Apache POIで編集した場合、最終セル位置設定は編集前のままになっています。 (xlsxファイルプロパティ:dimensionの値) ・インポートについて Sheet.js(xlsx.full.min.js)でxlsxファイルを読み込む場合の読み込み範囲は、「0行目0列目のセル~dimensionの値」となっておりますが、 Sheet.jsでのデータ読み込み時点では上記条件を無視した全データが読み込まれており、その後上記条件でデータが切り取られてしまっています。 --解決方法として-- まず、読み込み範囲終了位置に、dimensionの値は使用しません。 Sheet.jsの読み込みデータには、dimensionの値を無視した全てのセルデータおよびセルの位置データが格納されているので、最終セルの位置データを読み込み範囲終了位置とします。 →「0行目0列目のセル~最終セルの位置」となる Sheet.jsソース上では、 var Jg = function dk() 内の、最後でA.rに格納されている値が最終セル位置になるので、それをl["!ref"]に上書きすることで対応出来ます。