いいね!数

0

閲覧数
228

POI4XPagesを使ってビューにある文書一覧の値をエクセルへ書き出す方法について

前に質問させて頂いたのですが、まだ解決しない問題があるため、改めて質問を立てました。

質問は以下になります。

 POI4XPagesを使用して作成したエクセル書き出しのボタンをクリックして書き出しを行った後、画面は

そのままもう一度ボタンをクリックしてみるとボタンが機能しないのか何も起きません。暫く(10秒ほど?)経ってから

ボタンをクリックすると再びボタンが機能して書き出しができるようになります。あるいは画面をリフレッシュする

か別の画面に切り替えてまた戻ってボタンをクリックするとすぐにでも動作します。ユーザーが連続して書き出しを

することもありそうで困っております。

この原因は何で、時間をおかずに連続して書き出す方法はあるでしょうか?

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - XPages | タグ:
  | 質問日時:Jun 10, 2016, 2:42:55 PM

回答・コメント

いいね!数

1

 

POI4XPagesの呼び出し方によりますが、おそらく

・ボタンのイベントで、シンプルアクションでPOI4XPagesを呼び出している。

・ボタンを部分更新にしている

だと思います。

この条件で、ayaさんの書いてある症状になります。

ボタンを部分更新を"全て更新"にすると治るかと思います。

原因は、予測になりますが、

部分更新は、HTMLページのある箇所を更新するために、必ずレスポンスが更新する一部のHTMLが戻ってくることが前提となっています。POI4XPagesではエクセルファイルを返すために、本来部分更新処理で戻ってくる値をエクセルのバイナリデータに上書きしてしまうので、クライアントがわでは本来受け取るはずのデータが無いので、部分更新が終わらない状態になってしまいます。
そのため、2回目以降の部分更新処理が実行されない、ということになるのではないかと思います。

回答日時:Jun 13, 2016, 11:28:42 AM

いいね!数

0

EBIHARAさん、

ご回答をありがとうございました。

ボタンのイベントで、シンプルアクションでPOI4XPagesを呼び出している。」のですが、「部分更新」ではなく

「全て更新」になっていました。

ただ、POI4XPagesを呼び出す前に文書が選択されているかどうかのチェックをして、選択されていた

場合のみPOI4XPagesを呼び出すようにしてあります。このチェックが問題になるかと、この部分を外して

単純にPOI4XPagesを呼び出すようにしてみたのですが、「すべて更新」にしても同じ問題が発生して

しまいます。他に調べる箇所はあるでしょうか?

回答日時:Jul 1, 2016, 1:56:45 PM

いいね!数

0

最近POI4XPAGESを使うようになって、この問題に遭遇しました。

同じ問題に遭遇する人もいるかもしれないので、メモを残しておこう。

ブラウザのF12ツールを使ってブラウザの通信をモニタしてみると、以下のようになってました。

・Excelの出力をさせるボタン押下時にPOSTメソッドでサーバにボタンが押下されたことを通知

・SSJSでPOI4XPagesのExcel出力処理を実行。ただしブラウザのPOSTの応答はない

・ブラウザ側はPOSTの応答を待ってるが、その間は再度ボタンを押下しても何も起きない

・そのうちPOST応答待ちのタイムアウトが起きて、ボタンが押せるようになる

ということで海老原さんの予想とおりだと思います。

POSTの応答が返せればいいんですけど、それは難しそうだから、CSJSでページ遷移させてしまうのがいいかと思います。

ページのリロードでいいなら、ファイル出力の処理を以下のように書けばうまくいきます。

    <xp:button value="get Excel-File" id="btExport">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="complete">
            <xp:this.action>
                <wgpoi:generateWorkbook
                    workbookId="shContacts">
                </wgpoi:generateWorkbook>
            </xp:this.action>
            <xp:this.script><![CDATA[
              setTimeout("location.reload()",3000);
            ]]></xp:this.script>
        </xp:eventHandler>
    </xp:button>

/Yac

 

回答日時:Dec 18, 2016, 2:47:22 PM

いいね!数

0

yac4423さん、

掲示から時間が経ってしまいましたが、久しぶりにこちらのトピックを見て、yac4423さんの

メモを見させて頂きました。

メモ内容通りページのリロードをさせることで問題を回避できました!

大変助かりました!

回答日時:Jan 11, 2017, 5:23:01 PM