Нахождение самой правой ячейки в документе Excel в .Net - PullRequest
3 голосов
/ 12 января 2010

Я читаю документ Excel через библиотеку DocumentFormat.OpenXml. Есть хороший способ узнать, сколько у него столбцов?

Текущий код, с которым я только что столкнулся при исследовании ошибки, делает это:

public string getMaxColumnName(SheetData aSheetData)
{
    string lLastCellReference = aSheetData.Descendants<Cell>().Last().CellReference.InnerText;
    char[] lRowNumberIndex = lLastCellReference.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' });
    return lLastCellReference.Substring(0, lRowNumberIndex);   
}

На английском языке: найдите последнюю ячейку на листе, получите ссылку на ее ячейку (например, «CB99») и получите все до первой цифры. Проблема в том, что последняя ячейка на листе не обязательно находится в крайнем правом столбце.

У меня есть тестовый лист, который представляет собой аккуратный прямоугольный стол. Он содержит 1000 строк, заполняющих столбцы от A до M, поэтому предполагается, что функция возвращает строку «M». Но поскольку в ячейке C1522 есть посторонний символ пробела, он считается последней ячейкой, поэтому функция сообщает максимальный столбец как «C».

Мой первоначальный импульс состоял в том, чтобы просто заменить этот вызов Last() чем-то вроде Max(columnNumber). Однако Cell, по-видимому, не отображает фактический номер столбца, только эту составную строку CellReference. Я не думаю, что хочу разделять строки внутри предиката.

Есть ли способ найти самый правый столбец листа, не анализируя CellReference каждой отдельной ячейки?

Ответы [ 2 ]

1 голос
/ 12 января 2010

Как я понимаю формат, бывают разные случаи:

  1. Если файл не сгенерирован Excel и рабочая таблица содержит данные таким образом, что в них нет пустых строк и нет пустых столбцов в строке, но не обязательно, чтобы каждая строка имела одинаковое количество столбцов ( что может быть так):

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

  2. Если файл не создан Excel, но ячейки заполнены разреженно (что, очевидно, не так):

    Последняя ячейка каждой строки содержит ссылку на столбец, который должен быть в атрибуте "r". Вам, однако, придется преобразовать ссылку.

  3. Если файл создан в Excel:

    Обычно, и я не нашел сгенерированного в Excel файла, в котором этого нет, часть рабочего листа имеет дочернее имя с измерением, которое имеет атрибут «ref» со ссылкой на ячейку, используемую рабочим листом, т.е. ». Это только случай использования этого, чтобы знать столбцы. Конечно, это работает, только если посторонний символ не входит в столбец после таблицы.

    В качестве альтернативы, обычно каждая строка и каждый сгенерированный в Excel файл имеет такой атрибут, который называется «span» и содержит столбцы, которые использует эта строка. Формат атрибута «span» является числовым, поэтому в вашем примере он будет иметь значение «1:13» для каждой строки в таблице. Может быть, вам нужно только проверить первый ряд таким образом.

0 голосов
/ 12 января 2010

Я пришел к выводу, что это в первую очередь неправильно. Потребляющий код никогда не ищет самую правую ячейку на всем листе. Обычно требуется количество ячеек в конкретной строке - либо строка 1, либо известное расположение заголовка таблицы.

Фактически, за возможным исключением рендеринга или печати, я не могу придумать ситуацию, когда необходимо получить максимальную ячейку всего листа.

Поэтому мне нужно немного изменить рефакторинг. Я изменяю функцию, чтобы она брала лист и индекс строки и возвращала столбец самой правой ячейки в этой строке. То есть теперь это будет выглядеть так:

public string getMaxColumnIndex(SheetData aSheetData, int aRowIndex);

Для реализации этого я могу проверить свойство Row.Spans, когда оно существует, или проанализировать ссылку на ячейку Row.ChildElements.Last().

...