【问题标题】:Adding multiple charts to EPPlus Worksheet, struggling to get layout correct向 EPPlus 工作表添加多个图表,努力使布局正确
【发布时间】:2015-10-26 20:27:14
【问题描述】:

我目前正在通过 EPPlus 创建 Excel 电子表格,数据基本上分为部分、问题、回复,每个部分都是另一个的子集,我不知道每个部分可能有多少问题,所以一切需要通过循环来完成。

我想要的是文档包含一个工作表,其中显示每个问题的图表,给出答案的细分。

我非常接近让它正常工作,但我的代码中的某些东西导致了问题,我无法弄清楚它是什么。

我目前正在处理的数据包含 10 个问题,所有图表都已绘制,但最后一个图表直接位于第一个图表的顶部。我在正确定位文本结果方面也遇到了问题,但由于该代码取决于图表的代码,我希望对图表进行排序将帮助我对结果进行排序。

这是我的代码:

 Int32 chartPaddingX = 50;
 Int32 chartPaddingY = 200;
 Int32 chartW = 320;
 Int32 chartH = 200;
 Int32 chartXCount = 0;
 Int32 chartYCount = 1;
 Int32 marginTop = 0;
 Int32 marginLeft = 0;
 Int32 resultsControlVar = 0;
 Int32 numCharts = 0;
 Int32 rnStart = 14;
 chartXCount = 0;
 chartYCount = 0;
 chartPaddingX = 50;

 rowNum = y = 14;
 colNum = 2;


 String title = section.First().title.ToString();
 ExcelWorksheet ws = pkg.Workbook.Worksheets.Add(title);

 int idx = 0;

 foreach (var question in results.questions.Where(q => q.section_guid == section.Key))
 {
     var chart = ws.Drawings.AddChart(question.question.ToString(), OfficeOpenXml.Drawing.Chart.eChartType.ColumnClustered);
     chart.SetSize(chartW, chartH);
     chart.Title.Text = question.question.ToString();
     chart.Legend.Add();

     marginLeft = (chartW + chartPaddingX) * chartXCount;

     // SET CHART PLACEMENT
     if (numCharts == 0)
     {
         marginTop = 50;
     }
     else if ((numCharts <= 3) && (numCharts != 0))
     {
         marginTop = 50;
     }
     else if (numCharts > 3)
     {
         marginTop = ((chartH + chartPaddingY) * chartYCount) + 50;
     }
     else
     {
         marginTop = (chartH + chartPaddingY) * chartYCount;
     }

     if (chartXCount >= 3)
     {
         chart.SetPosition(marginTop, 50);
         chartYCount++;
         chartXCount = 0;
         resultsControlVar = 1;
     }
         else
     {
         chart.SetPosition(marginTop, marginLeft + 50);
     }

     chartXCount++;
     numCharts++;

     ...... Add results data and chart series ......

      if (resultsControlVar == 1)
      {
          rowNum = rnStart;
          rowNum = rowNum + 20;
          rnStart = rowNum;
          colNum = 2;
          resultsControlVar = 0;
      }
      else
      {
          rowNum = rnStart;
          colNum = colNum + 6;
      }
  } // close foreach

【问题讨论】:

    标签: c# excel charts epplus


    【解决方案1】:

    检查您的算法逻辑,它没有给出您可能期望的左侧/顶部。如果您将其剥离到最低限度:

    [TestMethod]
    public void Check_Multi_Test()
    {
        Int32 chartPaddingX = 50;
        Int32 chartPaddingY = 200;
        Int32 chartW = 320;
        Int32 chartH = 200;
        Int32 chartXCount = 0;
        Int32 chartYCount = 1;
        Int32 marginTop = 0;
        Int32 marginLeft = 0;
        Int32 numCharts = 0;
        chartXCount = 0;
        chartYCount = 0;
    
    
        //foreach (var question in results.questions.Where(q => q.section_guid == section.Key))
        for (var i = 0; i < 10; i++)
        {
            marginLeft = (chartW + chartPaddingX)*chartXCount;
    
            // SET CHART PLACEMENT
            if (numCharts == 0)
            {
                marginTop = 50;
            }
            else if ((numCharts <= 3) && (numCharts != 0))
            {
                marginTop = 50;
            }
            else if (numCharts > 3)
            {
                marginTop = ((chartH + chartPaddingY)*chartYCount) + 50;
            }
            else
            {
                marginTop = (chartH + chartPaddingY)*chartYCount;
            }
    
            if (chartXCount >= 3)
            {
                //chart.SetPosition(marginTop, 50);
                Console.WriteLine("{{i: {0}, numCharts: {1}, left: {2}, top: {3}}}", i, numCharts, 50, marginTop); //Console.Writeline will simulate chart placement
                chartYCount++;
                chartXCount = 0;
            }
            else
            {
                //chart.SetPosition(marginTop, marginLeft + 50);
                Console.WriteLine("{{i: {0}, numCharts: {1}, left: {2}, top: {3}}}", i, numCharts, marginLeft + 50, marginTop); //Console.Writeline will simulate chart placement
            }
    
            chartXCount++;
            numCharts++;
        }
    }
    

    并将 left/top 输出到控制台,您可以轻松地看到从迭代 3 开始的错误:

    {i: 0, numCharts: 0, left: 50,  top: 50}
    {i: 1, numCharts: 1, left: 420, top: 50}
    {i: 2, numCharts: 2, left: 790, top: 50}
    {i: 3, numCharts: 3, left: 50,  top: 50}
    {i: 4, numCharts: 4, left: 420, top: 450}
    {i: 5, numCharts: 5, left: 790, top: 450}
    {i: 6, numCharts: 6, left: 50,  top: 450}
    {i: 7, numCharts: 7, left: 420, top: 850}
    {i: 8, numCharts: 8, left: 790, top: 850}
    {i: 9, numCharts: 9, left: 50,  top: 850}
    

    其实不需要这么复杂:

    //foreach (var question in results.questions.Where(q => q.section_guid == section.Key))
    for (var i = 0; i < 10; i++)
    {
        marginLeft = (chartW + chartPaddingX)*chartXCount + 50;
        marginTop = (chartH + chartPaddingY)*chartYCount + 50;
    
        //chart.SetPosition(marginTop, marginLeft);  //Console.Writeline will simulate chart placement
        Console.WriteLine("{{i: {0}, numCharts: {1}, left: {2}, top: {3}}}", i, numCharts, marginLeft, marginTop);
    
        if (chartXCount >= 2)
        {
            chartYCount++;
            chartXCount = 0;
        }
        else
            chartXCount++;
    
        numCharts++;
    }
    

    给你这个:

    {i: 0, numCharts: 0, left: 50,  top: 50}
    {i: 1, numCharts: 1, left: 420, top: 50}
    {i: 2, numCharts: 2, left: 790, top: 50}
    {i: 3, numCharts: 3, left: 50,  top: 450}
    {i: 4, numCharts: 4, left: 420, top: 450}
    {i: 5, numCharts: 5, left: 790, top: 450}
    {i: 6, numCharts: 6, left: 50,  top: 850}
    {i: 7, numCharts: 7, left: 420, top: 850}
    {i: 8, numCharts: 8, left: 790, top: 850}
    {i: 9, numCharts: 9, left: 50,  top: 1250}
    

    【讨论】:

      【解决方案2】:

      接受 Ernie 的回答,因为他在我之前到达那里并提供了一些有用的调试技巧。非常感谢您的时间厄尼。

      我今天早上实际上设法解决了这个问题,然后再回来查看,这就是我想出的:

      foreach (var question in results.questions.Where(q => q.section_guid == section.Key))
      {
      // SET CHART PLACEMENT
      if (chartXCount != chartXMax)
      {
          if (numCharts == 0)
          {
             chartX = ((chartW + chartPaddingX) * chartXCount) + 50;
             chartY = ((chartH + chartPaddingY) * chartYCount) + 50;
          }
          else
          {
             chartX = ((chartW + chartPaddingX) * chartXCount) + 50;
          }
       chart.SetPosition(chartY, chartX);
       chartXCount++;
       }
       else
       {
           chartX = ((chartW + chartPaddingX) * chartXCount) + 50;
           chart.SetPosition(chartY, chartX);
      
           chartYCount++;
           resultsControlVar = 1;
       }
      
       numCharts++;
      
       ... DOING SOME OTHER BITS N BOBS ...
      
       // INCREMENT Y VALUE
       if (resultsControlVar == 1) // INCREMENT THE YPOS VALUE OF THE CHART
       {
           rowNum = rnStart;
           rowNum = rowNum + 20;
           rnStart = rowNum;
           colNum = 2;
           chartY = ((chartH + chartPaddingY) * chartYCount) + 50;
           resultsControlVar = 0;
           chartXCount = 0;
        }
        else                      // RESETS THE ROWNUM FOR DATA VALUES
        {
           rowNum = rnStart;
           colNum = colNum + 6;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-09
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多