अधिक के लिए नीचे मेरा अपडेट देखें।
मेरे पास कभी-कभी ऐसी परियोजनाएँ होती हैं जहाँ मुझे कुछ डेटा एक्सेल फ़ाइल (xlsx प्रारूप) के रूप में आउटपुट करने होते हैं। प्रक्रिया आमतौर पर है:
मेरे आवेदन में उपयोगकर्ता कुछ बटन क्लिक करता है
मेरा कोड एक DB क्वेरी चलाता है और किसी तरह परिणाम संसाधित करता है
मेरा कोड एक्सेल कॉम इंटरॉप लाइब्रेरीज़ या कुछ थर्ड पार्टी लाइब्रेरी (जैसे, असपोज़.कैल्स) का उपयोग करके * .xlsx फ़ाइल बनाता है।
इसे आसानी से ऑनलाइन कैसे किया जाए, इसके लिए मैं कोड उदाहरण आसानी से पा सकता हूं, लेकिन मैं इसे करने के लिए अधिक मजबूत तरीका ढूंढ रहा हूं। मैं अपने कोड को कुछ डिज़ाइन सिद्धांतों का पालन करना चाहूंगा ताकि यह सुनिश्चित हो सके कि मेरा कोड रखरखाव योग्य है और आसानी से समझ में आता है।
यहाँ एक xlsx फ़ाइल बनाने के लिए मेरा प्रारंभिक प्रयास कैसा लगा:
var wb = new Workbook();
var ws = wb.Worksheets[0];
ws.Cells[0, 0].Value = "Header";
ws.Cells[1, 0].Value = "Row 1";
ws.Cells[2, 0].Value = "Row 2";
ws.Cells[3, 0].Value = "Row 3";
wb.Save(path);
पेशेवरों: ज्यादा नहीं। यह काम करता है, इसलिए यह अच्छा है।
विपक्ष:
- सेल संदर्भ हार्डकोड किए गए हैं, इसलिए मेरे पास पूरे कोड में मैजिक नंबर हैं।
- कई सेल संदर्भों को अपडेट किए बिना कॉलम और पंक्तियों को जोड़ना या निकालना मुश्किल है।
- मुझे कुछ तृतीय-पक्ष पुस्तकालय सीखने की आवश्यकता है। कुछ पुस्तकालयों का उपयोग अन्य पुस्तकालयों की तरह किया जाता है, लेकिन अभी भी समस्याएं हो सकती हैं। मुझे एक समस्या थी जहां कॉम इंटरॉप लाइब्रेरीज़ 1-आधारित सेल रेफ़रिंग का उपयोग करती हैं, जबकि असोज़.केल्स 0-आधारित सेल रेफ़रिंग का उपयोग करती हैं।
यहां एक समाधान है जो ऊपर सूचीबद्ध कुछ विपक्षों को संबोधित करता है। मैं डेटा की एक तालिका को अपनी स्वयं की वस्तु के रूप में व्यवहार करना चाहता था जिसे सेल हेरफेर में खोदने और अन्य सेल संदर्भों को परेशान किए बिना बदल दिया जा सकता है। यहाँ कुछ छद्मकोड है:
var headers = new Block(new string[] { "Col 1", "Col 2", "Col 3" });
var body = new Block(new string[,]
{
{ "Row 1", "Row 1", "Row 1" },
{ "Row 2", "Row 2", "Row 2" },
{ "Row 3", "Row 3", "Row 3" }
});
body.PutBelow(headers);
इस समाधान के एक हिस्से के रूप में, मेरे पास कुछ ब्लॉकबाईन ऑब्जेक्ट होंगे जो ब्लॉक के एक कंटेनर को लेते हैं और डेटा को * .xlsx फ़ाइल के रूप में आउटपुट करने के लिए आवश्यक सेल जोड़तोड़ करते हैं। किसी ब्लॉक ऑब्जेक्ट में इससे जुड़ी फ़ॉर्मेटिंग हो सकती है।
पेशेवरों:
- यह उन अधिकांश मैजिक नंबरों को हटा देता है जो मेरे शुरुआती कोड में थे।
- यह बहुत सारे सेल हेरफेर कोड को छुपाता है, हालांकि ब्लॉकबाइन ऑब्जेक्ट में सेल हेरफेर अभी भी आवश्यक है जो मैंने उल्लेख किया था।
- स्प्रैडशीट के अन्य हिस्सों को प्रभावित किए बिना पंक्तियों को जोड़ना और निकालना बहुत आसान है।
विपक्ष:
- कॉलम जोड़ना या निकालना अभी भी मुश्किल है। यदि मैं कॉलम दो और तीन की स्थिति को स्वैप करना चाहता था, तो मुझे सीधे सेल सामग्री को स्वैप करना होगा। इस मामले में कि आठ संपादन होंगे, और इस प्रकार गलती करने के आठ अवसर होंगे।
- यदि मेरे पास उन दो कॉलमों के लिए कोई प्रारूपण है, तो मुझे उसे भी अपडेट करना होगा।
- यह समाधान क्षैतिज ब्लॉक प्लेसमेंट का समर्थन नहीं करता है; मैं केवल एक ब्लॉक को दूसरे से नीचे रख सकता हूं। यकीन है कि मैं कर सकता था
tableRight.PutToRightOf(tableLeft)
, लेकिन अगर टेबलट्राइट और टेबल लाइफ़ की पंक्तियों की अलग-अलग संख्याएँ होतीं तो समस्याएँ पैदा होतीं। टेबल लगाने के लिए, इंजन को हर दूसरे टेबल के बारे में पता होना चाहिए। यह मुझे अनावश्यक रूप से जटिल लगता है। - मुझे अभी भी तृतीय-पक्ष कोड सीखने की आवश्यकता है, हालांकि ब्लॉक ऑब्जेक्ट्स और एक ब्लॉकबाइन के माध्यम से अमूर्त की एक परत के माध्यम से कोड मेरे प्रारंभिक प्रयास की तुलना में तीसरे पक्ष के पुस्तकालय के लिए कम कसकर युग्मित होगा। अगर मैं बहुत सारे अलग-अलग प्रारूपण विकल्पों का समर्थन करना चाहता था, तो मैं शायद बहुत सारे कोड लिखना चाहता हूं; मेरी BlockEngine एक बड़ी गड़बड़ होगी।
यहां एक समाधान है जो एक अलग मार्ग लेता है। यहाँ प्रक्रिया है:
मैं अपना रिपोर्ट डेटा लेता हूं और अपने द्वारा चुने गए किसी प्रारूप में एक xml फ़ाइल उत्पन्न करता हूं।
मैं तब xml फ़ाइल को Excel 2003 XML स्प्रेडशीट फ़ाइल में परिवर्तित करने के लिए एक xsl परिवर्तन का उपयोग करता हूं।
वहाँ से मैं बस एक तृतीय पक्ष लाइब्रेरी का उपयोग करके xml स्प्रेडशीट को xlsx फ़ाइल में परिवर्तित करता हूँ।
मुझे यह पृष्ठ मिला जो एक समान प्रक्रिया का वर्णन करता है और इसमें कोड उदाहरण शामिल हैं।
पेशेवरों:
- इस समाधान के लिए लगभग कोई सेल हेरफेर की आवश्यकता नहीं है। इसके बजाय आप अपने जोड़तोड़ करने के लिए xsl / xpath का उपयोग करें। किसी तालिका में दो कॉलम स्वैप करने के लिए, आप मेरे अन्य समाधानों के विपरीत पूरे कॉलम को xsl फ़ाइल में ले जाते हैं, जिसके लिए सेल-स्वैपिंग की आवश्यकता होगी।
- जबकि आपको अभी भी एक तृतीय-पक्ष लाइब्रेरी की आवश्यकता है जो Excel 2003 XML स्प्रेडशीट को xlsx फ़ाइल में बदल सकती है, इसके लिए आपको लाइब्रेरी की आवश्यकता होगी। आपको जिस कोड को लिखना है, उसे तीसरे पक्ष के पुस्तकालय में कॉल करना होगा।
- मुझे लगता है कि यह समाधान समझने में सबसे आसान है और इसके लिए कम से कम कोड की आवश्यकता होती है।
- कोड जो मेरे अपने xml प्रारूप में डेटा बनाता है, सरल होगा।
- Xsl फ़ाइल केवल जटिल होगी क्योंकि Excel 2003 XML स्प्रेडशीट जटिल है। हालाँकि xsl फ़ाइल के आउटपुट की जाँच करना आसान है: एक्सेल में आउटपुट को खोलें और त्रुटि संदेशों की जाँच करें।
- नमूना 2003 Excel XML स्प्रैडशीट फ़ाइलों को बनाना आसान है: बस एक स्प्रेडशीट बनाएं जो आपकी वांछित xlsx फ़ाइल की तरह दिखती है, और फिर इसे Excel 2003 XML स्प्रेडशीट के रूप में सहेजें।
विपक्ष:
- Excel 2003 XML स्प्रेडशीट कुछ सुविधाओं का समर्थन नहीं करता है। आप उदाहरण के लिए कॉलम की चौड़ाई को ऑटोफिट नहीं कर सकते। आप शीर्ष लेख या पाद लेख में चित्र शामिल नहीं कर सकते। यदि आप परिणामी xlsx फ़ाइल को pdf में निर्यात करने जा रहे हैं, तो आप pdf बुकमार्क सेट नहीं कर सकते। (मैंने सेल टिप्पणियों का उपयोग करके इसे ठीक करने के लिए एक साथ हैक किया।) आपको अपने तीसरे पक्ष के पुस्तकालय का उपयोग करके ऐसा करना होगा।
- एक पुस्तकालय की आवश्यकता है जो Excel 2003 XML स्प्रेडशीट का समर्थन करता है।
- एक 11 वर्षीय एमएस ऑफिस फ़ाइल प्रारूप का उपयोग करता है।
नोट: मुझे पता है कि xlsx फाइलें वास्तव में xml फाइलों वाली ज़िप फाइलें हैं, लेकिन xml स्वरूपण मेरे उद्देश्यों के लिए बहुत जटिल लगता है।
अंत में, मैंने SSRS से जुड़े समाधानों पर ध्यान दिया है, लेकिन ऐसा लगता है कि यह मेरे उद्देश्यों के लिए बहुत फूला हुआ है।
मेरे प्रारंभिक प्रश्न पर वापस, कोड में एक्सेल फाइल बनाने के लिए एक अच्छा डिज़ाइन-पैटर्न क्या है? मैं कुछ समाधानों के बारे में सोच सकता हूं, लेकिन कोई भी आदर्श के रूप में बाहर रहना नहीं चाहता है। प्रत्येक में कमियां हैं।
अपडेट: तो मैंने समान XLSX फ़ाइलों को बनाने के लिए मेरे ब्लॉकबाइन समाधान और मेरे XML स्प्रैडशीट समाधान दोनों की कोशिश की। यहाँ उनके बारे में मेरी राय हैं:
BlockEngine समाधान:
- इसके लिए विकल्पों पर विचार करते हुए बहुत अधिक कोड की आवश्यकता होती है।
- मुझे यह बहुत आसान लगा कि अगर मैं एक ऑफसेट गलत था, तो दूसरे के साथ एक ब्लॉक को ओवरराइट कर सकता हूं।
- मैंने मूल रूप से कहा है कि प्रारूपण को ब्लॉक स्तर पर संलग्न किया जा सकता है। मैंने पाया कि यह ब्लॉक सामग्री से अलग स्वरूपण करने से ज्यादा बेहतर नहीं है। मैं सामग्री और स्वरूपण को मिलाने का अच्छा तरीका नहीं सोच सकता। न ही मैं उन्हें अलग रखने का अच्छा तरीका खोज सकता हूं। यह सिर्फ एक गड़बड़ है।
XML स्प्रेडशीट समाधान:
- मैं अभी के लिए इस समाधान के साथ जा रहा हूँ।
- यह दोहराता है कि इस समाधान को बहुत कम कोड की आवश्यकता है। मैं ब्लॉक एक्वाइन को एक्सेल के साथ प्रभावी रूप से प्रतिस्थापित कर रहा हूं। मुझे अभी भी बुकमार्क और पेज ब्रेक जैसी सुविधाओं के लिए हैक की आवश्यकता है।
- एक्सएमएल स्प्रेडशीट का प्रारूप बारीक है, लेकिन एक छोटा सा बदलाव करना और अपने पसंदीदा डिफ प्रोग्राम में मौजूदा फाइल के परिणामों की तुलना करना आसान है। और एक बार जब आप कुछ idiosyncrasy का पता लगाते हैं, तो आप इसे जगह में रख सकते हैं और वहां से इसके बारे में भूल सकते हैं।
- मैं अभी भी चिंतित हूं कि यह समाधान पुराने Excel फ़ाइल प्रारूप पर निर्भर करता है।
- मेरे द्वारा बनाई गई XSLT फ़ाइल के साथ काम करना आसान है। ब्लॉकचेन समाधान के साथ प्रारूपण से निपटना यहां बहुत सरल है।