标签 JSP 下的文章

公司网站需要添加导出CSV文件的功能。一开始想用模板文件的方式导出,但是需要读取模板、分析需要替换的标识、格式化字符串、写文件等,太麻烦了。由于是web导出,就想用JSP实现。

首先,需要简单了解CSV文件规范:
1)可以采用UTF-8字符集编码,但是要带BOM,否则Excel打开后,Unicode字符会乱码。

2)一行一条数据,空行会当作一行空数据。同一行的各个数据之间用逗号分隔,每行的数据个数可以不相同。

3)每个数据用双引号括住,可以避免绝大部分的符号问题。比如在双引号里的换行符和逗号不会被解析。唯一需要转义的是双引号,转义符也是双引号。就是双引号里出现的每个双引号,要换成两个双引号。

示例代码:

<%@ page language="java" pageEncoding="UTF-8" trimDirectiveWhitespaces="true" contentType="application/x-download"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<% 
    response.addHeader("Content-Disposition","attachment;filename=ShoppingCart.csv"); // 导出的文件名
    out.print("\ufeff"); // UTF-8的BOM
%>"Name","Sex","Score"
<c:forEach items="${students}" var="student">"${fn:replace(student.name, "\"", "\"\"")}","${student.sex}","${student.score}"
</c:forEach>

简单解析:
1)第一行的trimDirectiveWhitespaces="true",设置自动清除空行。即多个<% %>行,执行完毕后只保留最后一个%>后面的内容,包括换行符。这个清除空行是不完全的,但这样设置最简单。

2)第一行的contentType="application/x-download",设置浏览器可识别的文件类型。这个设置,浏览器打开链接后会自动下载。

3)taglib引入需要用到的标签,例如JSTL或自定义的标签。

4)response.addHeader("Content-Disposition","attachment;filename=ShoppingCart.csv");是设置导出的文件名。

5)out.print("\ufeff");输出UTF-8的BOM。

6)剩下的就是文件内容了。注意换行的问题就可以了。