Java 使用ApachePOI从Excel读取单元格

Java 使用ApachePOI从Excel读取单元格,java,excel,apache,apache-poi,Java,Excel,Apache,Apache Poi,我是Apache POI的新手,所以在使用它时遇到了一些麻烦 我需要读取一个Excel文件,但我不需要所有的行,因为我使用这段代码的最终目标是缩小文件(超过900行),使其只包含我以后将使用的信息 因此,我尝试使用以下代码: public static void main(String[] args) { List<Planejado> planejados = new ArrayList<Planejado>(); int i = 0; int

我是Apache POI的新手,所以在使用它时遇到了一些麻烦

我需要读取一个Excel文件,但我不需要所有的行,因为我使用这段代码的最终目标是缩小文件(超过900行),使其只包含我以后将使用的信息

因此,我尝试使用以下代码:

public static void main(String[] args) {

    List<Planejado> planejados = new ArrayList<Planejado>();
    int i = 0;
    int linha = 5;

    try{
        FileInputStream fis = new FileInputStream("C:\\Users\\fs0234\\Desktop\\Projetos\\Realizado X Planejado\\Planej. Semanal por CC do Funcionário (20).xls");
        HSSFWorkbook wb = new HSSFWorkbook(fis);
        HSSFSheet sheet = wb.getSheetAt(0);

        int rowMax = sheet.getLastRowNum();

        while (i <= rowMax) { // interação do excel validando pela coluna I

            Row row = sheet.getRow(linha);
            Cell cell = row.getCell(9);



            if (cell.equals("")){   // Line 38  

                Planejado planejado = new Planejado();
                planejado.setCentroCusto("CC - " + i); // obter valor da celula j + contador
                planejado.setNomeRecurso("Recurso " + i); // obter valor da celula k + contador

                for(int j = 1; j < 53; j++) { //interação das colunas w até bw
                    planejado.getTimecard().put("Semana" + j, 40 + j);//obter o valor das horas
                }

                planejados.add(planejado);
            }
            linha++;
            i++;
        }

        for(Planejado planejado : planejados) { 
            //gravar no banco todos os objetos dentro da lista
            System.err.println(planejado.getCentroCusto() + " | " + planejado.getNomeRecurso() + " | " + planejado.getTimecard().get("Semana6"));
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
publicstaticvoidmain(字符串[]args){
List planejados=new ArrayList();
int i=0;
int-linha=5;
试一试{
FileInputStream fis=新的FileInputStream(“C:\\Users\\fs0234\\Desktop\\Projetos\\Realizado X Planejado\\Planej.Semanal por CC do functionário(20.xls));
HSSF工作手册wb=新的HSSF工作手册(fis);
HSSFSheet sheet=wb.getSheetAt(0);
int rowMax=sheet.getLastRowNum();
而(i而不是使用

if (cell.equals("")){
...
}
试试这个

if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK){
....
}
在使用
equals()
进行对象比较时,要小心,否则会引发
NullPointerException
。请记住,对
null
结果对象调用任何方法都会引发NPE

您应该记住一些避免NullPointerException的最佳实践

糟糕的比较 更好的比较 因此,在后一种情况下,你没有机会以NPE结束


希望它能对你有所帮助。

谢谢你和其他朋友,我能解决这个问题

这是没有bug的代码

List<Planejado> planejados = new ArrayList<Planejado>();
        int i = 0;
        int linha = 5;

        try {
            FileInputStream fis = new FileInputStream("C:\\Users\\fs0234\\Desktop\\Projetos\\Realizado X Planejado\\Planej. Semanal por CC do Funcionário (20).xls");
            HSSFWorkbook wb = new HSSFWorkbook(fis);
            HSSFSheet sheet = wb.getSheetAt(0);

            int rowMax = sheet.getLastRowNum();

            while (i <= rowMax) { // Loop até a última linha da planilha

                Row row = sheet.getRow(linha);

                if (row != null) { // Apenas linhas "não nulas"
                    Cell cell = row.getCell(8); // obter valor da celula I

                    if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) { //Verifica se a coluna I é nula
                        Cell CC = row.getCell(6); // obter valor da celula G
                        Cell nome = row.getCell(10); // obter valor da celula K

                        Planejado planejado = new Planejado();
                        planejado.setCentroCusto("CC - " + CC);
                        planejado.setNomeRecurso("Recurso - " + nome);

                        for (int j = 1, weekCol = 22; j <= 53; j++, weekCol++) { // Loop para pegar todas as semanas

                            Cell week = row.getCell(weekCol); // Obter valor da coluna da semana

                            if (week != null) {
                                planejado.getTimecard().put("Semana" + j, week.getNumericCellValue());
                            } else {
                                planejado.getTimecard().put("Semana" + j, Double.valueOf(0));
                            }
                        }
                        planejados.add(planejado);
                    }
                }
                linha++;
                i++;
            }

            for (Planejado planejado : planejados) { 
                StringBuffer timecard = new StringBuffer();

                for (int k = 1; k < 53; k++) {
                    timecard.append("Semana " + k);
                    timecard.append(": ");
                    timecard.append(planejado.getTimecard().get("Semana" + k));
                    timecard.append(", ");
                }

                System.err.println(planejado.getCentroCusto() + " | " + planejado.getNomeRecurso() + " | " + timecard.toString());
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
List planejados=new ArrayList();
int i=0;
int-linha=5;
试一试{
FileInputStream fis=新的FileInputStream(“C:\\Users\\fs0234\\Desktop\\Projetos\\Realizado X Planejado\\Planej.Semanal por CC do functionário(20.xls));
HSSF工作手册wb=新的HSSF工作手册(fis);
HSSFSheet sheet=wb.getSheetAt(0);
int rowMax=sheet.getLastRowNum();

虽然(谢谢你的帮助,但是现在我在“Cell-Cell=row.getCell(9);”中得到了NPE。好的,试着打印一些SOP语句来找出原因。所以我怀疑的是
row-row=sheet.getRow(linha);
Cell-Cell=row.getCell(9)
在这两行之间的某些地方,您可能会得到null值。请注意
getRow()
如果行未定义,则返回
null
。我使用System.out.println测试了部分代码。对于(Planejado Planejado:planejados){//gravar no banco todos os objetos dentro da lista System.err.println(planejado.getCentroCusto()+“|”+planejado.getnomercurso()+“|”+planejado.getTimecard().get(“Semana6”);}是问题所在。因为当我在注释中留下它时,我得不到NPE。
if ("OK".equals(state)) {
  ...
}
List<Planejado> planejados = new ArrayList<Planejado>();
        int i = 0;
        int linha = 5;

        try {
            FileInputStream fis = new FileInputStream("C:\\Users\\fs0234\\Desktop\\Projetos\\Realizado X Planejado\\Planej. Semanal por CC do Funcionário (20).xls");
            HSSFWorkbook wb = new HSSFWorkbook(fis);
            HSSFSheet sheet = wb.getSheetAt(0);

            int rowMax = sheet.getLastRowNum();

            while (i <= rowMax) { // Loop até a última linha da planilha

                Row row = sheet.getRow(linha);

                if (row != null) { // Apenas linhas "não nulas"
                    Cell cell = row.getCell(8); // obter valor da celula I

                    if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) { //Verifica se a coluna I é nula
                        Cell CC = row.getCell(6); // obter valor da celula G
                        Cell nome = row.getCell(10); // obter valor da celula K

                        Planejado planejado = new Planejado();
                        planejado.setCentroCusto("CC - " + CC);
                        planejado.setNomeRecurso("Recurso - " + nome);

                        for (int j = 1, weekCol = 22; j <= 53; j++, weekCol++) { // Loop para pegar todas as semanas

                            Cell week = row.getCell(weekCol); // Obter valor da coluna da semana

                            if (week != null) {
                                planejado.getTimecard().put("Semana" + j, week.getNumericCellValue());
                            } else {
                                planejado.getTimecard().put("Semana" + j, Double.valueOf(0));
                            }
                        }
                        planejados.add(planejado);
                    }
                }
                linha++;
                i++;
            }

            for (Planejado planejado : planejados) { 
                StringBuffer timecard = new StringBuffer();

                for (int k = 1; k < 53; k++) {
                    timecard.append("Semana " + k);
                    timecard.append(": ");
                    timecard.append(planejado.getTimecard().get("Semana" + k));
                    timecard.append(", ");
                }

                System.err.println(planejado.getCentroCusto() + " | " + planejado.getNomeRecurso() + " | " + timecard.toString());
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }