如何使用 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();
}
我有一个包含 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();
}