EPPlus के साथ XLSX सेल की चौड़ाई कैसे सेट करें?


81

हैलो, मेरे पास यह कोड है जहां मैं एक xlsx फ़ाइल बनाता हूं और मुझे xlsx शीट कोशिकाओं की चौड़ाई सेट करने की आवश्यकता है। वास्तविक समस्या यह है कि जब मैं एक्सेल को खोलता हूं तो मुझे कॉलम को खोलना और छिपे हुए डेटा को पुनः प्राप्त करने के लिए माउस के साथ कॉलम के बीच के अंतर पर डबल क्लिक करना होगा। क्या Epplus के साथ इस कार्यक्रम को करने का कोई तरीका है?

using (ExcelPackage p = new ExcelPackage())
            {
                String filepath = "C://StatsYellowPages.csv";
                DataSet ds = ExportCSVFileToDataset(filepath, "tblCustomers", "\t");
                //Here setting some document properties              
                p.Workbook.Properties.Title = "StatsYellowPages";

                //Create a sheet
                p.Workbook.Worksheets.Add("Sample WorkSheet");
                ExcelWorksheet ws = p.Workbook.Worksheets[1];
                ws.Name = "StatsYellowPages"; //Setting Sheet's name

                //Merging cells and create a center heading for out table
                ws.Cells[1, 1].Value = "StatsYellowPages";
                ws.Cells[1, 1, 1, ds.Tables[0].Columns.Count].Merge = true;
                ws.Cells[1, 1, 1, ds.Tables[0].Columns.Count].Style.Font.Bold = true;
                ws.Cells[1, 1, 1, ds.Tables[0].Columns.Count].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

                int colIndex = 1;
                int rowIndex = 2;

                foreach (DataColumn dc in ds.Tables[0].Columns) //Creating Headings
                {
                    var cell = ws.Cells[rowIndex, colIndex];

                    //Setting the background color of header cells to Gray
                    var fill = cell.Style.Fill;
                    fill.PatternType = ExcelFillStyle.Solid;
                    fill.BackgroundColor.SetColor(Color.Gray);


                    //Setting Top/left,right/bottom borders.
                    var border = cell.Style.Border;
                    border.Bottom.Style = ExcelBorderStyle.Thin;
                    border.Top.Style = ExcelBorderStyle.Thin;
                    border.Left.Style = ExcelBorderStyle.Thin;
                    border.Right.Style = ExcelBorderStyle.Thin;

                    //Setting Heading Value in cell
                    cell.Value = dc.ColumnName;

                    colIndex++;
                }

                foreach (DataRow dr in ds.Tables[0].Rows) // Adding Data into rows
                {
                    colIndex = 1;
                    rowIndex++;
                    foreach (DataColumn dc in ds.Tables[0].Columns)
                    {
                        var cell = ws.Cells[rowIndex, colIndex];
                        //Setting Value in cell
                        cell.Value = dr[dc.ColumnName].ToString();
                        //Setting borders of cell
                        var border = cell.Style.Border;                      
                        colIndex++;
                    }
                }


                //Generate A File with Random name
                Byte[] bin = p.GetAsByteArray();
                string file = "c:\\StatsYellowPages.xlsx";
                File.WriteAllBytes(file, bin);

जवाबों:


151

मुझे लगता है कि शीट के कामों के सभी डेटा भरने के बाद कॉलम की चौड़ाई सेट करना:

ws.Column(1).Width = 50;

ऑटोफिटकल्म विधि भी है, लेकिन यह सूत्रों और लिपटे पाठ के साथ कोशिकाओं की उपेक्षा करता है, इसलिए यह मेरे लिए काम नहीं करता था।

ws.Cells["A1:K20"].AutoFitColumns();

10
मुझे लगता है कि अगर आप एक वर्कशीट के सभी कॉलमों को for (i = 1; i <= ws.Dimension.End.Column; i++) { ws.Column(i).AutoFit(); }
ऑटोफिट

3
यह काम करता है लेकिन उदाहरण के लिए अलग-अलग मान सेट करना मैं कॉलम की चौड़ाई को 7.86 पर सेट करना चाहता हूं, लेकिन यह 7.14 पर सेट हो रहा है और 3.5 के लिए यह 2.71 पर सेट कर रहा है
मुबाशर

8
सभी कॉलमों को स्वतः सहेजने का एक सरल तरीका है: ws.Cells [ws.Dimension.Address] .AutoFitColumns ()
Tevin

4
मैं EPPlus 4.0.5 का उपयोग कर रहा हूं और यह मेरे लिए काम कर रहा है: ws.Cells.AutoFitColumns (); बस यह सुनिश्चित कर लें कि सभी कोशिकाएं बनने के बाद।
बैक्सटर

1
@ जोना: हाँ कृपया नीचे दिए गए उत्तर को देखें कि आप इसे कैसे ठीक कर सकते हैं।
मुबाशर

29

वास्तविक उत्तर पहले से ही कॉलम चौड़ाई सेट करने के सही तरीके से चिह्नित है, लेकिन एक मुद्दा यह है कि जब दस्तावेज़ को पहली बार एक्सेल में खोला जाता है, तो यह कॉलम की चौड़ाई (न जाने क्यों) को पुन: गणना करता है, जैसा कि मैंने चिह्नित उत्तर के नीचे टिप्पणी में उल्लेख किया है जब मैंने स्तंभ की चौड़ाई को 7.86 पर सेट किया है और इसे 7.14 और 10.43 से 9.7x तक रीसेट करता है।

मैं कोठरी संभव स्तंभ चौड़ाई वांछित के रूप में प्राप्त करने के लिए इस ईप रिपोर्ट से निम्नलिखित कोड पाया ।

//get 7.14 in excel
ws.Column(1).Width = 7.86;

//get 7.86 in excel
ws.Column(1).Width = GetTrueColumnWidth(7.86);

public static double GetTrueColumnWidth(double width)
        {
            //DEDUCE WHAT THE COLUMN WIDTH WOULD REALLY GET SET TO
            double z = 1d;
            if (width >= (1 + 2 / 3))
            {
                z = Math.Round((Math.Round(7 * (width - 1 / 256), 0) - 5) / 7, 2);
            }
            else
            {
                z = Math.Round((Math.Round(12 * (width - 1 / 256), 0) - Math.Round(5 * width, 0)) / 12, 2);
            }

            //HOW FAR OFF? (WILL BE LESS THAN 1)
            double errorAmt = width - z;

            //CALCULATE WHAT AMOUNT TO TACK ONTO THE ORIGINAL AMOUNT TO RESULT IN THE CLOSEST POSSIBLE SETTING 
            double adj = 0d;
            if (width >= (1 + 2 / 3))
            {
                adj = (Math.Round(7 * errorAmt - 7 / 256, 0)) / 7;
            }
            else
            {
                adj = ((Math.Round(12 * errorAmt - 12 / 256, 0)) / 12) + (2 / 12);
            }

            //RETURN A SCALED-VALUE THAT SHOULD RESULT IN THE NEAREST POSSIBLE VALUE TO THE TRUE DESIRED SETTING
            if (z > 0)
            {
                return width + adj;
            }

            return 0d;
        }

(१ + २ / ३) == १; (7/256) == 0; (१२ / २५६ == ०)
२०:०२ पर टिब्क्स

9

मुबाशर अहमद के जवाब ने मेरी मदद की, इसके लिए धन्यवाद। मैं इसे शामिल करना चाहता था कि मैंने इसे अपने प्रोजेक्ट में कैसे इस्तेमाल किया। मैंने इसे एक विस्तार पद्धति में बनाया है और इसे फिर से बनाया है।

यहां कार्यान्वयन है, जो वर्कशीट में पहले कॉलम के लिए सेल की चौड़ाई निर्धारित करता है।

    worksheet.Column(1).SetTrueColumnWidth(28);

यहां EPPlus Excel फ़ाइलों में अधिक सटीक कॉलम चौड़ाई सेट करने के लिए विस्तार विधि है, ध्यान दें कि यह विधि एक स्थिर वर्ग के अंदर होनी चाहिए:

    public static void SetTrueColumnWidth(this ExcelColumn column, double width)
    {
        // Deduce what the column width would really get set to.
        var z = width >= (1 + 2 / 3)
            ? Math.Round((Math.Round(7 * (width - 1 / 256), 0) - 5) / 7, 2)
            : Math.Round((Math.Round(12 * (width - 1 / 256), 0) - Math.Round(5 * width, 0)) / 12, 2);

        // How far off? (will be less than 1)
        var errorAmt = width - z;

        // Calculate what amount to tack onto the original amount to result in the closest possible setting.
        var adj = width >= 1 + 2 / 3
            ? Math.Round(7 * errorAmt - 7 / 256, 0) / 7
            : Math.Round(12 * errorAmt - 12 / 256, 0) / 12 + (2 / 12);

        // Set width to a scaled-value that should result in the nearest possible value to the true desired setting.
        if (z > 0)
        {
            column.Width = width + adj;
            return;
        }

        column.Width = 0d;
    }

यह सहज है
मुबाशर

2

आप वर्कशीट के सभी कॉलमों की डिफ़ॉल्ट चौड़ाई को केवल अपनी DefaultColWidth संपत्ति में बदलकर बदल सकते हैं:

worksheet.DefaultColWidth = 25;

0

एक आसान तरीका है। एक्सेल कॉलम चौड़ाई में उत्तीर्ण को 1 से नीचे और 7 वें से ऊपर 12 वें प्रदर्शित करने के लिए निर्धारित करेगा। इसका अर्थ है एक सीढ़ी परिणाम और कई अंत मान नहीं बनाए जा सकते हैं (उदाहरण 3.5,4.5 आदि)।

पूर्व-क्षतिपूर्ति के लिए एक चौड़ाई निम्नलिखित पर्याप्त है।

यदि वांछित है तो <1

एडजस्टेडविड्थ = 12/7 * वांछित

अन्य

एडजस्टेडविड = डेस्चर्डविड + 5/7

अगर अंत

वर्कशीट लिखें। कॉलम (i)। चौड़ाई = एडाप्टलवेड ईपीपीएलयूएस के साथ

यह एक मोनोटोनिक समायोजन है और एक्सेल सभी को खुले / बचत पर परिमाणित करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.