2012-09-05 14 views
6

मैं थोड़ी देर के लिए स्टैक ओवरफ्लो का उपयोग कर रहा था और इससे मुझे अक्सर मदद मिली। अब मुझे एक समस्या है जो मैं स्वयं को या खोज के माध्यम से हल नहीं कर सका। मैं ब्राउज़र में openpyxl द्वारा जेनरेट की गई मेरी एक्सेल फ़ाइल को आउटपुट करने का प्रयास कर रहा हूं क्योंकि मैं इसे phpexcel के साथ कर रहा था। विधि एक जैसी प्रतीत होती है, लेकिन मुझे केवल टूटी हुई फ़ाइल मिलती है। मेरा कोड इस तरह दिखता है:ब्राउज़र में Openpyxl द्वारा जेनरेट किए गए xlsx को आउटपुट कैसे करें?

from openpyxl.workbook import Workbook 
from openpyxl.writer.excel import ExcelWriter 
from openpyxl.writer.excel import save_virtual_workbook 
from openpyxl.cell import get_column_letter 
from StringIO import StringIO 

print 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
print 'Content-Disposition: attachment;filename="results.xlsx"' 
print 'Cache-Control: max-age=0\n' 

output = StringIO() 

wb = Workbook() 

ws = wb.worksheets[0] 

ws.cell('A1').value = 3.14 

wb.save(output) 
print output.getvalue() 
#print save_virtual_workbook(wb) 

मैं संस्करण 1.5.8 और पायथन 2.7 का उपयोग करता हूं। कोई भी दृष्टिकोण काम नहीं करता है। जब मैं इसे डेस्कटॉप से ​​उपयोग करता हूं और ब्राउजर नहीं करता तो यह बेकार ढंग से काम करता है। मैं मदद के लिए बहुत आभारी हूं।

पीएस कृपया मुझे मत बताएं कि अन्य भाषा या प्रोग्राम का उपयोग करना आसान होगा। मुझे इसे अजगर के साथ हल करने की जरूरत है।

+0

इस प्रश्न से, मुझे लगता है कि आपको पाइथन में वेब प्रोग्रामिंग के बारे में कोई अनुभव नहीं है। आप इस दस्तावेज़ को अपने दस्तावेज़ रूट में * .py के अंदर नहीं डाल सकते हैं और इसे * .php की तरह चलाने की उम्मीद करते हैं। – Dikei

+0

आपकी सामग्री- * शीर्षलेख त्रुटिपूर्ण दिखते हैं। उन्हें सीआर/एलएफ लाइन के अंत का उपयोग करना चाहिए। क्या आप इस स्क्रिप्ट द्वारा सही तरीके से कार्यरत एक सरल 'टेक्स्ट/एचटीएमएल' नमूना प्राप्त कर सकते हैं? यदि नहीं, तो पहले इसे ठीक करें। – tripleee

+0

मुझे सीजीआई-बिन से इसे चलाने के लिए पर्याप्त अनुभव है। मेरे पास अन्य स्क्रिप्ट चल रही हैं। यह वही है जो मुझे चाहिए जो आउटपुट नहीं कर रहा है। हां स्वच्छ पाठ/एचटीएमएल पूरी तरह से काम करता है, कम से कम जहां तक ​​मैंने परीक्षण किया था। मुझे नहीं पता कि मुझे सीआर/एलएफ का उपयोग क्यों करना चाहिए ... – seeebek

उत्तर

-5

यदि आप अपनी स्प्रेडशीट की तरह दिखने वाली एक HTML तालिका बनाना चाहते हैं, तो आप शायद सीएसवी के साथ काम करना चाहते हैं। या तो Excel के बजाय, या इसे बनाने के बाद अपने एक्सेल को CSV में परिवर्तित करें।

किसी भी मामले में, एक बार आप सीएसवी प्रारूप में डेटा है, तो यह केवल अजगर का उपयोग कर HTML पृष्ठ का निर्माण करने और CSV डेटा के माध्यम से पाशन, जबकि अपनी <table>, <tr>, और <td> टैग्स डालने की बात है, के रूप में उपयुक्त ।

+0

हां मुझे पाइथन में वेब प्रोग्रामिंग के साथ बहुत अधिक अनुभव नहीं है। मेरा मोर्क इस तरह के कुछ ऐप्स को php से पायथन तक अनुवाद करना है और अब मैं phppyton -> openpyxl से फंस गया हूं। मुझे एक ही व्यवहार की ज़रूरत है। जो किसी अन्य स्क्रिप्ट से डेटा प्राप्त कर रहा है, इसे इस स्क्रिप्ट पर भेजकर इसे एक्सेल फ़ाइल में डालकर ब्राउज़र में डाउनलोड के रूप में आउटपुट कर रहा है। संभवतः इसे सर्वर पर सहेजने के बिना। – seeebek

+0

@ डेविड सवाल विशेष रूप से एक्सेल फ़ाइल की सेवा करने के बारे में है। 'सामग्री-लंबाई' शीर्षलेख सहित –

0

आपकी स्क्रिप्ट मेरे लिए काम करती है क्योंकि आप बिना बदलाव किए उम्मीद करते हैं।

मैं केवल यह मान सकता हूं कि आपको अपने सीजीआई स्क्रिप्ट सेटअप में कोई समस्या है।

सुनिश्चित करें कि आपके पास निर्देशिका है जहां स्क्रिप्ट वास्तव में वेब सर्वर द्वारा सेवा की जाती है। अपाचे पर आप इसे प्राप्त कर सकते हैं:

ScriptAlias /cgi-bin/ /home/WWW/localhost/cgi-bin/ 

सुनिश्चित करें कि स्क्रिप्ट अनुमतियों को सेट करके स्क्रिप्ट योग्य है। कमांडलाइन ऑपरेशन (python scriptname) के लिए जो आपके वेबब्रोसर के लिए आवश्यक नहीं था। और सुनिश्चित करें कि वेबसर्वर का मालिक स्क्रिप्ट को उत्साहित कर सकता है, क्योंकि वेबसर्वर शायद आपके जैसा नहीं चलता है।

1

डिस्क पर xlsx आउटपुट लिखना और फिर अपाचे के माध्यम से इसे प्रस्तुत करना पूरी तरह से काम करता है, लेकिन एक्सेल और अन्य मुद्दों में सीधे त्रुटियों को उत्पन्न करता है।

मैं अतिरिक्त कदम की एक जोड़ी जोड़ा गया है और अपने कोड में एक मामूली परिवर्तन किए गए:

buffer=output.getvalue() 

HTTP हेडर में:

print "Content-Length: " + str(len(buffer)) 

और write() बजाय print() इस्तेमाल किया में बफर पुश करने के लिए मानक आउटपुट स्ट्रीम:

stdout.write(buffer) 
+0

+1। मैं इसे बिना काम करने के लिए _could_ प्राप्त नहीं करता हूं। जब मैंने 'प्रिंट save_virtual_workbook (wb) 'का उपयोग किया, तो मेरी परिणामी ज़िप्ड फ़ाइल में दो अतिरिक्त बाइट थे। अगर मैंने 'stdout.write()' का उपयोग किया था, तो इसमें एक अतिरिक्त बाइट था। 'सामग्री-लंबाई' प्रदान करना इसे ठीक करता है। – Auspex

5

यह मेरे लिए काम है। मैं कुप्पी

... code ... 

import StringIO 
from openpyxl import Workbook 
wb = Workbook() 
ws = wb.active # worksheet 
ws.title = "Excel Using Openpyxl" 
c = ws.cell(row=5, column=5) 
c.value = "Hi on 5,5" 
out = StringIO.StringIO() 
wb.save(out) 
out.seek(0) 

return send_file(out, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 
      attachment_filename='xxl.xlsx', as_attachment=True) 
+2

यह भयानक अलियासिंग है! 'आईओ आयात बाइट्सियो' से ऐसा करने का तरीका है। –

0

से python 2.7 और नवीनतम openpyxl और send_file का उपयोग करते हैं एक्सेल एक द्विपदीय प्रारूप आप BytesIO बफ़र होना का उपयोग करना चाहिए उपयोग करता है।

from io import BytesIO

लेकिन अगर आप save_virtual_workbook() का उपयोग आप क्या त्रुटि हो रही है आप के लिए यह करता है जो?

2
output = HttpResponse(mimetype='application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') 
file_name = "Test.xlsx" 
output['Content-Disposition'] = 'attachment; filename='+ file_name 

wb = Workbook() 

ws = wb.worksheets[0] 

ws.cell('A1').value = 3.14 

wb.save(output) 

return output 

मैंने ओपनपीएक्सएल के साथ अपनी फाइलें डाउनलोड करने के लिए इन युक्तियों का उपयोग किया। उम्मीद है कि

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