EPPlusでXLSXセル幅を設定するにはどうすればよいですか?


81

こんにちは私はxlsxファイルを作成するこのコードを持っており、xlsxシートセルの幅を事前に設定する必要があります。実際の問題は、excellを開くときに、列のラップを解除して非表示になっているデータを表示するために、マウスで列間のギャップをダブルクリックする必要があることです。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;

autoFitColumnsメソッドもありますが、これは数式と折り返しテキストを含むセルを無視するため、私には機能しませんでした。

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

10
ワークシートのすべての列を自動調整する場合は、これを実行します for (i = 1; i <= ws.Dimension.End.Column; i++) { ws.Column(i).AutoFit(); }
FarFigNewton 2013年

3
それは機能しますが、異なる値を設定します。たとえば、列の幅を7.86に設定したいのですが、7.14に設定されており、3.5の場合は2.71に設定されています
Mubashar 2013

8
すべての列を自動調整する簡単な方法は、次を使用することです。ws.Cells[ws.Dimension.Address] .AutoFitColumns()
Tevin

4
私はEPPlus4.0.5を使用していますが、これはうまくいきました:ws.Cells.AutoFitColumns(); すべてのセルが作成されたら、必ずそれを入力してください。
バクスター

1
@ジョナ:ええ、あなたがそれを修正する方法を以下の答えを見てください。
ムバシャール2016

29

実際の回答は、列幅を設定する正しい方法であるとすでにマークされていますが、ドキュメントを初めてExcelで開いたときに、列の幅が再計算される(理由はわかりません)ため、マークされた回答の下のコメントで述べたように、列幅を7.86に設定すると、7.14にリセットされ、10.43が9.7xにリセットされます。

このeppで報告された問題から次のコードを見つけて、必要に応じて可能な限り近い列幅を取得しました。

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

(1 + 2/3)== 1; (7/256)== 0; (256分の12 == 0)
TIBX

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

それは直感的だ
Mubashar

2

DefaultColWidthプロパティを変更するだけで、ワークシートのすべての列のデフォルト幅を変更できます。

worksheet.DefaultColWidth = 25;

0

もっと簡単な方法があります。Excelは、渡された列幅をクオンタイズして、1より下の12番目と上の7番目に表示します。これは、階段の結果であり、多くの終了値を作成できないことを意味します(3.5、4.5など)。

幅を事前に補正するには、次の方法で十分です。

必要な幅が1未満の場合

AdjustedWidth = 12/7 * DesiredWidth

そうしないと

AdjustedWidth = DesiredWidth + 5/7

ENDIF

Worksheet.Column(i).Width = APPLUSを使用したAdjustedWidthの書き込み

これは単調な調整であり、Excelはオープン/保存時にすべてのクオンタイズを実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.