2014-09-10 2 views
1

Я пытаюсь создать группу в экспортированной книге Excel с помощью OpenXML.ClosedXML Outline

Моей таблица исходных данных выглядит следующим образом:

Row  State Product Sales 
1  NY  A  100 
2  NY  A  200 
3  NY  B  300 
4  CA  A  100 
5  CA  A  200 
6  CA  B  300 

Я хотел бы создать план государства и затем продукт с итогом по каждой группе

Я попытался

ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Top; 
ws.Rows(1, 3).Group(); // Create an outline (level 2) for rows 1-4 
ws.Rows(4, 6).Group(); 

Но это не дает мне то, что я хочу, и я не вижу возможности добавлять промежуточные итоги.

Как я могу это достичь?

ответ

2

Пример кода в документации, которую вы используете, либо устарел, либо просто ошибочен.
Если вы хотите группировать строки с 2 по 4, вам необходимо использовать код ws.Rows(3, 4).Group(); (см. Рисунок). Это согласуется с самим Excel, вам нужно выбрать только строки 3 и 4, прежде чем нажимать кнопку группы, чтобы получить тот же результат.

enter image description here

При попытке сгруппировать строки 1 до 3, как в вашем коде вы группировать их всех под ряд 0, что приводит к ошибкам, так как там нет строки 0. Вы можете управлять этим поведением, в некоторой степени с XLOutlineSummaryVLocation Недвижимость. Если вы используете Bottom вместо верхней использовать две верхние строки в группе строк 2 до 4: ws.Rows(2, 3).Group();

При всем этом сказал еще две точки:

  1. Вы должны использовать Excel не номера строк чисел в Ваша колонка «Строка».
  2. Все эти группировки и свертывания предназначены только для показа. Чтобы суммировать номера продаж, вы должны использовать промежуточные функции в Excel (которые в этом случае я считаю довольно запутанными и бесполезными) или добавлять столбцы и результаты непосредственно на C#.

Используя этот код должен привести к нужному результату (см рисунок ниже):

ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Top; 
ws.Cell(1, 5).SetValue("Product subtotals"); 
ws.Cell(1, 6).SetValue("State subtotals"); 

ws.Rows(3, 4).Group();      // group rows 2 to 4 (state NY), outline level 1 
ws.Cell(2, 6).SetFormulaA1("=SUM(D2:D4)"); // subtotal for all NY sales 
ws.Row(3).Group();       // group rows 2 and 3 (product A), outline level 2 
ws.Cell(2, 5).SetFormulaA1("=SUM(D2:D3)"); // subtotal for all NY, product A sales 
ws.Cell(4, 5).SetFormulaA1("=SUM(D4)");  // subtotal for all NY, product B sales 

ws.Rows(6, 7).Group();      // group rows 5 to 7 (state CA), outline level 1 
ws.Row(6).Group();       // group rows 5 and 6 (product A), outline level 2 
ws.CollapseRows(2);       // collapse group level 2 (products) 

enter image description here

Смежные вопросы