我想从servlet.Data
来自Object[] obj=search.getSearch();
object[]
下载csv文件
我有{{1}}的数据,我需要写入csv并下载。
你能帮我解决一下servlet类的问题吗?
答案 0 :(得分:11)
Object[]
如何表示CSV数据?它是包含一行有多列还是多行有一列?我认为Object[][]
或List<List<Object>>
更有意义。
无论如何,在创建CSV文件时,您必须遵守RFC4180 spec。它基本上很简单,只有3条严格的规则:
这是一个启动示例,它基于List<List<T>>
作为来源,OutputStream
作为目的地。
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中使用它:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<List<Object>> csv = getItSomehow();
response.setHeader("Content-Type", "text/csv");
response.setHeader("Content-Disposition", "attachment;filename=\"file.csv\"");
writeCsv(csv, ';', response.getOutputStream());
}
(请注意,基于欧洲的语言环境对CSV文件使用分号而不是逗号,随时可以更改)
Content-Disposition
attachment
将强制另存为对话框。请注意,MSIE有一个错误行为,即它不会将filename
作为另存为对话框中的默认文件名,但它取代了pathinfo的最后一部分。因此,如果这个servlet例如由http://example.com/csv调用,那么你将获得csv
作为默认文件名。而是将其附加到pathinfo,如下面的http://example.com/csv/file.csv。 servlet只应映射到url-pattern
/csv/*
而不是/csv
。
答案 1 :(得分:1)
这是一次尝试:
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Other stuff you know that I don't..
Object[] data = search.getSearch();
response.setContentType("text/csv");
PrintWriter out = response.getWriter();
for (Object d : data) {
out.println(d.field1 + "," + d.field2 + "," + d.field3 + ...);
}
}
如果您的字段包含数据逗号,则会损坏。我告诉你如何做到这一点,因为它很快Google Search。
答案 2 :(得分:1)
答案 3 :(得分:0)
以下是我运行的生产servlet中的一些(为简洁和通用而编写)代码。使用下面的代码交换特定的数据数组应该是微不足道的。
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "attachment; filename=\"TSR.csv\"");
try {
// Write the header line
OutputStream o = res.getOutputStream();
String header = "ID,ControlNumber\n";
o.write(header.getBytes());
// Write the data lines
Vector records = getRecords(); // Custom to my app
Iterator i = records.iterator();
while (i.hasNext()) {
// Custom data object; use your own
StandardReportDTO sr = (StandardReportDTO) i.next();
StringBuffer line = new StringBuffer();
line.append(sr.getID());
line.append(",");
line.append(sr.getControlNumber());
line.append("\n");
o.write(line.toString().getBytes());
o.flush();
}
} catch (Exception e) {
// log.error(e);
}
}