EPPlus: ExcelChartSerie.Header загружается один раз, но не обновляется при изменении ячейки

Я пытаюсь создать диаграмму EPPlus. У меня проблемы с заголовками серий. Даже когда используется ExcelChartSerie.HeaderAddress, похоже, это не действует.

Каждая серия инициализируется следующим фрагментом кода

ExcelBarChartSerie serie = (OfficeOpenXml.Drawing.Chart.ExcelBarChartSerie)
                           chartClustered.Series.Add(ExcelRange.GetAddress(fromRow, fromCol, toRow, toCol),
                                                     ExcelRange.GetAddress(fromRow, fromColH, toRow, fromColH));

ExcelAddressBase headerAddr = new ExcelAddressBase(headRow, headCol, headRow, headCol);
serie.HeaderAddress = headerAddr;
serie.Header = (string)ws.Cells[headRow, headCol].Value;

Все работает отлично, но у меня возникают проблемы с правильным обновлением заголовка с остальной частью графика. Переменная serie.Header управляет легендой, в которой у меня возникла проблема. Я понимаю, что это неуклюжий конкретный вопрос, но, возможно, кто-то может предложить некоторые идеи. Вот несколько изображений, чтобы показать вам, где именно у меня возникла проблема.

Исходный сюжет до изменения (правильный): before

График после изменения данных этикетки (неверно): введите описание изображения здесь


person jnel899    schedule 09.01.2015    source источник
comment
Обратите внимание, что я пытался использовать serie.HeaderAddress без использования serie.Header, но безрезультатно (программа создает пустую легенду)   -  person jnel899    schedule 09.01.2015


Ответы (1)


Проблема в том, что вы создаете новый адрес Excel, который НЕ прикрепляется к рабочему листу при установке HeaderAddress. Это очень тонкое, но важное отличие, потому что Excel не будет знать, с каким листом фактически связан адрес при поиске значения заголовка (он не будет предполагать, что тот, на котором находится диаграмма). Взгляните на это:

[TestMethod]
public void ExcelChartSerie_Header()
{
    //http://stackoverflow.com/questions/27866521/epplus-excelchartserie-header-loads-once-but-doesnt-update-when-cell-is-change
    var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
    if (existingFile.Exists)
        existingFile.Delete();

    using (var package = new ExcelPackage(existingFile))
    {
        var workbook = package.Workbook;
        var ws = workbook.Worksheets.Add("newsheet");

        //Some data
        ws.Cells["A1"].Value = "Stuff";
        ws.Cells["A2"].Value = "bar1";ws.Cells["A3"].Value = "bar2";ws.Cells["A4"].Value = "bar3";ws.Cells["A5"].Value = "bar4";ws.Cells["A6"].Value = "bar5";

        ws.Cells["C1"].Value = "Canadian";
        ws.Cells["C2"].Value = 53;ws.Cells["C3"].Value = 36;ws.Cells["C4"].Value = 43;ws.Cells["C5"].Value = 86;ws.Cells["C6"].Value = 86;

        ws.Cells["D1"].Value = "Saudi Arabia";
        ws.Cells["D2"].Value = 53;ws.Cells["D3"].Value = 36;ws.Cells["D4"].Value = 43;ws.Cells["D5"].Value = 86;ws.Cells["D6"].Value = 86;

        ws.Cells["E1"].Value = "Alaskan";
        ws.Cells["E2"].Value = 53; ws.Cells["E3"].Value = 36; ws.Cells["E4"].Value = 43; ws.Cells["E5"].Value = 86; ws.Cells["E6"].Value = 86;

        ws.Cells["F1"].Value = "Indian";
        ws.Cells["F2"].Value = 53; ws.Cells["F3"].Value = 36; ws.Cells["F4"].Value = 43; ws.Cells["F5"].Value = 86; ws.Cells["F6"].Value = 86;


        //Create the chart
        var chart = (ExcelBarChart)ws.Drawings.AddChart("Chart1", eChartType.ColumnClustered);
        chart.SetSize(400, 300);
        chart.SetPosition(10, 400);

        //Apply header
        for (var i = 0; i < 4; i++)
        {
            var serie = (ExcelBarChartSerie) chart.Series.Add(
                ExcelCellBase.GetAddress(2, i + 3, 6, i + 3),
                ExcelCellBase.GetAddress(2, 1, 6, 1)
            );

            //var headerAddr = new ExcelAddressBase("C1");  //THIS IS NOT ASSOCIATED WITH WORKSHET 'ws'
            var headerAddr = ws.Cells[1, i + 3]; //THIS IS
            serie.HeaderAddress = headerAddr;
            //serie.Header = (string) ws.Cells[1, i + 3].Value;
        }
        package.Save();

    }
}
person Ernie S    schedule 10.01.2015
comment
У меня до сих пор проблемы с этим. Я только что проверил, но до сих пор получаю пустую легенду - person jnel899; 12.01.2015
comment
@ jnel899 Сработал ли описанный выше метод тестирования? Я думаю, вам нужно будет вставить весь свой код, чтобы люди могли правильно устранить неполадки. - person Ernie S; 12.01.2015
comment
Я только что протестировал ваш код изолированно, и он определенно работает. Ошибка должна быть где-то на моей стороне, я ищу ее сейчас. - person jnel899; 12.01.2015
comment
@ jnel899 Хорошо, круто. Если вы застряли, просто отредактируйте свой вопрос и вставьте его - никогда не помешает иметь еще одну пару глаз. - person Ernie S; 12.01.2015
comment
Хорошо, я получил ваш ответ, чтобы поработать и над своим. Спасибо за помощь! Проблема заключалась в том, что я пытался дополнительно манипулировать строкой заголовка (чтобы она не была слишком длинной). Не похоже, что я больше смогу это делать, но это не имеет большого значения, я бы предпочел, чтобы эта функция работала - person jnel899; 12.01.2015