Вземете клетъчен индекс от стойността на клетката, Apache POI

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

Ако имам показаните по-горе данни в Excel, как да получа достъп до cellNumber на PatchNumber, като използвам текста

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


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


Отговори (3)


Мисля, че разбирам какво търсите - искате ли да знаете коя колона съдържа думата "Кръпка" в първия ред? Ако е така, всичко, което трябва да направите, е нещо като:

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) трябва да върне клетката. Исках cellNumber, в моя случай 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