Ява. HSSF. Апач-пои. Как модифицировать код

Мои данные хранятся в формате (смотрите вниз): [-] означает пустую ячейку, справа может быть только 10 столбцов, после пробела. Примерно так:
[строка0] [-] [строка1] [строка2] [строка3] .. [строка10] [-]

Как изменить этот код для:

1) получить только [string0]

2) получить только [строка1] [строка2] [строка3]... [строка10] [-]

    try {

    FileInputStream file = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls");

    //Get the workbook instance for XLS file
    HSSFWorkbook workbook = new HSSFWorkbook(file);

    //Get first sheet from the workbook
    HSSFSheet sheet = workbook.getSheetAt(0);

    //Iterate through each rows from first sheet
    Iterator<Row> rowIterator = sheet.iterator();
    while(rowIterator.hasNext()) {
        Row row = rowIterator.next();

        //For each row, iterate through each columns
        Iterator<Cell> cellIterator = row.cellIterator();
        while(cellIterator.hasNext()) {

            Cell cell = cellIterator.next();

            switch(cell.getCellType()) {
                case Cell.CELL_TYPE_STRING:
                    System.out.print(cell.getStringCellValue() + "\t\t");
                    list1.add(cell.getStringCellValue());
                    break;
            }
        }
        System.out.println("");
    }
    file.close();
    FileOutputStream out =
            new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls");
    workbook.write(out);
    out.close();

Я не знаю, как остановить итератор. Он поглощает все..


person Eldar Nezametdinov    schedule 06.08.2013    source источник


Ответы (3)


Если я понимаю, вы просто хотите отфильтровать свою первую строку столбца и отдохнуть отдельно.

Почему бы вам просто не использовать для этого простой счетчик:

 while(rowIterator.hasNext()) {
    Row row = rowIterator.next();
    String RowContent = null;
    Iterator<Cell> cellIterator = row.cellIterator();
    while(cellIterator.hasNext()) {
        Cell cell = cellIterator.next();
        RowContent=RowContent+cell.toString();
    }
    //Code for saving RowContent or printing or whatever you want for text in complete row
}

RowContent даст конкатенацию каждой ячейки одной строки на каждой итерации.

person Sankumarsingh    schedule 06.08.2013
comment
Знаете ли вы, как преобразовать столбцы concat в строку, а затем преобразовать строку в строку для каждой строки? - person Eldar Nezametdinov; 07.08.2013
comment
@EldarNezametdinov: я обновил код. В конце каждого итератора строки Rowcontent даст вам полное содержимое строки после конкатенации. Удовлетворяет ли это ваше требование? - person Sankumarsingh; 07.08.2013
comment
Вы уже сделали достаточно) Я переписал оператор for, и теперь он отлично работает, к сожалению, я до сих пор не знаю, как объединять строки в циклах. Попробую ваш RowContent) Большое спасибо! - person Eldar Nezametdinov; 07.08.2013

Как вы сделали в блоке переключателей с «перерывом». Но я думаю, что вы хотите это:

Iterator<Cell> cellIterator = row.cellIterator();
boolean stop = false;
while(cellIterator.hasNext()) {

  Cell cell = cellIterator.next();

  switch(cell.getCellType()) {
    case Cell.CELL_TYPE_STRING:
      System.out.print(cell.getStringCellValue() + "\t\t");
      list1.add(cell.getStringCellValue());
      stop = true;
      break;
  }

  if (stop) {
    break;
  }
}

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

person Rene M.    schedule 06.08.2013
comment
Будьте осторожны с материалом POI HSSF при работе с огромными листами Excel. У меня есть работающее настольное приложение, использующее POI, которое обрабатывает листы с несколькими тысячами строк. К этим листам нельзя было получить доступ через обычный API POI. В этом случае я использовал трюк, определив xlsx как формат по умолчанию и извлек часть xml, с которой мне нужно работать. - person Rene M.; 06.08.2013

Внешняя ссылка: Руководство занятого разработчика по функциям HSSF и XSSF

Вот пример, который должен работать.

Зависимости Maven:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>

Код:

import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

public class StackOverflowQuestion18095443 {

    public static void main(String[] args) {
        if(args.length != 1) {
            System.out.println("Please specify the file name as a parameter");
            System.exit(-1);
        }
        String sfilename = args[0];
        File file = new File("C:\\Users\\student3\\" + sfilename + ".xls");
        read(file);
    }

    public static void read(File file) {
        try (InputStream in = new FileInputStream(file)) {
            HSSFDataFormatter formatter = new HSSFDataFormatter();
            Workbook workbook = WorkbookFactory.create(in);
            Sheet sheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                Row row = rowIterator.next();
                StringBuilder rowText = new StringBuilder();
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    String cellAsStringValue = formatter.formatCellValue(cell);
                    rowText.append(cellAsStringValue).append(" ");
                }
                System.out.println(rowText.toString().trim());
            }
        } catch (InvalidFormatException | IOException e) {
            e.printStackTrace();
        }
    }
}

Что касается завершения итерации, вы можете условно выйти из цикла. Или вы также можете просто не использовать итератор. Обратите внимание, что вы можете получить ячейку из строки, используя именованную ссылку ( это позволяет обращаться к ячейке по имени, например «A2», как в Excel) или просто по индекс столбца в строке.

person axiopisty    schedule 07.08.2013
comment
Не могли бы вы переписать его с оператором for. Начните ниже, пока (rowIterator.hasNext()) {. А также. Как получить полную строку для КАЖДОЙ строки fullString = [-] [string1] [string2] [string3] .. [string10] [-]. Используете StringBuilder? Или как? - person Eldar Nezametdinov; 07.08.2013