Использование NPOI для получения значения объединенной ячейки из электронной таблицы Excel - PullRequest
1 голос
/ 03 апреля 2020

Я использую NPOI для извлечения данных из Excel в текстовый файл. Основываясь на листе Excel, я должен показать данные следующим образом.

Excel Sheet

Ячейка для 13/3/19 в листе Excel объединена в две строки, и я не Не знаю, как я могу получить значение ячейки слияния для May и отобразить его. У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 29 апреля 2020

В Excel, если ячейка объединена с другими ячейками, первая ячейка в объединенной области - это та, которая имеет фактическое значение. Другие ячейки в этом регионе пустые. Объединенные области хранятся на листе, поскольку они могут занимать несколько строк и столбцов.

Чтобы получить значение, вам необходимо:

  1. Проверить, объединена ли текущая ячейка, посмотрев свойство IsMergedCell в самой ячейке.
  2. Если ячейка объединена, пройдите через объединенные области на листе l oop, чтобы найти область, содержащую эту ячейку.
  3. Как только найденная область найдена, получите первую ячейку из области.
  4. Получите значение из этой ячейки.

Вот вспомогательный метод, который я написал, который должен помочь:

public static ICell GetFirstCellInMergedRegionContainingCell(ICell cell)
{
    if (cell != null && cell.IsMergedCell)
    {
        ISheet sheet = cell.Sheet;
        for (int i = 0; i < sheet.NumMergedRegions; i++)
        {
            CellRangeAddress region = sheet.GetMergedRegion(i);
            if (region.ContainsRow(cell.RowIndex) && 
                region.ContainsColumn(cell.ColumnIndex))
            {
                IRow row = sheet.GetRow(region.FirstRow);
                ICell firstCell = row?.GetCell(region.FirstColumn);
                return firstCell;
            }
        }
        return null;
    }
    return cell;
}

Затем, когда вы проходите по своим ячейкам, вы можете просто вызовите этот метод для каждой ячейки. Если ячейка объединена, она вернет ячейку, которая имеет значение для этой объединенной области, иначе она просто вернет исходную ячейку обратно. Тогда вам больше не нужно об этом думать.

cell = GetFirstCellInMergedRegionContainingCell(cell);
if (cell != null)
{
    // get the value
}
...