Получить индекс ячейки из значения ячейки, Apache POI

Environment    Status    Version    PatchNumber
Windows        Live      1.0        2
Unix           Live      2.0        4
Mac            Live      1.3        8

Если у меня есть показанные выше данные в excel, как мне получить доступ к номеру ячейки PatchNumber, используя текст

XSSFRow row = (XSSFRow) rows.next();
Я хочу получить доступ к row.getCellNumber("PatchNumber"); //Обратите внимание, что этот метод не существует в Apache POI.


person SDS    schedule 26.09.2012    source источник


Ответы (3)


Думаю, я понимаю, что вам нужно - вы хотите знать, в какой колонке в первой строке содержится слово "Patch"? Если это так, все, что вам нужно сделать, это что-то вроде:

Sheet s = wb.getSheetAt(0);
Row r = s.getRow(0);

int patchColumn = -1;
for (int cn=0; cn<r.getLastCellNum(); cn++) {
   Cell c = r.getCell(cn);
   if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
       // Can't be this cell - it's empty
       continue;
   }
   if (c.getCellType() == Cell.CELL_TYPE_STRING) {
      String text = c.getStringCellValue();
      if ("Patch".equals(text)) {
         patchColumn = cn;
         break;
      }
   }
}
if (patchColumn == -1) {
   throw new Exception("None of the cells in the first row were Patch");
}

Просто просмотрите ячейки в первой (заголовочной) строке, проверьте их значение и отметьте столбец, в котором вы находитесь, когда найдете свой текст!

person Gagravarr    schedule 26.09.2012
comment
Я тоже использую ту же технику в своем коде, просто хотел узнать, есть ли API, предоставляемый Apache POI, чтобы сделать то же самое. Спасибо за ваш вклад. - person SDS; 27.09.2012
comment
Неа. У всех требования к поиску вещей в рабочих листах будут разными, и в первой строке нет ничего особенного, поэтому нет ничего общего, что подходило бы для всех. Лучше всего сделать несколько строк кода самостоятельно, чтобы удовлетворить ваши конкретные требования! - person Gagravarr; 27.09.2012

Разве это не то, что вы хотите?

row.getCell(3) 

public XSSFCell getCell(int cellnum) Возвращает ячейку с заданным индексом (на основе 0) с Row.MissingCellPolicy из родительской книги.

Если вы хотите получить доступ точно по имени - "PatchNumber", вы можете прочитать строку заголовка и сохранить индекс PatchNumber. Я думаю, что табличная модель определяет доступ только к ячейкам, но не предоставляет ассоциированный доступ по именам столбцов. Я думаю, что все ряды в модели равны :-)

Чтобы получить индекс столбца. Я бы перебрал строку заголовка и построил список имен столбцов columns, тогда вы можете использовать columns.indexOf("PatchNumber")

http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html#getCell(int)

person Vladimir    schedule 26.09.2012
comment
getcell(int x) должен вернуть ячейку. Мне нужен номер ячейки, в моем случае patchNumber сегодня находится в столбце 4, завтра он может переместиться в столбец 5 или 3, поэтому хотел знать, могу ли я получить индекс столбца через текст столбца. - person SDS; 26.09.2012
comment
Это невозможно очевидно. Строка не знает о строке заголовка. Вы пытались прочитать строку заголовка? - person Vladimir; 26.09.2012
comment
Я не смог найти никаких API, и теперь, поскольку @Vladimir говорит, что это невозможно, я предполагаю, что такого API не существует в Apache POI. - person SDS; 27.09.2012
comment
@SDS, правильно. Apache POI предоставляет только API для перебора строк и ячеек. Но получение индекса столбца — это логика, которая зависит от вашего документа. Поэтому вам придется перебирать строку заголовка, чтобы получить желаемый результат. Это отвечает на ваш вопрос сейчас? - person Vladimir; 27.09.2012
comment
да, я закончил тем, что написал код, чтобы получить то же самое. Спасибо за ваш вклад. - person SDS; 08.01.2013

person    schedule
comment
этот метод вернет адрес ячейки искомой строки. - person Karthik P; 21.06.2016