如何使用 Apache poi 从 xls 文件复制特定行并将其导出到新的 xlsx 文件?

How to copy a particular row from xsls file and export it to new xlsx file using Apache poi?

我有一个包含 216 个 xsls 文件的文件夹。我的逻辑是循环抛出文件夹并读取每个文件,复制每个文件的第一行并将该行写入新的 .xsls 文件。

我想复制第一行而不重复抛出该行并读取每个单元格?例如,如果您复制 .txt 文件或 .csv 文件中的第一行。

此外,这是一个非常缓慢的过程。您有加快此过程的提示吗?

 public static void listFilesForFolder(final File folder,final File exported, int skipLine) {
    try {
        for (final File fileEntry : folder.listFiles()) {
            
            String ext = fileEntry.getName().substring(fileEntry.getName().lastIndexOf('.') + 1);
            
            System.out.println("-->> " + fileEntry.getName() + "-->>");
            
            FileInputStream file = new FileInputStream(new File(fileEntry.getPath()));
            
            if (fileEntry.isDirectory()) {
                continue;
            } else if(ext.equals("xlsx")) {
                
                XSSFWorkbook myWorkBook = new XSSFWorkbook(file);
                XSSFSheet mySheet = myWorkBook.getSheetAt(0);
                
                Iterator<Row> rowIterator = mySheet.iterator();
                
                    Row row = rowIterator.next();
                    
                    row = rowIterator.next();
                    
                    Iterator<Cell> cellIterator = row.cellIterator();
                    while (cellIterator.hasNext()) {
                        Cell cell = cellIterator.next();
                        switch (cell.getCellType()){
                            case STRING:
                                System.out.print(cell.getStringCellValue() + "\t");
                                break;
                            case NUMERIC:
                                System.out.print(cell.getNumericCellValue() + "\t");
                                break;
                            default:
                        }
                    }
                    System.out.println("");
                file.close();
            }
        }
    }catch (Exception e){
        System.out.println(e.getMessage());
    }
    }

我找到了问题的答案。 您不能复制整行。您需要逐个单元地循环和读取。 解决方案是:

声明 rowInrecmenter, colIncremnter, xssfWorkbook = new XSSFWorkbook();, XSSFSheet createdSheet = xssfWorkbook.createSheet("Put any name here");

以上变量需要在循环外

其余代码为:

XSSFRow rowCreated = createdSheet.createRow((short)incr);

while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
                    switch (cell.getCellType()) {
                        case STRING:
                            rowCreated.createCell(col).setCellValue(cell.getStringCellValue());
                            col++;
                            break;
                        case NUMERIC:
                            rowCreated.createCell(col).setCellValue(cell.getNumericCellValue());
                            col++;
                            break;
                        default:
                    }
                }
                xssfWorkbook.write(fileOut);
                incr++;
                col = 0;
                workbook.close();
                file.close();
            }
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }finally {
        fileOut.close();
        xssfWorkbook.close();

    }