Dynamics AX 3.0 SP3 (1951.3730) RUS, Office 2003
Понадобилось вывести в Excel сводную таблицу. Поискал по форуму готовый кусок кода, но, к сожалению и удивлению, не нашел ни одного.

Поэтому выкладываю этот самый кусок, возможно кому-то сэкономит время в дальнейшем.
Метод добавил в стандартный русский класс ComExcelDocument_RU, старался комментировать, но ничего сложного, ессно, в нем нет.
X++:
//_bookMark can be in Letter or RC format (A6:C10 or R6C1:R10C3)
//_destBookmark - only in RC format, as far as I can tell
//containers hold the string names of all fields - should match those used in the worksheet with actual data
#define.xlDatabase(1)
#define.xlPivotTableVersion10(1)
#define.PivotTableName("PivotTable")
void buildPivotTable(BookMark _sourceBookMark, container _columnFields, container _rowFields, container _dataFields,
int _sourceWorkSheet = 1, BookMark _destBookMark = "", int _destWorkSheet = 1)
{
COM comWorkBook, comWorkSheet;
COM comPivotCaches, comPviotCache;
COM comPivotTable, comPivotField;
COM comCommandBars, comCommandBar;
int iPivotField;
BookMark destBookMark;
;
comWorkBook = m_comApplication.activeWorkBook();
comWorkSheet = this.getWorkSheet(_sourceWorkSheet);
comPivotCaches = comWorkBook.PivotCaches();
//xlDatabase means data is in the active workbook
comPviotCache = comPivotCaches.Add(#xlDatabase, strFmt("%1!%2", comWorkSheet.name(), _sourceBookMark));
//CreatePivotTable(str Destination (ex. [Книга1].Лист2!R3A1), str Data location, int pivotTableVersion)
//Empty String as destination means a new WorkSheet will be created
if (_destBookMark)
{
comWorkSheet = this.getWorkSheet(_destWorkSheet);
destBookMark = strFmt("%1!%2", comWorkSheet.name(), _destBookMark);
}
comPivotTable = comPviotCache.CreatePivotTable(destBookMark, strFmt("%1%2", #PivotTableName, _sourceWorkSheet), #xlPivotTableVersion10);
for (iPivotField = 1; iPivotField <= conlen(_columnFields); iPivotField++)
{
comPivotField = comPivotTable.PivotFields(conPeek(_columnFields, iPivotField));
comPivotField.Orientation(2); //xlColumnField
comPivotField.Position(iPivotField);
}
for (iPivotField = 1; iPivotField <= conlen(_rowFields); iPivotField++)
{
comPivotField = comPivotTable.PivotFields(conPeek(_rowFields, iPivotField));
comPivotField.Orientation(1); //xlRowField
comPivotField.Position(iPivotField);
}
for (iPivotField = 1; iPivotField <= conLen(_dataFields); iPivotField++)
{
//AddDataField(PivotField object [, shown name, type of aggregate function ])
//xlSum = -4157 is default
comPivotTable.AddDataField(comPivotTable.PivotFields(conPeek(_dataFields, iPivotField)));
}
//Hide the PivotTable FieldList
comWorkBook.ShowPivotTableFieldList(false);
//Hide the PivotTable CommandBar
comCommandBars = m_comApplication.CommandBars();
comCommandBar = comCommandBars.item(#PivotTableName);
comCommandBar.visible(false);
}
Пример использования:
X++:
static void tutorial_BuildPivotTable(Args _args)
{
ComExcelDocument_RU excel = new ComExcelDocument_RU();
;
excel.newFile();
excel.insertValue("A1", "Family Name");
excel.insertValue("B1", "First Name");
excel.insertValue("C1", "Spendings");
excel.insertValue("D1", "Earnings");
excel.insertValue("A2", "Kashperuk");
excel.insertValue("B2", "Ivan");
excel.insertValue("C2", 1000);
excel.insertValue("D2", 1800);
excel.insertValue("A3", "Zhdanova");
excel.insertValue("B3", "Valeriia");
excel.insertValue("C3", 3010);
excel.insertValue("D3", 3000);
excel.insertValue("A4", "Kashperuk");
excel.insertValue("B4", "Tanya");
excel.insertValue("C4", 4050);
excel.insertValue("D4", 550);
excel.buildPivotTable("A1:D4", ["Family Name"], ["First Name"], ["Spendings", "Earnings"]);
excel.visible(true);
}