Как я могу заменить автоматически сгенерированные общие итоговые значения другими (Aspose Cells)?

Моя таблица автоматически создает столбец «Общие итоги» в крайнем правом столбце:

введите здесь описание изображения

Это в общем-то приятно. Но в частности, у меня есть пара проблем с этим: последние два значения (с неудачными ярлыками «Сумма средней цены» и «Сумма процентов») предоставляют именно это - сумму предыдущих столбцов. В таких случаях мне нужна не простая сумма, а среднее значение в первом случае и процент во втором.

Для AvgPrice мне нужно вычислить «Сумма общей цены» / «Сумма общей Quty» в столбце «Общая сумма». Например, первое значение общей суммы средней цены должно быть «33,14», а не «66,26».

В качестве процента мне нужен процент от общей цены для элемента / описания (например, «25151,75» в первом элементе выше) по сравнению со значением «Общая цена» в строке общей суммы «Общая сумма общей цены». / столбец ("1529802,82"). Это значение видно здесь:

введите здесь описание изображения

Таким образом, значение «Процент» для этого первого элемента («АСПАРАГА, БОЛЬШОЙ 11/1 #») должно быть примерно 1,6 (поскольку 25151,75 составляет примерно 1/60 от 1529802,82), а не 1,36.

Есть ли способ настроить это для автоматического создания этих значений в столбце общего итога, или мне нужно предотвратить создание столбца общего итога следующим образом:

pivotTable.ColumnGrand = false;

... а затем добавить этот столбец на лист вручную, выполнив вычисления в коде и таким образом добавив эти значения?


person B. Clay Shannon    schedule 21.11.2016    source источник


Ответы (2)


Чтобы подробно разобраться в этой проблеме, отправьте свой запрос на форум Aspose.Cells с примерами файлов Excel. Вы можете предоставить нам исходный файл Excel, фактический выходной файл Excel, а также ожидаемый файл Excel и образец кода. И предоставленный вами снимок экрана также будет полезен. Спасибо за сотрудничество в этом отношении.

Ссылка на форум Aspose.Cells:

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

Примечание. Я работаю евангелистом разработчиков в Aspose

person shakeel    schedule 22.11.2016
comment
Я не знаю, как это сделать в самом Excel; Я все делаю в коде. - person B. Clay Shannon; 22.11.2016
comment
Эта цепочка была помечена как разрешенная с помощью предоставленного вами кода. - person shakeel; 25.11.2016

Я думаю, что проще всего просто добавить этот столбец вручную, вычислив необходимые значения; вот как я это делаю сейчас (в основном та же идея, что и в 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 ())

person B. Clay Shannon    schedule 22.11.2016