0

Bean で exportList を生成します。

    public void exportExcel() throws WriteException {
    try {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename=\"hours.xls\";");
        OutputStream out = response.getOutputStream();

        WorkbookSettings ws = new WorkbookSettings();
        ws.setLocale(new Locale("de", "DE"));
        WritableWorkbook workbook = Workbook.createWorkbook(out, ws);
        WritableSheet sheet = workbook.createSheet("Sheet1", 0);
        sheet.addCell(new Label(0, 0, "ID", bold));
        int row = 1;
        for (Hour hour : this.listHours) {
            sheet.addCell(new Label(0, row, String.valueOf(hour.getId())));
            row++;
        }

        SheetFormatter.setOptimalColumnWidth(sheet);
        workbook.write();
        workbook.close();
        response.flushBuffer();
        context.responseComplete();
        context.addMessage(null, new FacesMessage("Liste Exportiert"));
    }
    catch (Exception e) {
    }
}

私のページでは、 p:commandButton でメソッドを呼び出します

    <p:commandButton  value="#{msg.export}" update="growl"
                    immediate="true" action="#{hoursView.exportExcel()}" />

私のページはExcel-Listを開きません...属性ajax = "false"を追加すると機能しますが、更新は実行されません...

詳細については、これがいくつかの違いを生む場合、私のBeanはSessionScopedです

4

1 に答える 1

2

最初の間違いは、ajax を使用してファイルをダウンロードしようとしたことです。それは不可能です。Ajax は、セキュリティ上の理由により、「名前を付けて保存」ダイアログを強制したり、取得した応答をローカル ディスク ファイル システムに書き込む機能がない JavaScript コードによって実行されます。そうしないと、さまざまな厄介なセキュリティ侵害の可能性への扉が開かれます。

したがって、使用ajax="false"は絶対に必要です。

2 つ目の間違いは、さまざまな応答を 1 つの応答に混ぜようとしているということです。それは不可能です。ファイルのダウンロードまたは ajax の更新のいずれかのみを返すことができ、両方を返すことはできません。2 つの異なる応答を取得するには、基本的に、クライアントに 2 つの異なる要求を送信させる必要があります。これには次のようにアプローチできます。

  1. クライアントが ajax リクエストをバッキング Bean に送信できるようにします。
  2. サーバーが Excel ファイルを作成してサーバーの一時ストレージ システムに保存し、一意の URL を生成して、サーブレットからアクセスできるようにします。
  3. メッセージと URL を含む ajax 応答をサーバーに送信させます。
  4. クライアントにメッセージを表示させ、URL で新しい GET 要求を呼び出します。を使用window.location=url;して、JavaScript が URL で新しい GET 要求を呼び出せるようにすることができます。
于 2012-08-24T11:39:52.257 に答える