2015-07-21 16 views
6

tôi đang tạo ra một bảng tính từ một List<object[]> sử dụng LoadFromArraysSử dụng EPPlus làm thế nào tôi có thể tạo ra một bảng tính nơi con số này là số điện thoại không nhắn tin cho

Mục đầu tiên của mảng là một tiêu đề, các mục khác đều có thể con số, văn bản hoặc ngày (nhưng giống nhau cho mỗi mảng trong danh sách).

Trang tính Excel được tạo có hình tam giác màu xanh lá cây cảnh báo rằng các số được định dạng dưới dạng văn bản.

Tôi lặp qua tất cả các tế bào và thiết lập định dạng của họ để số như vậy ws.Cells[i, j].Style.Numberformat.Format = "0";

Tuy nhiên vấn đề vẫn còn và tôi vẫn thấy cảnh báo màu xanh lá cây, mặc dù định dạng số được thiết lập để số khi tôi nhìn vào Format Cell... hội thoại.

Tùy chọn của tôi ở đây là gì? Có thể cho tôi biết thêm một chút về loại nào trong mỗi cột, nhưng làm cách nào để tôi đặt tiêu đề cột?

Có giải pháp nào tốt hơn EPPlus không? hoặc một số bài đăng khác của bảng tính tôi có thể làm trước khi tải xuống?

+1

Thông thường các hình tam giác màu xanh lá cây này đến từ các số (trong mã) được lưu trữ trong các chuỗi hoặc thuộc tính chuỗi. Vì vậy, bất kể cách bạn đặt excel, bạn sẽ phải chuyển đổi chuỗi thành một số trong mã. Trường hợp đó như thế nào? – Ernie

Trả lời

8

Vì bạn đang sử dụng đối tượng mảng chúng có thể chứa số và chuỗi trông giống như số điện thoại bạn sẽ phải đi qua từng đối tượng và xác định loại của nó:

[TestMethod] 
public void Object_Type_Write_Test() 
{ 
    //http://stackoverflow.com/questions/31537981/using-epplus-how-can-i-generate-a-spreadsheet-where-numbers-are-numbers-not-text 
    var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    //Some data 
    var list = new List<Object[]> 
    { 
     new object[] 
     { 
      "111.11", 
      111.11, 
      DateTime.Now 
     } 
    }; 

    using (var package = new ExcelPackage(existingFile)) 
    { 
     var ws = package.Workbook.Worksheets.Add("Sheet1"); 
     ws.Cells[1, 1, 2, 2].Style.Numberformat.Format = "0"; 
     ws.Cells[1, 3, 2, 3].Style.Numberformat.Format = "[$-F400]h:mm:ss\\ AM/PM"; 

     //This will cause numbers in string to be stored as string in excel regardless of cell format 
     ws.Cells["A1"].LoadFromArrays(list); 

     //Have to go through the objects to deal with numbers as strings 
     for (var i = 0; i < list.Count; i++) 
     { 
      for (var j = 0; j < list[i].Count(); j++) 
      { 

       if (list[i][j] is string) 
        ws.Cells[i + 2, j + 1].Value = Double.Parse((string) list[i][j]); 
       else if (list[i][j] is double) 
        ws.Cells[i + 2, j + 1].Value = (double)list[i][j]; 
       else 
        ws.Cells[i + 2, j + 1].Value = list[i][j]; 

      } 
     } 

     package.Save(); 
    } 
} 

Với trên, bạn sẽ thấy hình ảnh dưới đây là sản lượng Lưu ý các tế bào góc trên bên trái có mũi tên màu xanh lá cây vì nó là một chuỗi đã được viết bởi LoadFromArray mà trông giống như một số:

Excel Output

+0

Một upvote và một đánh dấu nhỏ là bồi thường nhỏ cho sự giúp đỡ tuyệt vời này ... Tôi đã thực sự đập xung quanh với điều này! – Loofer

+0

@Loofer Na, không sao cả. Vui mừng nó đã giúp. – Ernie

1

tôi tạo ra một meth mở rộng od LoadFormulasFromArray, dựa trên EPPlus LoadFromArray. Phương pháp giả định tất cả các đối tượng trong danh sách sẽ được coi là công thức (ngược với LoadFromArray). Bức tranh lớn là cả hai thuộc tính ValueFormula mất string thay vì Loại cụ thể. Tôi thấy đây là một sai lầm vì không có cách nào để phân biệt nếu chuỗi là Text hoặc Formula. Thực hiện một loại Formula Loại sẽ cho phép quá tải và kiểm tra loại do đó làm cho nó có thể luôn luôn làm điều đúng.

// usage: ws.Cells[2,2].LoadFormulasFromArrays(MyListOfObjectArrays) 

public static class EppPlusExtensions 
{ 
    public static ExcelRangeBase LoadFormulasFromArrays(this ExcelRange Cells, IEnumerable<object[]> Data) 
    { 
     //thanx to Abdullin for the code contribution 
     ExcelWorksheet _worksheet = Cells.Worksheet; 
     int _fromRow = Cells.Start.Row; 
     int _fromCol = Cells.Start.Column; 
     if (Data == null) throw new ArgumentNullException("data"); 

     int column = _fromCol, row = _fromRow; 

     foreach (var rowData in Data) 
     { 
      column = _fromCol; 
      foreach (var cellData in rowData) 
      { 
       Cells[row, column].Formula = cellData.ToString(); 
       column += 1; 
      } 
      row += 1; 
     } 
     return Cells[_fromRow, _fromCol, row - 1, column - 1]; 
    } 
} 
Các vấn đề liên quan