如何将使用jxl.jar生成的excel文件从服务器端发送到客户端

时间:2012-12-20 07:17:29

标签: java struts2 jxl

我正在使用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响应吗?

2 个答案:

答案 0 :(得分: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>

在您的操作中,使用getter / setter创建private InputStream inputStream;并在您的方法中将文件写入其中。

答案 1 :(得分:1)

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

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

要做到这一点,你必须找到一个体面的目录来存储文件。使用Servlet时,可以使用此方法从相对URL路径创建绝对文件系统路径:

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

然后,用户可以使用以下网址从浏览器访问它: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();

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