EPPlus двухцветный условный формат даты - PullRequest
0 голосов
/ 24 июня 2019

У меня есть столбец с датами, и я хочу условно покрасить любую ячейку, которая старше, чем 2 недели желтый, и любую, которая старше, чем 90 дней, красный. Я не могу понять, как это сделать.

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Должен быть в состоянии просто добавить условия, как и любые другие.Вы можете использовать функцию TODAY() в Excel и вычесть:

[TestMethod]
public void Conditional_Formatting_Date()
{
    ///9435453/epplus-dvuhtsvetnyi-uslovnyi-format-daty
    var file = new FileInfo(@"c:\temp\Conditional_Formatting_Date.xlsx");
    if (file.Exists)
        file.Delete();

    //Throw in some data
    var dataTable = new DataTable("tblData");
    dataTable.Columns.AddRange(new[] {
        new DataColumn("Col1", typeof(DateTime)),
        new DataColumn("Col3", typeof(string))
    });

    var rnd = new Random();
    for (var i = 0; i < 100; i++)
    {
        var row = dataTable.NewRow();
        row[0] = DateTime.Now.AddDays(-rnd.Next(1, 100));
        row[1] = $"=TODAY() - A{i +1}";
        dataTable.Rows.Add(row);
    }

    //Create a test file    
    using (var package = new ExcelPackage(file))
    {
        //Make the stylesheet
        var ws = package.Workbook.Worksheets.Add("table");
        var range = ws.Cells[1, 1].LoadFromDataTable(dataTable, false);
        ws.Column(1).Style.Numberformat.Format = "mm-dd-yy";
        ws.Column(1).AutoFit();

        //Add the calc check
        var count = 0;
        foreach (DataRow row in dataTable.Rows)
            ws.Cells[++count, 2].Formula = row[1].ToString();

        //Add the conditions - order matters
        var rangeA = range.Offset(0, 0, count, 1);

        var condition90 = ws.ConditionalFormatting.AddExpression(rangeA);
        condition90.Style.Font.Color.Color = Color.White;
        condition90.Style.Fill.PatternType = ExcelFillStyle.Solid;
        condition90.Style.Fill.BackgroundColor.Color = Color.Red;
        condition90.Formula = "TODAY() - A1> 90";
        condition90.StopIfTrue = true;

        var condition14 = ws.ConditionalFormatting.AddExpression(rangeA);
        condition14.Style.Font.Color.Color = Color.Black;
        condition14.Style.Fill.PatternType = ExcelFillStyle.Solid;
        condition14.Style.Fill.BackgroundColor.Color = Color.Yellow;
        condition14.Formula = "TODAY() - A1> 14";

        package.Save();
    }
}

, что дает это в выходных данных:

enter image description here

0 голосов
/ 27 июня 2019

Я предполагаю, что у вас есть номер столбца даты и количество строк в ваших записях.Кроме того, следующий цикл предполагает, что первая строка является заголовком столбца, а записи начинаются со второй строки.Измените инициализацию и назначение счетчика цикла соответственно.

 int rowsCount; //get your no of rows
            int dateColNumber; //Assign column number in excel file of your date column
            string cellValue;
            DateTime dateValue;
            DateTime today = DateTime.Now;
            double daysCount;

            for(int i=1;i<rowsCount;i++)
            {
                cellValue = ws.Cells[i + 1, dateColNumber].Text.ToString(); //First row is header start from second
                if(DateTime.TryParse(cellValue,out dateValue))
                {
                    daysCount = (today - dateValue).Days;
                    if(daysCount>90)
                    {
                        ws.Cells[i + 1,dateColNumber].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                        ws.Cells[i + 1,dateColNumber].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Red);
                    }
                    else if(daysCount>14)
                    {
                        ws.Cells[i + 1, dateColNumber].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                        ws.Cells[i + 1, dateColNumber].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.Yellow);
                    }

                }
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...