Bal*_*usC 11
怎么能Object[]代表CSV数据?它是包含一行有多列还是多行有一列?我想象Object[][]或List<List<Object>>更有意义.
无论如何,在创建CSV文件时,您必须遵守RFC4180规范.它基本上很简单,只有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();
}
Run Code Online (Sandbox Code Playgroud)
以下是如何在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());
}
Run Code Online (Sandbox Code Playgroud)
(请注意,基于欧洲的语言环境对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.
| 归档时间: |
|
| 查看次数: |
20642 次 |
| 最近记录: |