Максимальное значение в панели данных условного форматирования Epplus Excel - PullRequest
0 голосов
/ 01 мая 2018

Я создаю файл Excel с помощью epplus и пытаюсь добавить панель данных со следующим кодом:

var bar = pck.Workbook.Worksheets[1].ConditionalFormatting.AddDatabar(new ExcelAddress("I4:I56"), System.Drawing.Color.Blue);
            bar.HighValue.Type = eExcelConditionalFormattingValueObjectType.Num;
            bar.LowValue.Type = eExcelConditionalFormattingValueObjectType.Num;
            bar.HighValue.Value = 600;
            bar.LowValue.Value = 0;

Однако ячейки со значением 600 заполняются не полностью. Они выглядят так:

enter image description here

Когда я ожидаю, что это будет выглядеть следующим образом, вот как это получится, если вы установите значение 600 в Excel: enter image description here

Я попытался добавить xml вручную, как предложено в этом ответе: https://stackoverflow.com/a/33568285/1308743 и та же проблема сохраняется.

1 Ответ

0 голосов
/ 02 мая 2018

Ответ в предоставленной вами ссылке действительно работает для меня, вам может понадобиться просто обновить ссылку на ячейку в xm:sqref, чтобы она указала на ваш адрес I4: I56, поэтому я считаю, что именно поэтому у тебя не работает.

Чтобы объяснить визуальную проблему, в dataBar, который генерирует EPPlus в xml, отсутствуют атрибуты minLength и maxLength. Эти атрибуты определяют фиксированный процент ширины, который заполняет панель данных. По по умолчанию минимальная длина составляет 10%, а максимальная длина составляет 90%.

Если вас не волнует удаление градиента, вы можете напрямую добавить minLength и maxLength, не создавая список расширений, как в связанном ответе, если вы хотите более простое решение:

// All the code below goes after your code that creates the data bar
var ws = pck.Workbook.Worksheets[1];

// Create namespace manager using default uri to be able to select nodes.
var ns = new XmlNamespaceManager(ws.WorksheetXml.NameTable);
ns.AddNamespace("d", ws.WorksheetXml.DocumentElement.NamespaceURI);

// Get all the dataBar elements and set the missing min and max length attributes.
var dataBarElements = ws.WorksheetXml.SelectNodes("//d:dataBar", ns);
foreach (XmlElement dataBarElement in dataBarElements)
{
    dataBarElement.SetAttribute("minLength", "0");
    dataBarElement.SetAttribute("maxLength", "100");
}

Вышеизложенное относится ко всем панелям данных. Если вы хотите применить его только к одной панели данных, как для I4: I56, измените выбор на:

var dataBarElement = (XmlElement)ws.WorksheetXml.SelectSingleNode("//d:conditionalFormatting[@sqref='I4:I56']//d:dataBar", ns);
dataBarElement.SetAttribute("minLength", "0");
dataBarElement.SetAttribute("maxLength", "100");

Если вам нужно отключить градиент, вам нужно будет использовать ответ в своей ссылке, поскольку атрибут gradient не поддерживается на элементах dataBar, отсутствующих в списке расширений.

Я также предлагаю использовать Инструменты повышения производительности Open XML SDK для просмотра / сравнения XML в документах Excel.

...