代码之家  ›  专栏  ›  技术社区  ›  B. Clay Shannon-B. Crow Raven

如何将自动生成的总计值替换为不同的值(Aspose单元格)?

  •  0
  • B. Clay Shannon-B. Crow Raven  · 技术社区  · 9 年前

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

    enter image description here

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

    对于AvgPrice,我需要的是在总计列中计算“总价之和”/“总数量之和”。例如,第一个平均价格总值应为“33.14”,而不是“66.26”

    对于百分比,我需要项目/描述的总价百分比(如上文第一项中的“25151.75”)与“总价总和”总计行/列中的“总价”值(“1529802.82”)。该值如下所示:

    enter image description here

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

    是否有一种方法可以设置为自动生成总计列中的值,或者我是否需要防止总计列像这样生成:

    pivotTable.ColumnGrand = false;
    

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

    2 回复  |  直到 4 年前
        1
  •  1
  •   shakeel    9 年前

    为了详细了解这个问题,请在Aspose中发布您的查询。细胞论坛与您的示例excel文件。您可以向我们提供源excel文件、实际输出的excel文件以及预期的excel文件和示例代码。你提供的截图也会很有帮助。感谢您在这方面的合作。

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

    注: 我在Aspose担任开发人员布道者

        2
  •  1
  •   B. Clay Shannon-B. Crow Raven    9 年前

    我认为,最简单的方法是手动添加该列,计算必要的值;我现在是这样做的(基本上与Excel互操作中的想法相同-手动添加总计列):

    在数据透视表代码之后,我调用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())