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;

autoFitColumns 메서드도 있지만 수식 및 줄 바꿈 된 텍스트가있는 셀을 무시하므로 저에게 적합하지 않습니다.

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로 설정합니다
Mubashar

8
ws.Cells [ws.Dimension.Address] .AutoFitColumns () : 모든 열을 자동 맞춤하기위한 간단한 방법은 사용하는 것입니다
Tevin

4
나는 EPPlus 4.0.5를 사용하고 있으며 이것은 나를 위해 일했습니다. ws.Cells.AutoFitColumns (); 모든 셀이 생성 된 후에 반드시 입력하십시오.
Baxter

1
@Jonah : 예, 어떻게 해결할 수 있는지 아래 답변을 참조하십시오.
Mubashar

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; (
12/256

9

Mubashar Ahmad의 답변이 저를 도왔습니다. 감사합니다. 프로젝트에 어떻게 사용했는지 포함시키고 싶었습니다. 나는 그것을 확장 메서드로 만들고 리팩토링했습니다.

다음은 워크 시트의 첫 번째 열에 대한 셀 너비를 설정하는 구현입니다.

    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 분의 1을 위의 7 분의 1로 표시합니다. 이것은 계단 결과와 많은 끝 값을 만들 수 없음을 의미합니다 (예 : 3.5,4.5 등).

너비를 미리 보정하려면 다음으로 충분합니다.

DesiredWidth <1이면

AdjustedWidth = 12/7 * DesiredWidth

그밖에

AdjustedWidth = DesiredWidth + 5/7

ENDIF

Worksheet.Column (i) .Width = AdjustedWidth with EPPLUS 작성

이것은 단조로운 조정이며 Excel은 열기 / 저장시 모든 양자화를 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.