how to return excel in Struts2 result?

后端 未结 3 558
眼角桃花
眼角桃花 2020-12-17 06:31

I am trying to return an Excel sheet from my struts2 action class.

I am not sure what result-type should I be using? Has anyone tried to return an excel from strut

相关标签:
3条回答
  • 2020-12-17 06:59

    If you need to dynamically generate an Excel file using POI/HSSF and return in Struts 2,

    JSP

    <s:url action="DownloadExcel.action" var="downloadUrl">
    </s:url>
    <s:a href="%{downloadUrl}">Click to Download</s:a>
    

    Action Method

    @Action(value = "DownloadExcel")
    public void download() throws Exception {
        
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();
        
        String filename = "report.xlsx"; // or any other filename strategy
        String mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        String characterEncoding = response.getCharacterEncoding();
        if (characterEncoding != null) {
            mimeType += "; charset=" + characterEncoding;
        }
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
    
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.getSheetAt(0);
        // Fill out workbook as necessary... (simple example)
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);
        cell.setCellValue("test");
        //...
    
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            workbook.write(out);
            workbook.close();
        } catch (IOException e) {
            log.error("Failed to write into response - fileName=" + filename + ", mimeType=" + mimeType, e);
        }
        finally {
            if (out != null) {
                out.flush();
                out.close();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-17 07:06

    You can utilize the Stream Result type

    an Example will look like this:

    <result name="excel" type="stream">
        <param name="contentType">application/vnd.ms-excel</param>
        <param name="inputName">excelStream</param>
        <param name="contentDisposition">attachment; filename="${fileName}"</param>
        <param name="bufferSize">1024</param>
        <param name="contentLength">${contentLength}</param>
     </result>
    

    excelStream will be a method in your action class, contentLength will be length of the stream, fileName will be a getter which will return back the name of the file.

    0 讨论(0)
  • 2020-12-17 07:21

    Omnipresent covered what you need in struts.xml. I'm adding an example with the Action as well:

    InputStream excelStream
    String contentDisposition
    String documentFormat = "xlsx"
    
    String excel() {
    
        ServletContext servletContext = ServletActionContext.getServletContext()
        String filePath = servletContext.getRealPath("/WEB-INF/template/excel/mytemplate.${documentFormat}")
    
        File file = new File(filePath)
        Workbook wb = WorkbookFactory.create(new FileInputStream(file))
    
        Sheet sheet = wb.getSheetAt(0)
    
    <write to excel file>
    
        ByteArrayOutputStream baos = new ByteArrayOutputStream()
        wb.write(baos)
        excelStream = new ByteArrayInputStream(baos.toByteArray())
        contentDisposition = "filename=\"myfilename.${documentFormat}\""
    
        return SUCCESS
    }
    
    String getExcelContentType() {
        return documentFormat == "xlsx" ? "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" : "application/vnd.ms-excel"
    }
    

    I'm using the poi model: org.apache.poi.ss.usermodel.

    You can replace "xlsx" with "xls" if you want.

    struts.xml:

    <action name="myaction" class="com.example.MyAction" method="excel">
            <result type="stream">
                <param name="contentType">${excelContentType}</param>
                <param name="inputName">excelStream</param>
                <param name="contentDisposition">contentDisposition</param>
                <param name="bufferSize">1024</param>
            </result>
        </action>
    

    (add semicolons and stuff to translate to valid Java)

    0 讨论(0)
提交回复
热议问题