Как использовать JSP / JSTL для создания файла CSV - PullRequest
2 голосов
/ 05 августа 2010

Я создал файл jsp с простой таблицей.

Я хотел бы создать еще один файл jsp, который пользователи могут открывать в Excel или сохранять как xls.

Этовесь мой jsp-файл, он создает CSV-файл, который открывается в Excel при нажатии на ссылку:

<%@ page contentType="text/html;charset=windows-1252"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt"uri="http://java.sun.com/jsp/jstl/fmt" %>
<% response.setContentType("application/vnd.ms-excel");
   response.setHeader("Content-Disposition","attachment; filename=" + "online-dashboard.csv" ); %>

<jsp:useBean id="ReportInfo" class="com.reports.ReportLister"  scope="request" />
${ReportInfo.reportType},M,W,Other
<c:forEach var="rrow" items="${ReportInfo.list}"  varStatus="rowCounter">
    ${rrow.subjectCode},${rrow.MCount},${rrow.WCount},${rrow.OCount}
</c:forEach>
Totals,${ReportInfo.totalMSections},${ReportInfo.totalWSections},${ReportInfo.totalOSections}

Когда я открываю его в Excel, каждая строка разделяется 2 строками.

Есть ли простой способ создать файл Excel таким способом?

Есть ли простой способ добавить некоторое форматирование (например, полужирный текст для заголовков столбцов)?

Ответы [ 5 ]

2 голосов
/ 05 августа 2010

Лучшим способом будет Spring и его JExcelView .

1 голос
/ 05 августа 2010

Простой способ - использовать тот факт, что Excel может понимать HTML.Поэтому просто отформатируйте ваши данные в виде таблицы HTML и отправьте их в виде файла XLS.Что-то вроде

<table>
<c:forEach var="rrow" items="${ReportInfo.list}"  varStatus="rowCounter">
<tr><td><b>${rrow.subjectCode}</b></td>
    <td>${rrow.MCount}</td>
    <td>${rrow.WCount}</td>
    <td>${rrow.OCount}</td></tr>
</c:forEach>
</table>
1 голос
/ 05 августа 2010

Причина, по которой вы получаете пустые строки, заключается в том, что JSP отображает пустые строки внутри вашего цикла. Вы можете устранить их, упаковав цикл в одну строку:

<c:forEach var="rrow" items="${ReportInfo.list}"  varStatus="rowCounter">${rrow.subjectCode},${rrow.MCount},${rrow.WCount},${rrow.OCount}</c:forEach>

Или вы можете добавить фильтр сервлетов, который будет убирать пустые строки из ответа.

Однако, если вы хотите добавить специальное форматирование, я полагаю, что это выходит за рамки формата значений, разделенных запятыми, и вам нужно сгенерировать собственные файлы Excel в соответствии с рекомендациями других.

РЕДАКТИРОВАТЬ: Вместо того чтобы упаковать ваш цикл в одну строку, попробуйте добавить следующую директиву на вашу страницу:

<%@page trimDirectiveWhitespaces="true"%>
0 голосов
/ 05 августа 2010

JSP не совсем подходящий инструмент для этого. Используйте класс сервлета. Чтобы сохранить несколько байтов в базе данных Stackoverflow, вот лишь ссылка на ответ, который я опубликовал ранее по теме: Экспорт в Excel с использованием JSP .


Тем не менее, у меня есть несколько комментариев к вашему коду и другие ответы:

  1. Не используйте тип содержимого XLS при возврате CSV. Это приведет к предупреждению при открытии файла. Используйте тип контента CSV: text/csv. Excel прекрасно это понимает.

  2. Не отображать HTML по неверному типу контента (тот, который указывает файл XLS (X)). Вы тогда в основном обманываете Excel. Начиная с версии Excel 2007, будут отображаться предупреждения об этом.

0 голосов
/ 05 августа 2010

Чтобы создать файл .xls, вам потребуется нечто более тяжелое, чем JSTL. Apache POI и JExcelApi - это две библиотеки с открытым исходным кодом для создания файлов в формате Excel.POI может генерировать как .xls, так и .xlsx;У меня нет опыта работы с JExcelApi, но, похоже, он поддерживает только .xls.

Как уже упоминалось, в Spring есть AbstractExcelView , который можно расширять и использовать с любой библиотекой.Если вы не используете Spring, вы все равно можете использовать одну из библиотек для генерации объекта Workbook и записи его содержимого в OutputStream объекта ServletResponse.Они также позволят вам форматировать данные различными способами (включая полужирный текст) и даже создавать комментарии и другие элементы Excel.

Для файла .xls вы хотите установить тип содержимого application/vnd.ms-excelи для .xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.

...