Java 如何使用JSP/JSTL创建CSV文件

Java 如何使用JSP/JSTL创建CSV文件,java,jsp,csv,jstl,export-to-excel,Java,Jsp,Csv,Jstl,Export To Excel,我创建了一个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=

我创建了一个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}

${ReportInfo.reportType},M,W,其他
${rrow.subjectCode},${rrow.MCount},${rrow.WCount},${rrow.OCount}
总计,${ReportInfo.totalMSections},${ReportInfo.totalWSections},${ReportInfo.totalOSections}
当我在Excel中打开它时,每行由两行分隔

有没有一种简单的方法可以用这种方式创建excel文件


有没有一种简单的方法可以添加一些格式(如列标题的粗体文本)?

更好的方法是Spring及其应用程序。

为了创建.xls文件,您需要比JSTL更重的任务。和是两个用于生成本机Excel格式文件的开源库。POI可以生成.xls和.xlsx;我没有使用JExcelApi的经验,但它似乎只支持.xls

正如duffymo所提到的,Spring有一个可扩展的库,可以与任何一个库一起使用。但是,如果您没有使用Spring,您仍然可以使用其中一个库来生成工作簿对象,并将其内容写入ServletResponse的OutputStream。它们还允许您以各种方式(包括粗体文本)格式化数据,甚至创建注释和其他Excel元素


对于.xls文件,您需要将内容类型设置为
application/vnd.ms excel
,对于.xlsx
application/vnd.openxmlformats officedocument.spreadsheetml.sheet

,得到空行的原因是JSP在循环中呈现空行。您可以通过将循环打包成一行来消除它们:

<c:forEach var="rrow" items="${ReportInfo.list}"  varStatus="rowCounter">${rrow.subjectCode},${rrow.MCount},${rrow.WCount},${rrow.OCount}</c:forEach>
${row.subjectCode},${row.MCount},${row.WCount},${row.OCount}
或者您可以添加一个servlet过滤器,从响应中删除空行

但是,如果您想添加特殊格式,我认为这超出了逗号分隔值格式,您需要按照其他人的建议生成excel本机文件

编辑:不要将循环打包成一行,而是尝试将以下指令添加到页面中:

<%@page trimDirectiveWhitespaces="true"%>

一个简单的方法是使用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>

${row.subjectCode}
${row.MCount}
${row.WCount}
${row.OCount}

JSP并不是完全正确的工具。使用servlet类。为了在Stackoverflow的数据库中保存一些字节,这里有一个链接,指向我之前发布的关于主题的答案:


也就是说,我对您的代码和其他答案有一些评论:

  • 返回CSV时不要使用XLS内容类型。这将导致在打开文件时出现警告。使用CSV内容类型:
    text/CSV
    。Excel完全理解这一点

  • 不要使用错误的内容类型(表示XLS(X)文件的内容类型)呈现HTML。你基本上是在愚弄Excel。自2007年Excel版本以来,它将显示有关此问题的警告


  • 我推荐JExcelAPI而不是POI(根据我最近的经验,它使用的内存要少得多),尽管它们都非常可靠,“我们发现JExcelApi更直观,而且,JExcelApi具有更好的图像处理能力。然而,在使用JExcelApi时,大型Excel文件存在内存问题。“我在Spring2.0文档中发现了这一点,它可能比您的体验更为流行。Andy Khan的Jetcel确实远远优于POI。这就是Spring在其ExcelView中使用的功能。谢谢,这只是我一直在寻找的简单技巧。我将标题设置为使用以xsl结尾的文件名,它工作得非常好。我不认为Excel“完全理解”CSV。在使用ASCII CSV时,它似乎表现得足够好,但在非ASCII UTF-8上会出现问题。它将接受带BOM的制表符分隔(非逗号分隔)UTF-16。这有点乱,而且LibreOffice好得多。