it-swarm.com.de

Wie stelle ich die XLSX-Zellenbreite mit EPPlus ein?

Hallo, ich habe diesen Code, in dem ich eine xlsx-Datei erstelle und die Breite der xlsx-Blattzellen voreinstellen muss. Das eigentliche Problem ist, dass ich beim Öffnen des Excells mit der Maus auf die Lücke zwischen den Spalten doppelklicken muss, um die Spalten zu entpacken und die verborgenen Daten anzuzeigen. Gibt es eine Möglichkeit, diese Programmierung mit Epplus durchzuführen?

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);
66
themis

Ich finde, dass das Einstellen der Spaltenbreiten, nachdem ich alle Daten auf dem Blatt eingegeben habe, funktioniert:

ws.Column(1).Width = 50;

Es gibt auch die autoFitColumns-Methode, die jedoch Zellen mit Formeln und umbrochenem Text ignoriert, sodass dies bei mir nicht funktioniert hat.

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

Die Option "Tatsächliche Antwort" ist bereits markiert. Dies ist die richtige Methode zum Festlegen der Spaltenbreite. Es gibt jedoch ein Problem, bei dem beim erstmaligen Öffnen des Dokuments in Excel die Spaltenbreite neu berechnet wird (ich weiß nicht warum) Ich habe die Spaltenbreite auf 7,86 gesetzt und es wird auf 7,14 und 10,43 auf 9,7x zurückgesetzt.

ich fand folgenden Code von dieses Epp berichtete Ausgabe , um die mögliche Spaltenbreite des Wandschranks zu erhalten, wie gewünscht.

//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;
        }
23
Mubashar

Die Antwort von Mubashar Ahmad hat mir geholfen, danke dafür. Ich wollte einbeziehen, wie ich es in meinem Projekt verwendet habe. Ich habe es zu einer Erweiterungsmethode gemacht und überarbeitet.

Hier ist die Implementierung, die die Zellenbreite für die erste Spalte im Arbeitsblatt festlegt.

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

Hier ist die Erweiterungsmethode zum Festlegen einer genaueren Spaltenbreite in EPPlus Excel-Dateien. Beachten Sie, dass diese Methode in einer statischen Klasse enthalten sein muss:

    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;
    }
7
Tyler Kalosza