Мы использовали Java 5, Tomcat 5, Xalan и JSF 1 для создания приложения, использующего XSLT, XML и фильтр Tomcat, чтобы пользователи могли экспортировать свои данные в формате Excel. Недавно мы обновили Java 1.7.0_07, Tomcat 7.022 и JSF 2.1 (jsf-api-2.1.0-b03.jar). В связи с прилагаемыми усилиями мы еще не дошли до фишек; мы все еще используем jsp. Мы используем тег для отображения отчета Excel в своем всплывающем окне. Проблема в том, что после обновления всплывающее окно теперь отображает raw xml в IE, а не всплывающее открытие в Excel напрямую. Необработанный XML-файл можно сохранить из браузера в файл, и если этот сохраненный файл будет дважды щелкнут, он откроется в Excel правильно, но было бы лучше, если бы пользователи могли избежать этого.Экспорт в Excel с использованием JSF 2 и XSLT
Я считаю, что проблема заключается в том, что ответ в JSF 2 теперь совершается раньше, чем это было в JSF 1. Наш файл web.xml определяет следующие фильтры для Tomcat:
<filter>
<filter-name>XSLT Processor</filter-name>
<filter-class>com.cs.common.jsf.util.XsltProcessorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSLT Processor</filter-name>
<url-pattern>*.xml</url-pattern>
</filter-mapping>
<filter>
<filter-name>Hibernate Session Manager</filter-name>
<filter-class>com.cs.common.hibernate.HibernateSessionServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Hibernate Session Manager</filter-name>
<url-pattern>*.faces</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Hibernate Session Manager</filter-name>
<url-pattern>*.xml</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
И наш XsltProcesserFilter класс содержит следующие строки:
fChain.doFilter(request, wrapper);
response.setContentType("application/vnd.ms-excel");
используя sysouts
, я решил, что contentType
не будучи установлен под JSF 2, по-видимому, потому что ответ уже совершено. Я попытался установить contentType
в jsp, который выводит xml, но JSF затем выдает много ошибок, поэтому, вероятно, мне нужно установить его позже в процессе (например, в вышеприведенном фильтре). Я пробовал response.setBufferSize(6400000)
до doFilter
в XsltProcessorFilter
, так как я прочитал, что это может задержать фиксацию, но это также не решит проблему.
Как установить contentType
в application/vnd.ms-excel после того, как лица завершили обработку, но до фиксации, чтобы браузер открылся в Excel?
Отчет о проделанной работе - я загрузил исходный код JSF и поставил операторы sysout для локализации, где изменяется ContentType. Затем, перед изменением, я фиксирую существующее значение, а после изменения я его возвращаю. Теперь я получаю Excel, но форматирование неверно. Я планирую продолжить работу, пока не смогу опубликовать здесь ответ. –