2013-09-16 2 views
0

В устаревшем коде экспорт excel выполняется путем рендеринга страницы xhtml (jsf) и путем изменения contentType на «application/vnd.ms-excel» файл автоматически загружается браузером и этим файлом может быть открыт с помощью excel без каких-либо проблем.JSF 1.2 - Экспорт в Excel и переименование файла

Что бы я хотел изменить, это расширение файла. Когда файл загружен, он имеет расширение «xhtml». Я хотел бы использовать правильное расширение excel ('xls').

Загруженный файл называется summaryTransactionReports.xhtml. Я бы хотел .

Как я могу достичь этого с минимальным воздействием?

Здесь идет код:

summaryTransactionReports.xhtml

<h:commandButton action="#{TransactionReports.createTransactionSummaryReportAction}" 
        value="#{msg.transactionReports_createReport}" 
        styleClass="form-button text-form-button"/> 

TransactionReportsMBean.java

public String createTransactionSummaryReportAction() 
{ 
    [...] 
    Lots of thing here!!! 
    [...] 

    //Page we go to depends on the report type requested 
    String nextPage; 
    switch (reportType) 
    { 
     case REPORT_TYPE_HTML: 
      nextPage = OutcomeConstants.VIEW_TRANSACTION_SUMMARY_REPORT; 
      break; 

     case REPORT_TYPE_EXCEL: 
      nextPage = "viewExcelSummaryTransactionReport"; 
      break; 

     case REPORT_TYPE_PRINTER_FRIENDLY: 
      nextPage = OutcomeConstants.VIEW_TRANSACTION_SUMMARY_REPORT_PRINTER_FRIENDLY; 
      break; 

     default: 
      nextPage = OutcomeConstants.VIEW_TRANSACTION_SUMMARY_REPORT; 
      break; 
    } 

    return nextPage; 
} 

viewExcelSummaryTransactionReports.xhtml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html 
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ac="http://aconitesolutions.com/jsf-custom"> 
    <body> 

     <ui:composition template="excelMainPage.xhtml"> 
      <ui:define name="title">#{msg.transactionReportsSummary_Title}</ui:define> 

      <ui:define name="productName">Transaction Enabler</ui:define> 
      <ui:define name="content"><ui:include src="summaryTransactionReportsContent.xhtml" /></ui:define> 
      <ui:define name="header">This is the header stuff</ui:define> 

     </ui:composition> 

    </body> 
</html> 

excelMainPage.xhtml

<f:view contentType="application/vnd.ms-excel" 
     xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <head> 
     <title> 
      <ui:insert name="title">Default title</ui:insert> 
     </title> 
    </head> 
    <body> 

    <f:loadBundle basename="TRxEMessageResource" var="msg"/> 

    <!-- div for displaying tooltips ; manipulated by javascript --> 
    <div id="tooltip" style="position:absolute;visibility:hidden"></div> 


    <table style="width: 100%"> 
     <tr> 
      <td> 
       <div id="header"> 
        <h2>#{msg.productName}</h2> 
       </div> 
      </td> 
     </tr> 

     <tr> 
      <td style="vertical-align: top; width: 100%; 
       border-style: solid; 
       border-bottom-width: 2px; 
       border-left-width: 0px; 
       border-right-width: 0px; 
       border-top-width: 0px; 
       border-color: #A9A9A9; 
       margin-bottom: 5%"> 
       <div id="titleText"> 
        <h2> 
         <ui:insert name="title"/> 
        </h2> 

        <ui:insert name="content"> 
         <div>Content goes here</div> 
        </ui:insert> 
       </div> 
      </td> 
     </tr> 
    </table> 
    </body> 

</f:view> 

ответ

1

Это узнаваем как MSIE специфическое поведение. Этот браузер действительно не использует имя файла из заголовка Content-Disposition как Сохранить как имя файла. Вместо этого он использует имя файла, как он появляется в последнем пути из URI запроса, который в этом случае является URL-адресом представленных <form action>.

Ваш лучший выбор - позволить JSF отправить перенаправление на сервлет, который, в свою очередь, возвращает отчет. Затем вы можете указать имя файла прямо в URL-адресе, как ожидает MSIE.

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); 
ec.redirect(ec.getRequestContextPath() + "/reports/filename.xls"); 

сервлет может выглядеть следующим образом:

@WebServlet("/reports/*") 
public class ReportServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String filename = request.getPathInfo().substring(1); 
     // ... 
    } 

} 

Дополнительные параметры, необходимые для формирования отчета можно передать в качестве параметров запроса в URL переадресации и/или через сессии.

+0

Спасибо за ваш ответ, как обычно очень быстро! Сейчас я работаю над чем-то другим, поэтому я не могу попробовать то, что вы предложили. Я вернусь к вам, надеюсь, через несколько дней. Thks снова для вашего времени. – TheEwook

Смежные вопросы