Можно ли создавать динамические диаграммы в epplus? - PullRequest
0 голосов
/ 23 октября 2019

Мне интересно, можно ли настроить epplus таким образом, чтобы при открытии файла Excel можно было щелкать данные таблицы и отображаться график, основанный на строке щелкнувшей таблицы. (Я понимаю, что это очень легко сделать в Excel, я бы предпочел, чтобы обо всем позаботились, прежде чем это дойдет до определенных людей) *

В настоящее время у меня есть только одна таблица данных и график для каждой строки, но это будетлучше, если бы был только один график, который изменился в зависимости от того, какая строка нажата в Excel. Я также попробовал сводную таблицу, но это не помогает мне с динамическим графиком.

1 Ответ

0 голосов
/ 25 октября 2019

Для тех, кто пытается это понять. В итоге я использовал раскрывающийся список проверки данных и создал строку динамической таблицы (вне базовой таблицы), на которой основана динамическая диаграмма. Строка динамической таблицы изменяется в зависимости от значения раскрывающегося списка проверки данных (вам нужно почувствовать, что Excel может сделать это, чего у меня не было):

class Program
{
    static void Main(string[] args)
    {
        // Creating an instance 
        // of ExcelPackage 
        ExcelPackage excel = new ExcelPackage();

        // name of the sheet 
        var workSheet = excel.Workbook.Worksheets.Add("testSheet");
        //init table
        var randTable = new DataTable();
        randTable.TableName = "randTable";
        //init columns
        var countColumn = new DataColumn()
        {
            DataType = typeof(int),
            ColumnName = "Count",
            ReadOnly = true,
            Unique = true
        };
        var randomColumn0 = new DataColumn()
        {
            DataType = typeof(int),
            ColumnName = "Random-0",
            ReadOnly = true,
            Unique = false
        };
        var randomColumn1 = new DataColumn()
        {
            DataType = typeof(int),
            ColumnName = "Random-1",
            ReadOnly = true,
            Unique = false
        };
        //add columns to table
        randTable.Columns.AddRange(new DataColumn[] { countColumn, randomColumn0, randomColumn1 });


        //init data validation
        ExcelRange dropdownRange = workSheet.Cells[12, 1, 12, 3];
        var dropdownValidation = workSheet.DataValidations.AddListValidation(dropdownRange.Address);
        workSheet.Names.Add("count", dropdownRange);
        //style data validation
        dropdownRange.Merge = true;
        workSheet.Cells[dropdownRange.Address].Style.Fill.PatternType = ExcelFillStyle.Solid;
        workSheet.Cells[dropdownRange.Address].Style.Fill.BackgroundColor.SetColor(Color.Yellow);
        workSheet.Cells[dropdownRange.Address].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

        var rand = new Random();
        for (var i = 0; i < 10; i++)
        {
            //add table first column values to validation list
            dropdownValidation.Formula.Values.Add(i.ToString());
            var row = randTable.NewRow();
            row[countColumn] = i;
            row[randomColumn0] = rand.Next(0, 100);
            row[randomColumn1] = rand.Next(0, 100);
            randTable.Rows.Add(row);
        }

        //make the tableIndexer cell. This cell will be used to get the 
        //table indices for the selected table row cells
        ExcelRange randTableIndexer = workSheet.Cells[12, 4, 12, 4];
        randTableIndexer.Formula = "MATCH(INDEX(count,1,1), randTable[Count], 0)";
        workSheet.Cells[randTableIndexer.Address].Style.Fill.PatternType = ExcelFillStyle.Solid;
        workSheet.Cells[randTableIndexer.Address].Style.Fill.BackgroundColor.SetColor(Color.LightGreen);
        workSheet.Cells[randTableIndexer.Address].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        workSheet.Names.Add("tableIndex", randTableIndexer);

        //make the cells based off the table at row(randTableIndexer.value)
        ExcelRange graphCells = workSheet.Cells[13, 1, 13, 3];
        graphCells.CreateArrayFormula("INDEX(randTable[], tableIndex, 0)"); //need [] on table names in epplus formulas
        workSheet.Cells[graphCells.Address].Style.Fill.PatternType = ExcelFillStyle.Solid;
        workSheet.Cells[graphCells.Address].Style.Fill.BackgroundColor.SetColor(Color.LightBlue);
        workSheet.Cells[graphCells.Address].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        graphCells.Calculate();

        //add table to workSheet
        workSheet.Cells[1, 1].LoadFromDataTable(randTable, true, OfficeOpenXml.Table.TableStyles.Medium15);
        workSheet.Cells.AutoFitColumns();


        //add dynamic chart
        var chart = workSheet.Drawings.AddChart("rands", eChartType.Pie) as ExcelPieChart;
        chart.Title.Text = "rands";
        chart.Series.Add(graphCells.Address, ExcelRange.GetAddress(1, 1, 3, 1));
        chart.Legend.Position = eLegendPosition.Bottom;
        chart.SetSize(500, 400);
        chart.SetPosition(60, 500);


        WriteToFile(excel);
    }

    public static void WriteToFile(ExcelPackage package)
    {
        // file name with .xlsx extension  
        string p_strPath = "C:\\your\\file\\path";

        if (File.Exists(p_strPath))
            File.Delete(p_strPath);

        // Create excel file on physical disk  
        FileStream objFileStrm = File.Create(p_strPath);
        objFileStrm.Close();

        // Write content to excel file  
        File.WriteAllBytes(p_strPath, package.GetAsByteArray());
    } 
}

enter image description here

...