将多个图表添加到EPPlus工作表,努力使版面正确

我目前正在通过EPPlus创buildExcel电子表格,数据基本上被分成几部分,问题和答案,每个部分都是另一部分,我不知道每个部分可能有多less个问题,所以一切都需要通过循环完成。

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

我非常接近正确的工作,但在我的代码中的东西造成的问题,我不知道它是什么。

我目前正在处理的数据有10个问题,所有图表都绘制完毕,但最后一个图表直接位于第一个图表的顶部。 我也有问题获得文本结果正确定位,但由于代码取决于图表我希望sorting图表将帮助我sorting结果。

这是我的代码:

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 

检查你的algorithm逻辑,它不是给你可能期望的左/顶。 如果你把它剥离到最低限度:

 [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++; } } 

并输出左/顶部到控制台,你可以很容易地看到从迭代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} 

接受Ernie的回答,因为他在我面前有一些有用的debugging技巧。 非常感谢你的时间恩尼。

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

 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; } }