application/vnd.ms-excel
सामग्री प्रकार के साथ सादे HTML तालिका का उपयोग न करें। फिर आप मूल रूप से Excel को गलत सामग्री प्रकार के साथ बेवकूफ़ बना रहे हैं जो नवीनतम Excel संस्करणों में विफलता और/या चेतावनियों का कारण बनता है। जब आप एक्सेल में इसे संपादित और सहेजते हैं तो यह मूल HTML स्रोत को भी गड़बड़ कर देगा। बस ऐसा मत करो।
बदले में सीएसवी एक मानक प्रारूप है जो बिना किसी समस्या के एक्सेल से डिफ़ॉल्ट समर्थन का आनंद लेता है और वास्तव में उत्पन्न करने के लिए आसान और स्मृति-कुशल है। यद्यपि पुस्तकालय हैं, आप वास्तव में 20 से कम लाइनों में आसानी से लिख सकते हैं (उन लोगों के लिए मजाकिया जो प्रतिरोध नहीं कर सकते हैं)।
- फील्ड्स अल्पविराम से अलग कर रहे हैं: तुम बस RFC 4180 कल्पना जो मूल रूप से केवल 3 नियम शामिल हैं पालन करने के लिए है।
- यदि कोई अल्पविराम किसी क्षेत्र के भीतर होता है, तो फ़ील्ड को डबल कोट्स से घिरा होना चाहिए।
- यदि किसी फ़ील्ड के भीतर एक डबल कोट होता है, तो फ़ील्ड को डबल कोट्स से घिरा होना चाहिए और फ़ील्ड के भीतर डबल कोट को दूसरे डबल कोट से बचाना होगा।
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);
}
और एक सर्वलेट अंदर (हाँ, सर्वलेट, JSP इस के लिए उपयोग नहीं करते हैं:
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();
}
यहाँ एक उदाहरण है कि कैसे आप इसका इस्तेमाल कर सकते हैं:
यहाँ एक किकऑफ़ उदाहरण है !) आप मूल रूप से कर सकते हैं:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getPathInfo().substring(1);
List<List<Object>> csv = someDAO().findCsvContentFor(filename);
response.setHeader("content-type", "text/csv");
response.setHeader("content-disposition", "attachment;filename=\"" + filename + "\"");
writeCsv(csv, ';', response.getOutputStream());
}
इस सर्वलेट को कुछ पसंद पर मानचित्र करें ई /csv/*
और इसे http://example.com/context/csv/filename.csv
जैसे कुछ के रूप में आमंत्रित करें। बस इतना ही।
ध्यान दें कि मैं अलग विभाजक वर्ण निर्दिष्ट करने के लिए possiblity कहा, क्योंकि यह प्रयोग किया जाता है कि क्या एक्सेल एक अल्पविराम ,
या सीएसवी क्षेत्र विभाजक के रूप में अर्धविराम ;
स्वीकार करेंगे वातावरण पर निर्भर हो सकता। ध्यान दें कि मैंने यूआरएल pathinfo में फ़ाइल नाम भी जोड़ा है, क्योंकि रेडमंड में एक टीम द्वारा विकसित एक निश्चित वेबब्रोसर अन्यथा उचित फ़ाइल नाम के साथ डाउनलोड को सहेज नहीं पाएगा।
+1 "सादा HTML" टिप के लिए +1; कई मामलों में यह काम करेगा, और यह बहुत आसान है। – Jonik
इसे सरल रखना अक्सर सबसे अच्छा तरीका है। अच्छा जवाब – SWD