Динамическое объединение строк при экспорте с использованием epplus - PullRequest
0 голосов
/ 07 января 2019

Я хочу объединить строки в моем экспортированном Excel, используя epplus. Приведенный ниже код работает только в том случае, если в одном столбце указано одно и то же значение.

например (я объединяю одно и то же значение в строке Col1):

img1

Но, если у меня есть другая таблица, подобная этой, код, получающий ошибку, в то время как выполняется слияние (я объединяю одно и то же значение в строках Col1 и Col2)

img2

Пожалуйста, помогите мне исправить код.

 void mergeCells(DataTable dt, int startIndex, int totalColumns, ExcelWorksheet ws)
    {
            if (totalColumns == 0) return;
            int i, count = 1;
            ArrayList lst = new ArrayList();
            lst.Add(ws.Cells[2, 1]);
            var ctrl = ws.Cells[startIndex + 1, 1];
            for (i = 1; i <= dt.Rows.Count; i++)
            {
                ExcelRange nextMerge = ws.Cells[i + totalColumns + 1, 1];
                if (ctrl.Text == nextMerge.Text)
                {
                    count++;
                    lst.Add(ws.Cells[i, 1]);
                }
                else
                {
                    if (count > 1)
                    {
                        ws.Cells[i + 1, 1, i + count, 1].Merge = true;
                        mergeCells(new DataTable(lst.ToString()), startIndex + count, totalColumns, ws);
                    }
                    count = 1;
                    lst.Clear();
                    ctrl = ws.Cells[i + 2, startIndex];
                    lst.Add(ws.Cells[i, 1]);
                }
            }
            if (count > 1)
            {
                ws.Cells[startIndex + 1, 1, startIndex + count, 1].Merge = true;
                mergeCells(new DataTable(lst.ToString()), startIndex + count, totalColumns - 1, ws);
            }
            count = 1;
            lst.Clear();
        }

1 Ответ

0 голосов
/ 07 января 2019

Я сделал так:

public void WriteDataToSheet(DataTable data)
{
    using (ExcelPackage excel = new ExcelPackage())
    {
        ExcelWorksheet ws = excel.Workbook.Worksheets.Add("Test");

        ws.Cells["A1"].LoadFromDataTable(data, true);
        ws.Cells[ws.Dimension.Address].AutoFitColumns();

        var listObject = data.AsEnumerable()
                .Select(x => new
                {
                    Col1 = x.Field<string>("Col1"),
                    Col2 = x.Field<string>("Col2"),
                    Col3 = x.Field<string>("Col3")
                }).ToList();


        var lisa = listObject.GroupBy(x => x.Col1).
            Select(x => new
            {
                Id = x.Key,
                Quantity = x.Count(),
                secondGroup = x.GroupBy(y => y.Col2)
                           .Select(y => new
                           {
                               ID = y.Key,
                               secondGroup = y.Count()
                           })
            });

        int A = 1, B = 0, C = 1, D = 0;
        foreach (var item in lisa)
        {
            B = A + 1;
            A += item.Quantity;
            ws.Cells["A" + B + ":A" + A + ""].Merge = true;
            ws.Cells["B" + B + ":B" + A + ""].Merge = true;

            foreach (var item2 in item.secondGroup)
            {
                D = C + 1;
                C += item2.secondGroup;
                ws.Cells["C" + D + ":C" + C + ""].Merge = true;
            }
        }
        // Save merged and modified file to the location
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...