2012-02-01 36 views
50

こんにちは私はxlsxファイルを作成し、xlsxシートセルの幅をあらかじめ設定する必要があります。 実際の問題は、私がExcelを開いたときに、列をアンラップして非表示のデータを再生するために、マウスの列間のギャップをダブルクリックする必要があることです。 Epplusでこれをプログラマティックに行う方法はありますか?C#のEPPlusでxlsxセル幅を設定するには

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

答えて

98

私はシート上のすべてのデータで埋めた後、列の幅を設定すると動作することを見つける:

ws.Column(1).Width = 50; 

もautoFitColumns方法がありますが、これは数式でセルを無視し、そのテキストを包んそれは私のために働かなかった。

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

ありがとう、それverはうまく動作するようです。 – themis

+6

ワークシート内のすべての列を自動フィッティングする場合は、このfor(i = 1; i <= ws.Dimension.End.Column; i ++){ \t ws.Column(i).AutoFit ); } ' – guanome

+2

それは動作しますが、別の値を設定するなど、たとえば列の幅を7.86に設定したいが、7.14に設定し、3.5では2.71に設定します。 –

18

実際の回答がすでに列幅を設定する正しい方法厥マークされますが、ドキュメントがExcelで初めて開かれたときである1問題があるとされ、それがカラムの幅を再計算し(なぜ知らない)私が言及したように、私は列の幅を7.86に設定すると、マークされた答えの下のコメントに7.14と10.43から9.7xにそれをリセットします。

this epp reported issueのコードでは、可能な限りクローズ可能な列幅を取得しています。

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

ムバシャール・アーマドの答えが私を助けました。ありがとうございました。私は自分のプロジェクトでどのように使用したのかを含めたいと思っていました。私はそれを拡張メソッドにしてリファクタリングしました。

ワークシートの最初の列のセル幅を設定する実装を次に示します。ここで

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; 
    } 
関連する問題