我想從servlet.Data
下載csv文件來自Object[] obj=search.getSearch();
如何使用servlet創建csv文件?
我有數據object[]
,我需要編寫成CSV和下載。
你能幫助我如何在servlet類中做什麼?
我想從servlet.Data
下載csv文件來自Object[] obj=search.getSearch();
如何使用servlet創建csv文件?
我有數據object[]
,我需要編寫成CSV和下載。
你能幫助我如何在servlet類中做什麼?
下面是一個嘗試:
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。
下面是從生產的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);
}
}
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只能映射到/csv/*
的url-pattern
而不是/csv
。
可以寫成'public static void writeCsv(List <?extends List >> csv,char separator,OutputStream output)'並將所有'T'改爲'?' – user102008 2011-08-31 03:59:33