EPPlus का उपयोग करते समय कॉलम प्रकार कैसे सेट करें




(4)

मैं Excel फ़ाइलों को उत्पन्न करने के लिए EPPlus का उपयोग कर रहा हूं, डीएएल में मैं EPPlus कर रहा हूं, टेबल में डेटा भर रहा हूं, और प्रेजेंटेशन लेयर में टेबल पास कर रहा हूं। वहां से मैं Excel फ़ाइल उत्पन्न करने के लिए LoadFromDataTable() विधि का उपयोग कर रहा हूं।

सबकुछ ठीक काम करता है, सिवाय इसके कि मैं कॉलम के प्रकार में से किसी एक को Date पर सेट करना चाहता हूं। मैंने अपने EPPlus कॉलम प्रकार को Date पर सेट करने और प्रस्तुति परत पर EPPlus पास करने की कोशिश की, लेकिन ऐसा लगता है कि EPPlus या तो इसे नजरअंदाज कर दिया गया है, या पहचान नहीं आया है, क्योंकि जब मैं Excel फ़ाइल जेनरेट कर रहा हूं, तो सेल का प्रकार Number

यदि मैं मैन्युअल रूप से सेल स्वरूपित करता हूं और टाइप टू Date सेट करता हूं, तो Excel सही तिथियां दिखाता है। तो मैं इसे कैसे प्राप्त कर सकता हूं?


यदि आपके कॉलम चारों ओर घूमने की संभावना है (जैसा कि हम जानते हैं कि अंतिम उपयोगकर्ता फिक्स्ड होते हैं) या आपके पास अपनी स्प्रेडशीट में बिखरे हुए कई डेट कॉलम हैं, तो कुछ और सामान्य जेनेरिक लिखना उपयोगी होगा। यहां मैंने जो लिखा है वह यहां है। यह मेरे पीओसीओ में सभी डेटटाइम प्रकारों की स्थिति पाता है और एक सूची बनाता है जिसे वह कॉलम स्वरूपण सेट करने के लिए उपयोग करता है। याद रखें डेटा टेबल शून्य आधारित हैं और एक्सेल नहीं है।

        ws.Cells.LoadFromDataTable(tbl, true);
        var dPos = new List<int>();
        for (var i = 0; i < tbl.Columns.Count; i++)
            if (tbl.Columns[i].DataType.Name.Equals("DateTime"))
                dPos.Add(i);
        foreach (var pos in dPos)
        {
            ws.Column(pos+1).Style.Numberformat.Format = "mm/dd/yyyy hh:mm:ss AM/PM";
        }

यदि आप एक से अधिक डेटाटेबल कर रहे हैं, तो आप शायद इसे किसी फ़ंक्शन में रीफैक्टर करना चाहेंगे।

और यहां एक फ्रीबी है ... मैं इस कोड के लिए क्रेडिट नहीं ले सकता। यह एक पीओसीओ सूची लेता है और इसे डेटा टेबल में बदल देता है। इसने मेरे 'टूलकिट' में होने वाले कई अवसरों पर अपना जीवन आसान बना दिया है। का आनंद लें।

        public DataTable ConvertToDataTable<T>(IList<T> data)
    {
        var properties =
           TypeDescriptor.GetProperties(typeof(T));
        var table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            var row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }

आपको सही प्रकार के लिए डेटाटेबल कॉलम की आवश्यकता है लेकिन आपको कॉलम या सेल की शैली को संशोधित करने की आवश्यकता है। Numberformat.Format प्रॉपर्टी।

मान लें कि आपके पास ExcelWorksheet नाम है ws :

ws.Column(1).Style.Numberformat.Format  = "yyyy-mm-dd"; 
//OR "yyyy-mm-dd h:mm" if you want to include the time!

एक्सेल प्रारूपों में निर्माण का उपयोग करने के लिए, आपको सही स्ट्रिंग को पास करने की आवश्यकता है

sheet.Cells[1, 1].Style.Numberformat.Format 

संपत्ति।

अब, कहीं बाद निष्पादन के दौरान, शायद क्रमिकरण के दौरान, ईपीप्लस इस प्रारूप संपत्ति से कार्यपुस्तिका में शैलियों के वर्तमान शब्दकोश के साथ मिलान करने का प्रयास करेगा। यह सटीक लाइब्रेरी संस्करण पर निर्भर हो सकता है, लेकिन उदाहरण के लिए EPPlust 4.1.0.0 छोटी तारीख कुंजी "mm-dd-yy" है।

4.1.0.0 के लिए आप प्रारूपों में निर्माण के लिए सभी हार्ड-कोड कोड और कुंजी पा सकते हैं:

  1. ExcelNumberFormatXml.cs, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) - यहां उन सभी कोडों को वास्तव में कार्यपुस्तिका में शामिल किया गया है, सभी हार्ड-कोडित
  2. डीबगर का उपयोग करें और Workbook.Styles.NumberFormats जांच करें। ExcelNumberFormatXml.Format गणना (कुंजी के रूप में ExcelNumberFormatXml.Format )
  3. डीबगर का प्रयोग करें और Workbook.Styles.NumberFormats. जांच करें Workbook.Styles.NumberFormats. (गैर सार्वजनिक memeber) _dic सटीक कुंजी के लिए।

इस चर्चा के आधार पर ( epplus.codeplex.com/discussions/349927 ) आप तिथि पर कॉलम प्रारूप भी सेट कर सकते हैं।

worksheet_1.Cells[row, 3].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;