Я создаю файл 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 заполняются не полностью. Они выглядят так:
Когда я ожидаю, что это будет выглядеть так, а вот как это получится, если вы установите для него значение 600 в excel:
Я попытался добавить xml вручную, как предлагается в этом ответе: https://stackoverflow.com/a/33568285/1308743, и та же проблема сохраняется.
@DanWilson Спасибо за предложение, Дэн. Я сделал простой пример из кода и вручную, в котором есть разница, но я не уверен, как делать разницу в файлах, поскольку открытие xlsx в текстовом редакторе показывает кучу нечитаемых символов.
Переименуйте XLSX в ZIP и извлеките содержимое.
отвечать в предоставленной вами ссылке действительно работает для меня, вам может просто потребоваться обновить ссылку на ячейку в 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.
Что-то другое в выводе XLSX, но я не знаю что. Что бы я сделал: сделал очень простой файл XLSX и сравнил файлы внутри ZIP-пакета, чтобы увидеть, в чем разница. Если EPPlus делает что-то странное, предложите изменить код.