c# - 在新行中按日期添加分组中的运行总和
问题描述
我正在使用 Syncfusion DocIO 在 .docx 中创建带有一些道具的表格,并且无法在每个新年创建按日期分组的行 => 我需要运行总和的新行。我已经创建了总和行,但是这一行返回所有额外道具(列)的总和,所以我需要的只是每一年的新行运行总和。
我的例子:
几个月 | 年金 | 利息已付 | 本金已付 | 余额到期 | 日期 |
---|---|---|---|---|---|
1 | 84,69 | 2,50 | 82,19 | 917,81 | 2021/11/12 |
2 | 84,69 | 2,29 | 82,40 | 835,41 | 2021/12/12 |
2021年总和 | |||||
3 | 84,69 | 2,09 | 82,61 | 752,80 | 2022/1/12 |
4 | 84,69 | 1,88 | 82,81 | 669,99 | 2022/2/12 |
5 | 84,69 | 1,67 | 83,02 | 586,97 | 2022/3/12 |
6 | 84,69 | 1,47 | 83,23 | 503,75 | 2022/4/12 |
7 | 84,69 | 1,26 | 83,43 | 420,31 | 2022/5/12 |
8 | 84,69 | 1,05 | 83,64 | 336,67 | 2022/6/12 |
9 | 84,69 | 0,84 | 83,85 | 252,82 | 2022/7/12 |
10 | 84,69 | 0,63 | 84,06 | 168,75 | 2022/8/12 |
11 | 84,69 | 0,42 | 84,27 | 84,48 | 2022/9/12 |
12 | 84,69 | 0,21 | 84,48 | 0,00 | 2022/10/12 |
2022年总和 | |||||
总和 | 1016,32 | 16,32 | 1000,00 |
我的代码:
int i = 1;
foreach (var amortizationData in aAmortizationPlanLoanPayment)
{
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++;
if (amortizationData.Date.Month == 12)
{
WTableRow YearSumrow = tableAmortizationData.AddRow(true);
WTableCell cell1 = YearSumrow.Cells[0];
var sumYearIWTextRange = cell1.AddParagraph().AppendText($"Sum for year {amortizationData.Date.Year}");
sumYearIWTextRange = YearSumrow.Cells[1].AddParagraph().AppendText(); // need here running sum inside appendText();
sumYearIWTextRange = YearSumrow.Cells[2].AddParagraph().AppendText(); // need here running sum inside appendText();
sumYearIWTextRange = YearSumrow.Cells[3].AddParagraph().AppendText(); // need here running sum inside appendText();
}
if (amortizationData.BalanceDue == 0.00)
{
WTableRow LastYearRow = tableAmortizationData.AddRow(true);
WTableCell cellLastYear = LastYearRow.Cells[0];
var sumLastYearIWTextRange = cellLastYear.AddParagraph().AppendText($"Sum for year {amortizationData.Date.Year}");
sumLastYearIWTextRange = LastYearRow.Cells[1].AddParagraph().AppendText(); // need here running sum inside appendText();
sumLastYearIWTextRange = LastYearRow.Cells[2].AddParagraph().AppendText(); // need here running sum inside appendText();
sumLastYearIWTextRange = LastYearRow.Cells[3].AddParagraph().AppendText(); // need here running sum inside appendText();
}
}
WTableRow tableRowSum = tableAmortizationData.AddRow(true);
WTableCell cell = tableRowSum.Cells[0];
var totalIWTextRage = cell.AddParagraph().AppendText("Sum all");
var totalAmountIWTextRage = tableRowSum.Cells[1].AddParagraph().AppendText(aAmortizationPlanLoanPayment.Sum(p => p.Anuity).ToString());
totalAmountIWTextRage = tableRowSum.Cells[2].AddParagraph().AppendText(aAmortizationPlanLoanPayment.Sum(p => p.InterestPaid).ToString());
totalAmountIWTextRage = tableRowSum.Cells[3].AddParagraph().AppendText(aAmortizationPlanLoanPayment.Sum(p => p.PrincipalPaid).ToString());
解决方案
如果您有一堆数字(已经分组并汇总到不同的日期,但不必如此);
(DateTime D, int V)[] rows = new [] {
(new(1999, 12, 1), 111),
(new(2000, 1, 1), 222),
(new(2000, 2, 1), 333),
(new(2000, 3, 1), 444),
(new(2001, 1, 1), 555)
}
那么当然,你可以用LINQ做你的运行总和:
foreach(var row in rows){
var runSum = rows.Where(r => r.D <= row.D).Sum(r => r.V);
}
但这比仅仅保留一个变量更浪费资源:
var runSum = 0;
foreach(var row in rows){
runSum += row.V;
}
如果您希望您的运行总和不时重新开始,只需记住前一行(当然您的行需要按顺序排列):
var prevRow = rows[0];
var runSum = 0;
foreach(var row in rows){
if(prevRow.D.Year != row.D.Year)
runSum = 0;
runSum += row.V;
}
如果您不希望当前行值出现在总数中,则在增加 runSum 的行上方输出输出,如果您这样做,则在其下方输出
推荐阅读
- python - 如何为我的 heroku 应用修改 streamlit 包的 server_util.py 文件?
- flutter - Flutter / Direct to web / admin UI 生成?
- google-apps-script - 如何将 Google App Script 应用于在特定位置包含特定值的表格?
- openlayers - 标记多边形开放层每边的长度 3
- browser - 是否有任何浏览器/附加组件在 Inspect Element 中具有仅显示(突出显示)修改和新添加值的选项?
- c# - 在 EF Core 代码优先方法中正确映射枚举
- kotlin - 如何在 kotlin 中创建具有浮点值的列表
- shopify - 我们可以根据我们的要求创建类似于 {{ content_for_index }} 的东西并在我们想要的页面中使用它吗?购物主题
- c# - C# dbmongo 驱动程序日期过滤器不适用于查找
- android - 无法使用 Volley 获得 HTTPS 响应