我在将数据导出到excel表时遇到问题,这是因为我的团队中的其他开发人员所做的一些代码。因此,主要问题是使用JSP页面将数据导出到Excel或.cvs但不使用任何HTML代码。 任何建议也有助于我在发展中的舞台上探索。谢谢你的努力。
答案 0 :(得分:16)
最好使用Servlet。原始Java代码不属于JSP文件,这只是maintenance trouble的配方。
首先,创建一个简单的Java实用程序类,例如List<List<T>>
或List<Data>
(其中Data
代表一行)代表CSV内容和{{1}作为执行数据复制任务的方法参数和写入逻辑。
一旦你开始工作,创建一个Servlet类,它将一些CSV文件标识符作为请求参数或pathinfo(我建议使用pathinfo作为Redmond团队开发的某个webbrowser,否则将检测到filename / mimetype失败) ,使用标识符从某处获取OutputStream
或List<List<T>>
,并沿着一组正确的响应标头将其写入List<Data>
的{{1}}。
这是一个基本的启动示例:
OutputStream
以下是如何使用它的示例:
HttpServletResponse
在Servlet中你基本上可以做到:
public static <T> void writeCsv (List<List<T>> csv, char separator, OutputStream output) throws IOException {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8"));
for (List<T> row : csv) {
for (Iterator<T> iter = row.iterator(); iter.hasNext();) {
String field = String.valueOf(iter.next()).replace("\"", "\"\"");
if (field.indexOf(separator) > -1 || field.indexOf('"') > -1) {
field = '"' + field + '"';
}
writer.append(field);
if (iter.hasNext()) {
writer.append(separator);
}
}
writer.newLine();
}
writer.flush();
}
将此servlet映射到public static void main(String[] args) throws IOException {
List<List<String>> csv = new ArrayList<List<String>>();
csv.add(Arrays.asList("field1", "field2", "field3"));
csv.add(Arrays.asList("field1,", "field2", "fie\"ld3"));
csv.add(Arrays.asList("\"field1\"", ",field2,", ",\",\",\""));
writeCsv(csv, ';', System.out);
}
之类的内容,并将其调用为protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getPathInfo();
List<List<Object>> csv = someDAO().list();
response.setHeader("content-type", "text/csv");
response.setHeader("content-disposition", "attachment;filename=\"" + filename + "\"");
writeCsv(csv, ',', response.getOutputStream());
}
之类的内容。这基本上都是。 pathinfo中的文件名很重要,因为Redmond团队开发的某个Web浏览器会忽略/csv/*
标题的http://example.com/context/csv/filename.csv
部分,而是使用URL的最后一个路径部分。