91 votes

Comment définir la largeur de cellule XLSX avec EPPlus ?

Bonjour, j'ai ce code où je crée un fichier xlsx et je dois prédéfinir la largeur des cellules de la feuille xlsx. Le problème réel est que lorsque j'ouvre Excel, je dois double-cliquer sur l'espace entre les colonnes avec la souris afin de dérouler les colonnes et de revoir les données cachées. Existe-t-il un moyen de le faire par programmation avec 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);

169voto

aoifeL Points 1586

Je trouve que la définition des largeurs de colonne après avoir rempli toutes les données sur la feuille fonctionne :

 ws.Column(1).Width = 50;

Il existe également la méthode autoFitColumns mais cela ignore les cellules avec des formules et du texte enveloppé, donc cela n'a pas fonctionné pour moi.

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

10voto

Tyler Kalosza Points 148

La réponse de Mubashar Ahmad m'a aidé, merci pour cela. Je voulais inclure la façon dont je l'ai utilisé dans mon projet. J'en ai fait une méthode d'extension et je l'ai refactorisée.

Voici l'implémentation, qui définit la largeur de cellule pour la première colonne de la feuille de calcul.

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

Voici la méthode d'extension pour définir une largeur de colonne plus précise dans les fichiers EPPlus Excel, notez que cette méthode doit être à l'intérieur d'une classe statique :

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

2voto

Lorenzo Goldoni Points 190

Vous pouvez modifier la largeur par défaut de toutes les colonnes de la feuille de calcul en modifiant simplement sa propriété DefaultColWidth :

 worksheet.DefaultColWidth = 25;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X