2015-02-23 2 views
15

Мне было интересно, можно ли программным образом установить цвет ячеек с помощью epplus?Как установить цвет ячеек программным образом epplus?

Я загружаю данные из хранимой процедуры sql и хорошо работает, но мои пользователи хотят, чтобы ячейки содержали слова «Ежегодный отпуск», чтобы иметь цвет фона светло-желтого цвета вместо белого по умолчанию. Есть ли способ сделать это? возможно, путем итерации через данные, возможно,? Ниже, где

public void ExportTableData(DataTable dtdata) 
{ 
    //Using EPPLUS to export Spreadsheets 
    ExcelPackage pck = new ExcelPackage(); 
    var ws = pck.Workbook.Worksheets.Add("Availability list"); 

    ws.Cells["A1"].LoadFromDataTable(dtdata, true); 

    ws.Cells["A1:G1"].Style.Font.Bold = true; 
    ws.Cells["A1:G1"].Style.Font.UnderLine = true; 

    //change cell color depending on the text input from stored proc? 
    if (dtdata.Rows[4].ToString() == "Annual Leave") 
    { 
     ws.Cells["E1"].Style.Fill.PatternType = ExcelFillStyle.Solid; 
     ws.Cells["E1"].Style.Fill.BackgroundColor.SetColor(Color.LightYellow); 
    } 

    pck.SaveAs(Response.OutputStream); 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("content-disposition", "attachment; filename=Availability.xlsx"); 
    Response.End(); 
} 
+0

Итак, что не работает с тем, что у вас есть? извините, не видя ясного вопроса. – workabyte

+0

В основном у меня есть столбец, который может содержать такие данные, как «Ежегодный отпуск», «Доступный», «Больной», «Отставной» и т. Д., И в зависимости от этого текста я хочу программным образом изменить цвет содержащейся ячейки. например, светло-желтый, если он говорит «Ежегодный отпуск», зеленая клетка всякий раз, когда он содержит «доступный» и т. д. На данный момент он не меняет цвет – wubblyjuggly

+0

, так что у вас есть^не работает? что он делает? полностью понять желаемый результат, но что мешает вам добраться туда? – workabyte

ответ

18

Проверьте строку:

if (dtdata.Rows[4].ToString() == "Annual Leave") 

Если это стандартная .net таблица Wouldnt .ToString() вычисляться "System.Data.DataRow"? Также ws.Cells["E1"] необходимо будет отрегулировать для каждой ячейки после прохождения цикла по количеству строк (в основном, что сказал криллаг).

Нечто подобное:

[TestMethod] 
public void Cell_Color_Background_Test() 
{ 
    //http://stackoverflow.com/questions/28679602/how-to-set-cell-color-programmatically-epplus 

    //Throw in some data 
    var dtdata = new DataTable("tblData"); 
    dtdata.Columns.Add(new DataColumn("Col1", typeof(string))); 
    dtdata.Columns.Add(new DataColumn("Col2", typeof(int))); 
    dtdata.Columns.Add(new DataColumn("Col3", typeof(int))); 

    for (var i = 0; i < 20; i++) 
    { 
     var row = dtdata.NewRow(); 
     row["Col1"] = "Available"; 
     row["Col2"] = i * 10; 
     row["Col3"] = i * 100; 
     dtdata.Rows.Add(row); 
    } 
    //throw in one cell that triggers 
    dtdata.Rows[10]["Col1"] = "Annual leave"; 

    var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    using (var pck = new ExcelPackage(existingFile)) 
    { 
     //Using EPPLUS to export Spreadsheets 
     var ws = pck.Workbook.Worksheets.Add("Availability list"); 

     ws.Cells["A1"].LoadFromDataTable(dtdata, true); 

     ws.Cells["A1:G1"].Style.Font.Bold = true; 
     ws.Cells["A1:G1"].Style.Font.UnderLine = true; 

     //change cell color depending on the text input from stored proc? 
     //if (dtdata.Rows[4].ToString() == "Annual Leave") 
     for (var i = 0; i < dtdata.Rows.Count; i++) 
     { 
      if (dtdata.Rows[i]["Col1"].ToString() == "Annual leave") 
      { 
       ws.Cells[i + 1, 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; 
       ws.Cells[i + 1, 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightYellow); 
      } 
     } 

     pck.Save(); 
    } 
+0

Почти там! Дает ошибку «Диапазон недействителен для стилизации: E0», так как с использованием цикла он начинается с 0. необходимо переместить стилизацию вниз по 2 ячейкам из-за заголовка в excel и с использованием индекса на основе нуля – wubblyjuggly

+0

Отличный результат его работы это немного см. ниже. Ура! – wubblyjuggly

+0

@wubblyjuggly Прохладный. Да, индекс 0 против 1 очень легко забыть - вот что делает «+ 1» выше. Рад, что это работает для вас. – Ernie

0

Вы можете попробовать использовать опцию условного форматирования в EPPlus

here is their sample

и вот SO post с кем-то, кто использовал эту опцию

Как правило, используя ссылки как ответы - это не мой стиль, но нет причин переделывать эти колеса, если образец EPP уходит, угадывая их так, и если образец SO исчезнет, ​​тогда я угадаю, что с этим ответом.

Надеется, что это помогает

2

Благодаря Эрни! Я немного изменил его, чтобы включить мой заголовок в excel, а также чтобы убедиться, что код не начинается с E1. Для этого я использовал ws.cells [i + 2, 5]. Ура!

for (var i = 0; i < dtdata.Rows.Count; i++) 
     { 

      if (dtdata.Rows[i]["typeName"].ToString() == "Annual Leave") 
      { 
       ws.Cells[i + 2, 5].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; 
       ws.Cells[i + 2, 5].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightYellow); 
      } 

      else if (dtdata.Rows[i]["typeName"].ToString() == "Available") 
      { 
       ws.Cells[i + 2, 5].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; 
       ws.Cells[i + 2, 5].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGreen); 
      } 
      else 
      { 
       ws.Cells[i + 2, 5].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid; 
       ws.Cells[i + 2, 5].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.White); 
      } 
     } 
Смежные вопросы