2012-12-20 24 views
0

我正在使用struts來開發我的web應用程序。我寫了一個生成excel文件並基於我傳遞的數據模型保存它的方法。自從tomcat在本地存在以後,在本地計算機上工作良好..但是現在我已將應用程序移至中央服務器..現在,如果我使用它存儲的方法在服務器中生成excel文件,而不是在服務器上的客戶端機器上。我需要通過http將它從服務器傳遞到客戶端..我該怎麼做?如何將使用jxl.jar從服務器機器生成的excel文件發送到客戶端

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響應嗎?

+0

[JExcelAPI FAQ頁面](http://jexcelapi.sourceforge.net/resources/faq/)實際上包含了一個將Excel文件寫入servlet響應的示例。在常見問題解答中查找'如何從Servlet輸出Excel文件?'。 – Perception

+0

對不起,這個問題可能是蹩腳的,但你能告訴我如何在struts中執行它嗎?這裏我們不會傳遞HttpServlet對象。和我沒有doGet方法..你可以改變我現有的代碼? –

回答

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和寫文件,它的方法內。

+0

這是Struts2的方式,1 –

+0

也可以以'字符串fileName'與其在操作吸氣劑,和下面的行參數的文件名:'附件; filename =「$ {fileName} .xls」' –

+0

對不起。它沒有幫助..我從一個映射到struts.xml的不同類的方法調用populateExcelDoc()。你能修改我的代碼並解釋嗎?我需要訪問HttpResponse對象..如果你搜索「如何從Servlet輸出Excel文件?」在這個鏈接http://jexcelapi.sourceforge.net/resources/faq/它從doGet()方法獲得響應對象。在這裏我不能doGet(),因爲我從其他地方調用靜態方法populateExcelDoc()。 。不知道如何前進.. –

1

您有幾種選擇,其中兩個是:

1)保存在一個地方的文件,其中一個客戶端瀏覽器可以訪問它

要做到這一點,你將不得不找出一個體面的目錄來存儲文件。

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

然後用戶可以從瀏覽器訪問使用URL,如::http://host:port/AppName/MyFile.xls

當您使用一個Servlet,你可以使用這種方法創建一個從相對URL路徑的絕對文件系統路徑

你也可以修改響應頭,使瀏覽器有讀取該文件:

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

缺點這種方法的是,該文件將成爲everyb訪問ody,如果有多個用戶一次又一次地生成文件,你可能不得不考慮生成唯一的文件名。然後,您還必須爲舊文件實施刪除例程。

2)直接從servlet發送文件到瀏覽器。

如果您的Servlet請求的響應可以是創建的Excel文件,這可能是最好的方法。

設置響應報頭相應於該文件類型和大小:

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

寫入數據之後,該文件可以被從服務器文件系統中刪除。

+0

我曾嘗試過你的第二種方法..但是,請告訴我如何讓響應對象instatantiated?因爲我從其他類調用populateExcelDoc()方法.. Plz修改我的代碼並讓我知道.. –

+0

響應對象由Web服務器爲您創建並傳遞給servlet doGet()和doPost()方法。您必須將它從您的servlet的doGet()或doPost()方法傳遞給您的類,或者將文檔結果返回給doPost()/ doGet()方法並從那裏寫入。 –

+0

好吧,我確實添加了\t公共無效的doGet(HttpServletRequest的請求,HttpServletResponse的響應)拋出了ServletException,IOException異常{}方法,但我將如何傳遞參數給populateExelDoc(參數)方法?因爲參數來自其他類的方法。我通過的參數必須先通過doGet,然後通過populateExcelDoc()。怎麼做? –

相關問題