[英]How to use JSP/JSTL to create a CSV file
我創建了一個jsp文件,上面有一個簡單的表。
我想創建另一個用戶可以在Excel中打開或另存為xls的jsp文件。
這是我的整個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文件?
有沒有簡單的方法來添加一些格式(例如列標題的粗體文本)?
更好的方法是Spring及其JExcelView 。
空行的原因是JSP在循環內渲染了空行。 您可以通過將循環打包到一行來消除它們:
<c:forEach var="rrow" items="${ReportInfo.list}" varStatus="rowCounter">${rrow.subjectCode},${rrow.MCount},${rrow.WCount},${rrow.OCount}</c:forEach>
或者,您可以添加一個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>
為了創建.xls文件,您將需要比JSTL更重的工作。 Apache POI和JExcelApi是用於生成本機Excel格式文件的兩個開源庫。 POI可以同時生成.xls和.xlsx; 我沒有JExcelApi的經驗,但它似乎僅支持.xls。
正如duffymo提到的那樣,Spring具有AbstractExcelView ,您可以擴展它並與任何一個庫一起使用。 但是,如果您不使用Spring,則仍然可以使用其中一個庫來生成Workbook對象,並將其內容寫入ServletResponse的OutputStream。 它們還將使您以各種方式(包括粗體文本)格式化數據,甚至創建注釋和其他Excel元素。
對於.xls文件,您需要將content-type設置為application/vnd.ms-excel
,對於.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
。
JSP並不是完全正確的工具。 使用Servlet類。 為了將某些字節保存在Stackoverflow的數據庫中,這只是我之前在主題上發布的答案的鏈接: 使用JSP導出到excel 。
也就是說,我對您的代碼和其他答案有幾點評論:
返回CSV時不要使用XLS內容類型。 這將在打開文件期間導致警告。 使用CSV內容類型: text/csv
。 Excel完全理解這一點。
請勿使用錯誤的內容類型(表示XLS(X)文件的一種)呈現HTML。 然后,您基本上是在欺騙Excel。 從Excel 2007版開始,它將顯示有關此的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.