Как проверить и объединить две строки, если следующее значение совпадает или не в Excel с epPlus - PullRequest
0 голосов
/ 08 октября 2018

Я работаю над созданием динамического Excel с помощью библиотеки EPPlus, и у меня есть Excel, данные которого выглядят так:

Name     EmpCode   Department      attendance
Prashant  111      CSE         70% for Sep
Prashant  111      CSE         90% for Oct
XYZ       112      HR          50% for Sep
XYZ       112      HR          90% for Oct

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

enter image description here

Я чертовски уверен, что каждый empCode будет повторяться только два раза.

Код, который я пробовал:

for (var rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++)
 {
   var row = ws.Cells[string.Format("{0}:{0}", rowNum)];
 }

1 Ответ

0 голосов
/ 10 октября 2018

Этот код будет работать только в том случае, если empcode повторяется дважды, но вы сказали, что чертовски уверены, что он будет повторен только дважды, поэтому все должно быть в порядке, но не очень масштабируемым.

Как только вы получитеданные в вашей электронной таблице вы должны пройти по всем строкам в вашем наборе данных.В начале цикла вы устанавливаете диапазон вашей текущей строки, а в конце цикла вы устанавливаете диапазон вашей предыдущей строки.Если установлен предыдущий диапазон, вы оцениваете столбцы каждой строки, чтобы определить, следует ли объединять ячейки вместе.

using (var p = new OfficeOpenXml.ExcelPackage(new FileInfo(@"c:\FooFolder\Foo.xlsx")))
{
    ExcelWorkbook wb = p.Workbook;
    ExcelWorksheet ws = wb.Worksheets[1];

    //create variable for previous range that will persist through each loop
    ExcelRange previousRange = null;

    //set position of first column to merge
    int mergecellBegin = 1;

    //set position of last column to merge
    int mergeCellEnd = 3;

    //create variable to check the cells of your rows
    bool areCellsEqual;

    //iterate through each row in the dataset

    for (var rowNum = 2; rowNum <= ws.Dimension.End.Row; rowNum++)
    {
        ExcelRange currentRange = ws.Cells[rowNum, 1, rowNum, mergeCellEnd];

        //will skip if we haven't set previous range yet
        if (previousRange != null)
        {
            //reset your check variable
            areCellsEqual = true;
            //check if all cells in the ranges are qual to eachother
            for (int i = 1; i <= mergeCellEnd; i++)
            {
                //if the cells from the ranges are not equal then set check variable to false and break the loop
                if (!currentRange[rowNum, i].Value.Equals(previousRange[rowNum - 1, i].Value))
                {
                    areCellsEqual = false;
                    break;
                }
            }

            //if all cells from the two ranges match, merge them together.
            if (areCellsEqual)
            {
                //merge each cell in the ranges
                for (int i = 1; i <= mergeCellEnd; i++)
                {
                    ExcelRange mergeRange = ws.Cells[rowNum - 1, i, rowNum, i];
                    mergeRange.Merge = true;
                }
            }
        }

        //sets the previous range to the current range to be used in next iteration
        previousRange = currentRange;
    }

    p.Save();
}
...