0

我正在使用 struts 开发我的 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;中使用 getter/setter 创建并在您的方法中将文件写入其中。

于 2012-12-20T10:12:13.037 回答
1

您有多种选择,其中两种是:

1)将文件保存在客户端浏览器可以访问的地方

为此,您必须找到一个合适的目录来存储文件。使用 Servlet 时,可以使用以下方法从相对 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) 将文件直接从 servlet 发送到浏览器。

如果您的 Servlet 请求的响应可以是创建的 Excel 文件,这可能是最好的方法。

根据文件类型和大小设置响应头:

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

写入数据后,可以从服务器文件系统中删除该文件。

于 2012-12-20T08:52:53.083 回答