2012-02-01 28 views
50

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

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

Trả lời

98

Tôi thấy rằng việc thiết lập độ rộng cột sau khi tôi đã điền vào tất cả các dữ liệu trên bảng hoạt động:

ws.Column(1).Width = 50; 

Ngoài ra còn có phương pháp autoFitColumns nhưng điều này bỏ qua các tế bào với các công thức và bọc văn bản để nó không làm việc cho tôi.

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

thanx, có vẻ như để làm việc ver tốt . – themis

+6

Tôi sẽ thêm rằng nếu bạn muốn tự động điền tất cả các cột trong một trang tính, hãy làm điều này 'cho (i = 1; i <= ws.Dimension.End.Column; i ++) { \t ws.Column (i) .AutoFit (); } ' – guanome

+2

nó hoạt động nhưng thiết lập giá trị khác nhau ví dụ tôi muốn đặt chiều rộng cột thành 7.86 nhưng nó được đặt thành 7.14 và 3.5 nó được đặt thành 2.71 –

18

thực tế trả lời đã được đánh dấu thats đúng cách thiết rộng cột nhưng có một vấn đề đó là khi tài liệu được mở ra lần đầu tiên trong excel, nó tính toán lại độ rộng cột (không biết tại sao) như vậy là tôi đã đề cập trong bình luận 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 đến 9.7x.

tôi tìm thấy mã sau đây từ this epp reported issue để có chiều rộng cột có thể có trong 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; 
     } 
2

Mubashar Câu trả lời của Ahmad đã giúp tôi, cảm ơ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 đã làm cho nó thành một phương pháp mở rộng và tái cấu trúc nó.

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

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

Dưới đây là phương pháp mở rộng cho thiết lập một độ rộng cột chính xác hơn trong các tập tin EPPlus Excel, lưu ý rằng phương pháp này phải được bên 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; 
    } 
Các vấn đề liên quan