0

ストラットを使用して Web アプリケーションを開発しています。Excel ファイルを生成し、渡すデータ モデルに基づいて保存するメソッドを作成しました。Tomcat がローカルに存在するため、ローカル マシンでうまく機能します。しかし、今はアプリケーションを中央サーバーに移動しました。それが保存する方法を使用すると、サーバーにヒットしているクライアントマシンではなくサーバーにExcelファイルが生成されます..サーバーからクライアントにhttpを介して渡す必要があります..どうすればよいですか?

public static void populateExcelDoc(List<ColumnList> listOfColumns,RowList rowlist,String filename)
{
    try
    {
        WorkbookSettings ws = new WorkbookSettings();
        ws.setLocale(new Locale("en", "EN"));

        WritableWorkbook workbook = Workbook.createWorkbook(new File(filename+".xls"), ws);
        WritableSheet s = workbook.createSheet("Sheet1", 1);
        writeDataSheetifx1(s,listOfColumns,rowlist);
        workbook.write();
        workbook.close();

        Process p = 
                  Runtime.getRuntime()
                   .exec("rundll32 url.dll,FileProtocolHandler " + filename+".xls");
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    catch(WriteException e)
    {
        e.printStackTrace();
    }
}  

これは私の現在のコードがどのように見えるかです..どのような変更を加える必要がありますか? HttpServletResponse 応答を使用する必要がありますか?

4

2 に答える 2

2

Struts2にはstream、HttpServletResponseにデータを送信するための結果があります。

struts.xml結果を使用するようにアクションを構成しますstream

<action name="exceldoc" method="populateExcelDoc" class="ExcelDocAction">
  <result name="success" type="stream">
    <param name="inputName">inputStream</param>
    <param name="contentType">application/vnd.ms-excel</param>
    <param name="contentDisposition">attachment;filename=excel.xls</param>
  </result>
</action>

そして、アクション内private InputStream inputStream;でゲッター/セッターを使用して作成し、メソッド内でファイルを書き込みます。

于 2012-12-20T10:12:13.037 に答える
1

いくつかのオプションがあります。そのうちの 2 つは次のとおりです。

1) クライアント ブラウザがアクセスできる場所にファイルを保存します。

これを行うには、ファイルを保存する適切なディレクトリを見つける必要があります。サーブレットを使用している場合、次の方法を使用して、相対 URL パスから絶対ファイル システム パスを作成できます。

String filePath = getServletContext().getRealPath("/MyFile.xls");
WritableWorkbook workbook = Workbook.createWorkbook(new File(filePath), ws);
...

その後、ユーザーは次のような URL を使用してブラウザーからアクセスできます。http://host:port/AppName/MyFile.xls

ブラウザーがファイルを読み取らなければならないように、応答ヘッダーを変更することもできます。

response.setHeader("Content-Disposition", "attachment;filename=/MyFile.xls");

この方法の欠点は、誰でもファイルにアクセスできることと、ファイルを何度も生成する複数のユーザーがいる場合、一意のファイル名を生成することを考える必要があることです。次に、古いファイルの削除ルーチンも実装する必要があります。

2) サーブレットからブラウザにファイルを直接送信します。

サーブレット リクエストの応答が作成された Excel ファイルである場合、これがおそらく最善の方法です。

ファイルの種類とサイズに応じて応答ヘッダーを設定します。

response.setContentLength(length);
response.setContentType("application/vnd.ms-excel");
response.getOutputStream().write(...);
response.getOutputStream().flush();

データの書き込み後、ファイルはサーバーのファイル システムから削除できます。

于 2012-12-20T08:52:53.083 に答える