使用Syncfusion DocIO生成docx表格时按年份分组新增累计求和行问题
Syncfusion DocIO 按年插入年度合计行实现方案
你可以通过新增临时变量实时累计当年的各项数值,触发合计条件时直接输出累计值即可,修改后的代码如下:
int i = 1; // 新增当年累计统计变量 int currentYear = aAmortizationPlanLoanPayment.First().Date.Year; decimal yearTotalAnnuity = 0; decimal yearTotalInterest = 0; decimal yearTotalPrincipal = 0; foreach (var amortizationData in aAmortizationPlanLoanPayment) { // 年份切换时重置累计值 if (amortizationData.Date.Year != currentYear) { currentYear = amortizationData.Date.Year; yearTotalAnnuity = 0; yearTotalInterest = 0; yearTotalPrincipal = 0; } // 累加当前行数据到当年累计值 yearTotalAnnuity += amortizationData.Anuity; yearTotalInterest += amortizationData.InterestPaid; yearTotalPrincipal += amortizationData.PrincipalPaid; WTableRow tableRow = tableAmortizationData.AddRow(true); tableRow.Cells[0].AddParagraph().AppendText(i.ToString()); tableRow.Cells[1].AddParagraph().AppendText(amortizationData.Anuity.ToString()); tableRow.Cells[2].AddParagraph().AppendText(amortizationData.InterestPaid.ToString()); tableRow.Cells[3].AddParagraph().AppendText(amortizationData.PrincipalPaid.ToString()); tableRow.Cells[4].AddParagraph().AppendText(amortizationData.BalanceDue.ToString()); tableRow.Cells[5].AddParagraph().AppendText(amortizationData.Date.AddMonths(aAmortizationPlanLoanPaymentData.Moratorium).ToString("yyyy/M/dd")); i++; bool hasInsertYearSum = false; // 12月末插入年度合计 if (amortizationData.Date.Month == 12) { WTableRow YearSumrow = tableAmortizationData.AddRow(true); YearSumrow.Cells[0].AddParagraph().AppendText($"{amortizationData.Date.Year}年合计"); YearSumrow.Cells[1].AddParagraph().AppendText(yearTotalAnnuity.ToString()); YearSumrow.Cells[2].AddParagraph().AppendText(yearTotalInterest.ToString()); YearSumrow.Cells[3].AddParagraph().AppendText(yearTotalPrincipal.ToString()); hasInsertYearSum = true; } // 贷款结清时插入当年合计,避免非12月结清漏插 if (amortizationData.BalanceDue == 0.00 && !hasInsertYearSum) { WTableRow LastYearRow = tableAmortizationData.AddRow(true); LastYearRow.Cells[0].AddParagraph().AppendText($"{amortizationData.Date.Year}年合计"); LastYearRow.Cells[1].AddParagraph().AppendText(yearTotalAnnuity.ToString()); LastYearRow.Cells[2].AddParagraph().AppendText(yearTotalInterest.ToString()); LastYearRow.Cells[3].AddParagraph().AppendText(yearTotalPrincipal.ToString()); } } // 总合计逻辑保持不变 WTableRow tableRowSum = tableAmortizationData.AddRow(true); tableRowSum.Cells[0].AddParagraph().AppendText("总计"); tableRowSum.Cells[1].AddParagraph().AppendText(aAmortizationPlanLoanPayment.Sum(p => p.Anuity).ToString()); tableRowSum.Cells[2].AddParagraph().AppendText(aAmortizationPlanLoanPayment.Sum(p => p.InterestPaid).ToString()); tableRowSum.Cells[3].AddParagraph().AppendText(aAmortizationPlanLoanPayment.Sum(p => p.PrincipalPaid).ToString());
如果需要匹配你示例中的小数格式(逗号作为小数分隔符),在ToString方法中指定对应区域文化参数即可。
内容的提问来源于stack exchange,提问作者aleksanderv24
相关产品推荐
相关产品推荐

