2009-11-18 14 views
8

पर डेटा निर्यात करने के लिए HTML कोड के बिना जेएसपी पृष्ठ मुझे एक्सेल शीट में अपना डेटा निर्यात करने में समस्या का सामना करना पड़ रहा है, यह मेरी कोड में अन्य डेवलपर्स के कुछ कोड के कारण है। इसलिए मुख्य समस्या जेएसपी पेज का उपयोग कर एक्सेल या .cvs को डेटा निर्यात करना है, लेकिन किसी भी HTML कोड का उपयोग किए बिना। कोई सुझाव मुझे मेरे विकासशील क्षेत्र में अन्वेषण करने में भी मदद करेगा। आपके प्रयासों के लिए धन्यवाद।एक्सेल शीट

उत्तर

16

इसके लिए एक सर्वलेट का बेहतर उपयोग करें। कच्चा जावा कोड जेएसपी फ़ाइल में नहीं है, यह maintenance trouble के लिए बस नुस्खा है।

शुरू करने के लिए, एक साधारण जावा उपयोगिता वर्ग जो उदाहरण के लिए ले जाता है बनाने के एक List<List<T>> या एक List<Data> (जिसमें Data एक पंक्ति का प्रतिनिधित्व करता है) सीएसवी सामग्री और एक OutputStream विधि तर्कों के रूप का प्रतिनिधित्व करने और तर्क जो कार्य को कॉपी डेटा करता लिखें।

एक बार जब आप इसे काम करने के लिए प्राप्त करते हैं, तो एक सर्वलेट क्लास बनाएं जो कुछ सीएसवी फ़ाइल पहचानकर्ता को अनुरोध पैरामीटर या पथइन्फो के रूप में लेता है (मैं रेडमंड में एक टीम द्वारा विकसित एक निश्चित वेबब्रोसर के रूप में pathinfo का उपयोग करने की अनुशंसा करता हूं अन्यथा फ़ाइल नाम/mimetype का पता लगाने में विफल रहता है), कहीं से List<List<T>> या List<Data> प्राप्त करने के लिए पहचानकर्ता का उपयोग करता है और सही प्रतिक्रिया शीर्षकों के सेट के साथ HttpServletResponse के 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(); 
} 

यहाँ एक उदाहरण है कि कैसे आप इसका इस्तेमाल कर सकते हैं::

यहाँ एक बुनियादी किकऑफ़ उदाहरण है

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()); 
} 

मानचित्र /csv/* जैसे कुछ पर यह सर्वलेट और इसेजैसे कुछ के रूप में आमंत्रित करें। यह मूल रूप से सब है। Pathinfo में फ़ाइल नाम महत्वपूर्ण है क्योंकि रेडमंड में एक टीम द्वारा विकसित एक निश्चित वेबब्रोसर Content-Disposition शीर्षलेख के filename भाग को अनदेखा करता है और इसके बजाय यूआरएल के अंतिम पथ भाग का उपयोग करता है।

+1

निश्चित रूप से सर्वलेट के लिए एक नौकरी। +1 – ChadNC

+0

मैंने इस तरह के समाधान की कोशिश की लेकिन मुझे https के माध्यम से फ़ाइल प्राप्त करने में समस्याएं थीं। यह https के माध्यम से क्यों विफल हो सकता है? –

+0

समस्या कहीं और है। दाएं शीर्ष पर 'प्रश्न पूछें' बटन दबाकर अपना प्रश्न पूछें और समस्या को विस्तार से विस्तृत करें। – BalusC

संबंधित मुद्दे