Làm cách nào để đặt chiều rộng ô XLSX với EPPlus?


81

Xin chào Tôi có mã này trong đó tôi tạo một tệp xlsx và tôi cần đặt trước chiều rộng của các ô trang tính xlsx. Vấn đề thực tế là khi tôi mở excell, tôi cần phải nhấp đúp vào khoảng trống giữa các cột bằng chuột để mở các cột và phục hồi dữ liệu bị ẩn. Có cách nào để thực hiện chương trình này với Epplus không?

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

Câu trả lời:


151

Tôi thấy rằng việc đặt độ rộng cột sau khi tôi đã điền vào tất cả dữ liệu trên trang tính hoạt động:

ws.Column(1).Width = 50;

Ngoài ra còn có phương thức autoFitColumns nhưng điều này bỏ qua các ô có công thức và văn bản được bao bọc nên nó không hoạt động với tôi.

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

10
Tôi muốn nói thêm rằng nếu bạn muốn AutoFit tất cả các cột trong một bảng tính làm điều này for (i = 1; i <= ws.Dimension.End.Column; i++) { ws.Column(i).AutoFit(); }
FarFigNewton

3
nó hoạt động nhưng thiết lập giá trị khác nhau ví dụ tôi muốn chiều rộng bộ cột 7.86 nhưng nó được thiết lập để 7,14 và 3,5 nó được thiết lập để 2,71
Mubashar

8
Một cách đơn giản hơn để tự động điều chỉnh tất cả các cột là sử dụng: ws.Cells [ws.Dimension.Address] .AutoFitColumns ()
Tevin

4
Tôi đang sử dụng EPPlus 4.0.5 và điều này phù hợp với tôi: ws.Cells.AutoFitColumns (); chỉ cần đảm bảo đặt điều đó sau khi tất cả các ô được tạo.
Baxter

1
@Jonah: Vâng, vui lòng xem câu trả lời bên dưới cách bạn có thể sửa nó.
Mubashar,

29

Câu trả lời thực tế đã được đánh dấu là cách đúng để đặt chiều rộng cột nhưng có một vấn đề là khi tài liệu được mở lần đầu tiên trong excel, nó sẽ tính toán lại chiều rộng của cột (không biết tại sao), như tôi đã đề cập trong nhận xét bên dưới câu trả lời được đánh dấu khi tôi đặt chiều rộng cột thành 7,86, nó đặt lại thành 7,14 và 10,43 thành 9,7x.

tôi đã tìm thấy mã sau từ sự cố được báo cáo epp này để có được chiều rộng cột có thể có tủ quần áo như mong muốn.

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

Câu trả lời của Mubashar Ahmad đã giúp tôi, cảm ơn bạn vì điều đó. Tôi muốn bao gồm cách tôi sử dụng nó trong dự án của mình. Tôi đã biến nó thành một phương thức mở rộng và cấu trúc lại nó.

Đây là cách triển khai, thiết lập độ rộng ô cho cột đầu tiên trong trang tính.

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

Đây là phương thức mở rộng để thiết lập độ rộng cột chính xác hơn trong tệp EPPlus Excel, lưu ý rằng phương thức này phải nằm trong một lớp tĩnh:

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

Đó là trực quan
Mubashar

2

Bạn có thể thay đổi chiều rộng mặc định của tất cả các cột trong trang tính bằng cách chỉ cần thay đổi thuộc tính DefaultColWidth :

worksheet.DefaultColWidth = 25;

0

Co một cach dê dang hơn. Excel sẽ lượng hóa giá trị được truyền theo chiều rộng cột để hiển thị số 12 bên dưới 1 và thành số 7 ở trên. Điều này có nghĩa là kết quả cầu thang và nhiều giá trị cuối không thể được thực hiện (ví dụ: 3,5,4,5, v.v.).

Để bù trước chiều rộng, như sau là đủ.

NẾU Chiều rộng mong muốn <1 thì

Chiều rộng điều chỉnh = 12/7 * Chiều rộng mong muốn

ELSE

Chiều rộng điều chỉnh = Chiều rộng mong muốn + 5/7

ENDIF

Viết Worksheet.Column (i) .Width = AdjustedWidth với EPPLUS

Đây là một điều chỉnh đơn điệu và Excel thực hiện tất cả việc định lượng hóa khi mở / lưu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.