【问题标题】:Is it possible to create dynamic charts in epplus?是否可以在 epplus 中创建动态图表?
【发布时间】:2019-10-25 05:32:59
【问题描述】:

我想知道是否可以配置 epplus 以在打开 excel 文件时单击表格数据并根据单击的表格行显示图表。 (我意识到这在 excel 中非常容易做到,我宁愿在它到达某些人之前把所有事情都处理好)

目前我只有一个数据表和每一行的图表,但如果只有一个图表会根据在 Excel 中单击的行而改变,那会更好。我也尝试了数据透视表,但这对动态图表没有帮助。

【问题讨论】:

    标签: asp.net-core epplus


    【解决方案1】:

    对于任何试图弄清楚这一点的人。我最终使用了一个数据验证下拉列表并制作了一个动态图表所基于的动态表行(在基表之外)。动态表格行根据数据验证下拉列表的值而变化(您需要对 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());
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多