如何用不同的(Aspose Cells)替换自动生成的总计值?

时间:2016-11-21 17:12:17

标签: excel pivot-table totals aspose-cells

我的电子表格自动生成一个“总计”列,作为最右边的列:

enter image description here

总的来说这很好。但具体而言,我遇到了一些问题:最后两个值(不幸的标签“平均价格总和”和“百分比之和”)只提供了 - 以前列的总和。在这些情况下,我不想要一个简单的总和,而是第一种情况下的平均值和第二种情况下的百分比。

对于AvgPrice,我需要的是在Total Total列中计算“总价格总和”/“总税额总和”。例如,第一个AvgPrice Grand Total值应为“33.14”而不是“66.26”

对于百分比,我需要项目/描述的总价格百分比(例如上面第一项中的“25151.75”)与“总价格总和”中的“总价”值相比较总行/列(“1529802.82”)。这个值可以在这里看到:

enter image description here

因此第一项(“ASPARAGUS,LARGE 11/1#”)的“百分比”值应约为1.6(因为25151.75约为1529802.82的1/60),而不是1.36。

有没有办法将其设置为在Grand Total Column中自动生成这些值,或者我是否需要阻止生成Grand Total列:

pivotTable.ColumnGrand = false;

...然后手动将该列添加到工作表中,在代码中进行计算,并以这种方式添加这些值?

2 个答案:

答案 0 :(得分:1)

要详细查看此问题,请在Aspose.Cells论坛中使用您的示例excel文件发布您的查询。您可以提供源excel文件,实际输出excel文件和预期的excel文件和示例代码。像你提供的截图也会有所帮助。感谢您在这方面的合作。

Aspose.Cells论坛链接:

https://www.aspose.com/community/forums/aspose.cells-product-family/19/showforum.aspx

注意: 我在Aspose担任开发人员传播者

答案 1 :(得分:1)

我认为,最简单的方法就是手动添加该列,计算必要的值;现在我是如何做到的(基本上和Excel Interop中的想法相同 - 手动添加Grand Total列):

在数据透视表代码之后,我调用了AddManualGrandTotalColumn(),它是:

private void AddManualGrandTotalColumn()
{
    var pivot = pivotTableSheet.PivotTables[0];
    var dataBodyRange = pivot.DataBodyRange;
    int rowsUsed = dataBodyRange.EndRow;
    int FIRST_DATA_ROW = 7;
    int currentQtyRow = FIRST_DATA_ROW;
    int ROWS_IN_A_RANGE = 4;

    // Needed?
    pivot.RefreshData();
    pivot.CalculateData();

    // Get Total Sales value, which will be needed for computing the % val
    Cell totalTotalPurchasesCell = pivotTableSheet.Cells[rowsUsed - 2, _grandTotalsColumnPivotTable + 1];
    decimal totalTotalPurchases = Convert.ToDecimal(totalTotalPurchasesCell.Value);

    Cell gtLabelCell = pivotTableSheet.Cells[6, _grandTotalsColumnPivotTable + 2];
    gtLabelCell.Value = "Grand Total";

    Cell QtyCell = null;
    Cell PriceCell = null;
    Cell AvgPriceCell = null;
    Cell PercentageCell = null;
    while (currentQtyRow < rowsUsed)
    {
        // SumTotalQty
        int qty = GetSumTotalQty(currentQtyRow);
        QtyCell = pivotTableSheet.Cells[currentQtyRow, _grandTotalsColumnPivotTable + 2];
        QtyCell.Value = qty;
        // SumTotalPrice
        decimal price = GetSumTotalPrice(currentQtyRow+1);
        PriceCell = pivotTableSheet.Cells[currentQtyRow+1, _grandTotalsColumnPivotTable + 2];
        PriceCell.Value = price;
        // Calculate Avg Price (SumTotalPrice / SumTotalQty)
        decimal avg = 0.0M;
        if ((price > 0) && (qty > 0))
        {
            avg = price / qty;
        }
        AvgPriceCell = pivotTableSheet.Cells[currentQtyRow+2, _grandTotalsColumnPivotTable + 2];
        AvgPriceCell.Value = avg;
        // Calculate Percentage (totalTotalPurchases / SumTotalPrice?)
        decimal prcntg = 0.0M;
        if ((totalTotalPurchases > 0) && (price > 0)) // ? Right calculation?
        {
            prcntg = totalTotalPurchases / price;
        }
        PercentageCell = pivotTableSheet.Cells[currentQtyRow+3, _grandTotalsColumnPivotTable + 2];
        PercentageCell.Value = prcntg;

        currentQtyRow = currentQtyRow + ROWS_IN_A_RANGE;
    }
}

private int GetSumTotalQty(int currentQtyRow)
{
    int FIRST_MONTH_COL = 2;
    int LAST_MONTH_COL = _grandTotalsColumnPivotTable; // - 1;
    int cumulativeQty = 0;
    Cell qtyCell = null;
    for (int i = FIRST_MONTH_COL; i <= LAST_MONTH_COL; i++)
    {
        qtyCell = pivotTableSheet.Cells[currentQtyRow, i];
        cumulativeQty = cumulativeQty + Convert.ToInt32(qtyCell.Value);
    }
    return cumulativeQty;
}

。 。 。 (等等,用于GetSumTotalPrice())