Как манипулировать диаграммой в сгенерированном excel с помощью asp.net с NPOI?

Я не уверен, что это можно исправить, но у меня следующая ситуация:

У меня есть DataTable с некоторыми данными, и мне нужно подготовить диаграмму, которая использует эти данные. Я читал, что единственная возможность сделать динамически любую диаграмму в NPOI - это подготовить шаблон и заполнить только ячейки Excel. Но у меня есть проблема:

Я могу иметь динамическое количество строк данных. Поэтому мне нужно иметь возможность использовать один шаблон, например, для 4 и 7 строк. Итак, у меня есть идея выбрать больше данных (в шаблоне) и использовать только часть из них, но тогда у меня такая ситуация:

Поэтому мне нужно динамически изменить диапазон диаграммы. Есть ли возможность решить мою проблему?


person Mateusz Rogulski    schedule 21.12.2012    source источник
comment
Вы нашли какое-либо решение для этого? У меня точно такая же проблема @Mateusz Rogulski   -  person akd    schedule 20.05.2015
comment
@akdurmus AFAIR нет, но, может быть, теперь для этого есть лучшие библиотеки.   -  person Mateusz Rogulski    schedule 20.05.2015


Ответы (1)


Вам просто нужно изменить диапазон на диаграмме после заполнения таблицы. Это пример заполнения таблицы для трех диаграмм:

public static void ExportPackingReport_NPOI(string filepath, DataTable table)
        {
            IWorkbook xwb; // Workbook
            HSSFSheet sheet; // Sheet
            HSSFChart chart_0;// chart 1
            HSSFChart chart_1;// chart 2
            HSSFChart chart_2;// chart 3
            int rowIndex = 60; //First row of table with data
            int colIndex = 0;//First column of table with data
            int rows_count = table.Rows.Count; //Count of data in table
            try
            {
                //Read file
                using (FileStream rstr = new FileStream(filepath, FileMode.Open, FileAccess.Read))
                {
                    xwb = new HSSFWorkbook(rstr);
                    sheet = (HSSFSheet)xwb.GetSheet(xwb.GetSheetAt(0).SheetName);
                    var charts = HSSFChart.GetSheetCharts(sheet);
                    chart_0 = charts[0]; 
                    chart_1 = charts[1]; 
                    chart_2 = charts[2]; 
                    //Write file
                    using (FileStream wstr = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite))
                    {
                        //Populating file with data from Datatable
                        SetRowData_NPOI(table, xwb, rowIndex, colIndex);
                        //Overriding data ranges of charts 
                        CellRangeAddressBase chart_range_G = new CellRangeAddress(rowIndex + 1, rowIndex + rows_count, 6, 6);
                        CellRangeAddressBase chart_range_H = new CellRangeAddress(rowIndex + 1, rowIndex + rows_count, 7, 7);
                        CellRangeAddressBase chart_range_I = new CellRangeAddress(rowIndex + 1, rowIndex + rows_count, 8, 8);
                        CellRangeAddressBase chart_range_J = new CellRangeAddress(rowIndex + 1, rowIndex + rows_count, 9, 9);

                        //Apply new ranges of charts 
                        chart_0.Series[0].SetValuesCellRange(chart_range_G);
                        chart_0.Series[1].SetValuesCellRange(chart_range_J);

                        chart_1.Series[0].SetValuesCellRange(chart_range_H);
                        chart_1.Series[1].SetValuesCellRange(chart_range_J);

                        chart_2.Series[0].SetValuesCellRange(chart_range_I);
                        chart_2.Series[1].SetValuesCellRange(chart_range_J);

                        xwb.Write(wstr);
                        wstr.Close();

                    }
                    rstr.Close();
                    xwb.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

Надеюсь, это поможет кому-то :)

person Bogdan Kuzma    schedule 23.11.2016