3

SpringアプリケーションでAbstractExcelViewを使用してファイルを作成してダウンロードすると、.htmlファイルとしてダウンロードされますが、拡張子を手動で.xlsに変更すると、期待される結果が表示されます。AbstractExcelView の私のコードは次のとおりです。

public class ExcelRevenueReportView extends AbstractExcelView {

@Override
protected void buildExcelDocument(Map model, HSSFWorkbook workbook,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    Map<String, String> revenueData = (Map<String, String>) model
            .get("revenueData");

    // create a wordsheet
    HSSFSheet sheet = workbook.createSheet("Revenue Report");

    HSSFRow header = sheet.createRow(0);
    header.createCell(0).setCellValue("Month");
    header.createCell(1).setCellValue("Revenue");

    int rowNum = 1;
    for (Map.Entry<String, String> entry : revenueData.entrySet()) {
        // create the row data
        HSSFRow row = sheet.createRow(rowNum++);
        row.createCell(0).setCellValue(entry.getKey());
        row.createCell(1).setCellValue(entry.getValue());

    }

}

}

コンテキスト構成ファイル :dispatcher-servlet.xml は

<beans:bean name="/index.html" class="com.my.report.HomeController">    
</beans:bean>

 <beans:bean class="org.springframework.web.servlet.view.XmlViewResolver">
  <beans:property  name="location" value="/WEB-INF/spring-excel-views.xml" />
       <beans:property  name="order" value="0" />
</beans:bean>
4

2 に答える 2

3

HTTP および Web アプリケーション (Spring であるかどうかに関係なく) に関しては、多くのオプションがあります。

いくつかのアイデア:

1 - 「名前を付けて保存」ダイアログを強制的に表示し、ユーザーが必要に応じてファイルを保存できるようにします (名前と拡張子を変更する可能性があります)。

これは、HTTP の「content-type」ヘッダーを「application/octet-stream」に設定することで実現できます。これは文字通り、データが未知の種類のバイトストリームであることをブラウザに伝えます。これにより、ブラウザは別のアプリケーションによって開かれたり処理されたりすることを「理解」します。したがって、ブラウザはファイルを保存できるようにします。

buildExcelDocument ビュー マネージャー コードのみを提供しました。このメソッドの前後にどのコードが実行されるかはわかりませんが、この HTTP ヘッダーを設定する 1 つの方法は、単純に「HttpServletResponse」オブジェクトを使用することです。

response.setHeader("Content-Type", "application/octet-stream");

もう 1 つの (醜い) 方法は、XML/HTML ビューにハードコードすることです。

<meta http-equiv="Content-Type" content="application/octet-stream />

これは、ファイルのダウンロードのみを目的とするページがシステムにある場合にうまく機能します。チャンクからビューを作成し、マスター http ページが 1 つしかない場合、メタタグを強制すると他のビューが台無しになります。

2 - 特定のファイル名を強制して拡張子を設定することもできます。

最初の提案と同じ方法で実現できます: 特定の content-disposition HTTP ヘッダーを設定します。

// Set file name and extension
response.setHeader("Content-Disposition", "inline; filename=yourExcelFile.xls");

これにより、指定したファイル名と拡張子で正しくダウンロードされるようにストリームが設定されます。

繰り返しますが、これは HTML/XML/JSP/JSF (またはその他のテクノロジ) 自体に直接配置できますが、これは最善の解決策ではありません。

「setHeader」の方法を使用し、両方のアイデアを同時に使用します。

// Force save-as dialog:
response.setHeader("Content-Type", "application/octet-stream");

// Set file name and extension
response.setHeader("Content-Disposition", "inline; filename=yourExcelFile.xls");
于 2012-06-11T18:20:33.490 に答える
1

これを試して:

response.setHeader("Content-Disposition", "attachment; filename=\"yourFile.xls\"");
于 2013-06-10T07:25:00.510 に答える