2012-06-27 15 views
15

का उपयोग करके उपयोगकर्ताओं को डाउनलोड करने के लिए एक्सेल फ़ाइल बनाएं I apache poi का उपयोग करके एक्सेल फ़ाइल बनाने में सक्षम हूं। हालांकि, मैं चाहता हूं कि उपयोगकर्ता इसे "सत्य" एक्सेल फ़ाइल के रूप में डाउनलोड कर सकें। जिस प्रभाव को मैं प्राप्त करना चाहता हूं वह एक पॉपअप बॉक्स होगा जो उपयोगकर्ता को फ़ाइल डाउनलोड करने की अनुमति देगा। यह एक महत्वपूर्ण अपवाद के साथअपाचे पीओआई

<%@ page contentType="application/vnd.ms-excel" pageEncoding="ISO-8859-1"%> 
<%response.setHeader("Content-Disposition", "attachment;filename=myfile.xls"); %> 

का उपयोग कर के समान है: मैं उपयोगकर्ता एक उचित एक्सेल फाइल डाउनलोड करने की अनुमति देनी चाहिए। मैंने कहीं ऊपर दिए गए कोड को क्लाइंट को बताया है कि सर्वर एक्सेल फ़ाइल

उत्तर

32

जेएसपी फ़ाइल के बजाय सामान्य सर्वलेट में नौकरी करें। एक जेएसपी फ़ाइल गतिशील रूप से एचटीएमएल कोड उत्पन्न करने के लिए है और इसके लिए एक बाइनरी आउटपुट स्ट्रीम के बजाय एक चरित्र लेखक का उपयोग कर रहा है और इस प्रकार केवल आपकी पीओआई-जेनरेट की गई एक्सेल फ़ाइल को भ्रष्ट कर देगा जो संक्षेप में एक बाइनरी स्ट्रीम है।

तो, मूल रूप से आप सभी सर्वलेट की doGet() विधि में क्या करने की जरूरत निम्नलिखित है:

response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition", "attachment; filename=filename.xls"); 
HSSFWorkbook workbook = new HSSFWorkbook(); 
// ... 
// Now populate workbook the usual way. 
// ... 
workbook.write(response.getOutputStream()); // Write workbook to response. 
workbook.close(); 

अब, यह डाउनलोड करने के लिए, अपने बजाय यूआरएल JSP फ़ाइल से सर्वलेट आह्वान।

+0

writableworkbook का हिस्सा है jexcel एपीआई सही है? अगर मैं पीओआई सही का उपयोग कर रहा हूं तो भी यह काम करना चाहिए? – user571099

+0

@ user571099 कार्यपुस्तिका एक 'HSSFWorkbook' है, न कि' WritableWorkbook'। –

+0

यह वही था जो मैं ढूंढ रहा था! मुझे लगता है कि यह जर्सी रीस्टफुल वेब सेवा के साथ भी किया जा सकता है? – Brian

20

हालांकि यह सच है कि जेएसपी की बजाय सर्वलेट का उपयोग करके बाइनरी अटैचमेंट लिखना अधिक सामान्य है, यह निश्चित रूप से एक जेएसपी से बाइनरी अटैचमेंट लिखना संभव है। और ऐसा करने का लाभ यह है कि आपको web.xml को कॉन्फ़िगर करने या अपने एप्लिकेशन को पुनः लोड करने के बारे में चिंता करने की आवश्यकता नहीं है। यह आपके वेब सर्वर पर्यावरण के आधार पर एक महत्वपूर्ण विचार हो सकता है।

यहां एक उदाहरण जेएसपी है जो ब्राउज़र पर बाइनरी अटैचमेंट भेजने के लिए poi का उपयोग करता है।

<%@page import="org.apache.poi.hssf.usermodel.*" %><%@page import="java.io.*" %><% 

// create a small spreadsheet 
HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet(); 
HSSFRow row = sheet.createRow(0); 
HSSFCell cell = row.createCell(0); 
cell.setCellValue("Some text"); 

// write it as an excel attachment 
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); 
wb.write(outByteStream); 
byte [] outArray = outByteStream.toByteArray(); 
response.setContentType("application/ms-excel"); 
response.setContentLength(outArray.length); 
response.setHeader("Expires:", "0"); // eliminates browser caching 
response.setHeader("Content-Disposition", "attachment; filename=testxls.xls"); 
OutputStream outStream = response.getOutputStream(); 
outStream.write(outArray); 
outStream.flush(); 

%> 

महत्वपूर्ण चाल सुनिश्चित करें कि आपके सभी आयातों और "<%" है कि अपने कोड शुरू होता है से पहले अन्य निर्देशों के साथ केवल एक लाइन नहीं है बनाने के लिए है। अन्यथा, जेएसपी कुछ प्रारंभिक नई लाइनों को आउटपुट कर सकता है और आपके आउटपुट को दूषित कर सकता है।

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

+0

उत्तर के लिए धन्यवाद लेकिन क्या मैं आपसे पूछ सकता हूं कि आप xls फ़ाइल के पथ को कहां परिभाषित करते हैं? मेरा मतलब है, कैसे jsp जानता है, उस xls फ़ाइल को कहां से चुनना है? क्या यह पीडीएफ के साथ काम कर सकता है, जिसे पहले जावा कार्यक्रम द्वारा बनाया गया था? –

0

आप डॉन डाउनलोड करना चाहते हैं, यह कार्यपुस्तिका यह धीमी होगा hssf का उपयोग करें और अधिक स्थान की खपत का उपयोग apche POI 3.17 बीटा-1

SXSSFWorkbook workbook = new SXSSFWorkbook(100); 
workbook.setCompressTempFiles(true); 
Sheet sh = workbook.createSheet(); 
//write your data on sheet 

//below code will download file in browser default download folder 
response.setContentType("application/vnd.ms-excel"); 
      response.setHeader("Content-Disposition", "attachment; filename="+filename+".xlsx"); 
      workbook.write(response.getOutputStream()); 
      workbook.close(); 
      workbook.dispose(); 

के लिए PDF उपयोग iText

 Document document = new Document(); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      PdfWriter.getInstance(document, baos); 
      document.open(); 
//write your code 

document.add("content"); 
      document.close(); 
      response.setHeader("Expires", "0"); 
      response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0"); 
      response.setHeader("Pragma", "public"); 
      response.setContentType("application/pdf"); 
      response.addHeader("Content-Disposition", "attachment; filename="+filename+".pdf"); 
      response.setContentLength(baos.size()); 
      OutputStream os = response.getOutputStream(); 
      baos.writeTo(os); 
      os.flush(); 
      os.close(); 
संबंधित मुद्दे