В этом проблема хаков - они такие хрупкие! :)
Я смог заставить его работать с другим хаком - установкой ссылки на разностное форматирование стиля (dxf), которая, кажется, сбрасывается при сохранении epplus. Может случиться так, что epplus думает, что при сохранении существует только один dxf, поэтому он не устанавливает значение, так как в Excel предполагают, что это первый стиль dxf (индекс 0), но это немного догадка.
В любом случае, если вы установите dxfid
через XML вручную, он найдет его. Но порядок здесь имеет значение, вы должны применить взлом базы данных последним, иначе он попадет по неправильной ссылке:
[TestMethod]
public void FixDatabarsAtWorksheetTest()
{
///12906051/kak-predotvratit-ischeznovenie-drugogo-uslovnogo-formatirovaniya-pri-vzlome-panelei-dannyh-v-sploshnye-zalivki
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.AddRange(new[]
{
new DataColumn("Col1", typeof(int)), new DataColumn("Col2", typeof(int)), new DataColumn("Col3", typeof(object))
});
for (var i = 0; i < 10; i++)
{
var row = datatable.NewRow();
row[0] = i;
row[1] = i * 10;
row[2] = Path.GetRandomFileName();
datatable.Rows.Add(row);
}
//Create a test file
var fi = new FileInfo(@"c:\temp\FixDatabarsAtWorksheetTest.xlsx");
if (fi.Exists)
fi.Delete();
using (var pck = new ExcelPackage(fi))
{
var workbook = pck.Workbook;
var doc = workbook.Worksheets.Add("Sheet1");
doc.Cells.LoadFromDataTable(datatable, true);
//Set the greater than
var gtConditional = doc
.ConditionalFormatting
.AddGreaterThan(doc.Cells["A2:A11"]);
gtConditional.Formula = "2";
gtConditional.Style.Fill.BackgroundColor.Color = Color.GreenYellow;
//Fix the gt
var xdoc = doc.WorksheetXml;
var nsm = new XmlNamespaceManager(xdoc.NameTable);
nsm.AddNamespace("default", xdoc.DocumentElement.NamespaceURI);
var gtNode = xdoc.SelectSingleNode("/default:worksheet/default:conditionalFormatting[@sqref=\"A2:A11\"]", nsm);
//Create the new attribute for table
var att = xdoc.CreateAttribute("dxfId");
att.Value = "0";
gtNode
.FirstChild
.Attributes.Append(att);
//Set the bar condition LAST
var barConditional = doc
.ConditionalFormatting
.AddDatabar(doc.Cells["B2:B11"], Color.FromArgb(99, 195, 132));
barConditional.HighValue.Type = eExcelConditionalFormattingValueObjectType.Num;
barConditional.LowValue.Type = eExcelConditionalFormattingValueObjectType.Num;
barConditional.HighValue.Value = 82;
barConditional.LowValue.Value = 0;
FixDatabarsAtWorksheet(doc);
pck.Save();
}
}
Я получаю это:
Не уверен, насколько это возможно для вас, в зависимости от того, сколько условных форматов у вас есть, но стоит попробовать.