it-swarm.com.de

Wie programmiert man die Zellenfarbe epplus?

Ich habe mich gefragt, ob es möglich ist, die Zellenfarbe mit epplus programmgesteuert einzustellen.

Ich lade meine Daten von einer gespeicherten SQL-Prozedur und es funktioniert gut, aber meine Benutzer möchten, dass Zellen, die die Wörter "Jahresurlaub" enthalten, eine hellgelbe Hintergrundfarbe anstelle des Standardweiß haben. Gibt es eine Möglichkeit, dies zu tun? vielleicht durch Iteration durch eine datierbare vielleicht? Unten ist wo

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();
}
24
wubblyjuggly

Überprüfen Sie Ihre Linie:

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

Wenn es sich um eine .net-Standardtabelle handelt, würde .ToString() nicht zu "System.Data.DataRow" Ausgewertet werden? Außerdem muss ws.Cells["E1"] Für jede Zelle angepasst werden, nachdem die Zeilenzahl durchlaufen wurde (im Grunde das, was Krillgar gesagt hat).

Sowas in der Art:

[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();
    }
26
Ernie

Danke Ernie! Ich habe es leicht geändert, um meinen Header in Excel zu berücksichtigen und um sicherzustellen, dass der Code nicht bei E1 beginnt. Ich habe ws.cells [i + 2, 5] verwendet, um dies zu tun. Prost!

   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);
            }
        }
4
wubblyjuggly

Sie können versuchen, die bedingte Formatierungsoption in EPPlus zu verwenden

hier ist ihr Beispiel

und hier ist ein SO post mit jemand anderem, der diese Option verwendet hat

Im Allgemeinen ist die Verwendung von Links als Antworten nicht mein Stil, aber kein Grund, diese Räder neu zu erstellen, wenn das EPP-Sample nicht mehr angezeigt wird und das SO) - Sample nicht mehr angezeigt wird Antworten.

Ich hoffe es hilft

0
workabyte