如何使用Java将本地文件夹内的文件名复制到新建Excel工作表
问题排查与修复方案
原代码核心错误
- 依赖缺失:代码中使用了Apache POI的
XSSFWorkbook类,但没有导入对应的依赖包,编译阶段就会报错。 - 格式混用:
XSSFWorkbook是用于生成.xlsx格式Excel的类,不能直接输出为.csv格式文件,且你写入的是完全空白的工作簿,没有任何有效内容。 - 资源提前关闭:输出流
ExcelFile在写入空白工作簿后就被关闭,后续调用Files.copy使用已关闭的流必然执行失败。 - 逻辑错误:
Files.copy不能直接将文件夹的文件名列表写入目标文件,只会尝试复制文件夹的二进制内容,不符合你的需求。
修复代码(两种实现方案)
方案1:生成CSV文件(无需额外依赖,实现简单)
CSV本质是逗号分隔的文本文件,不需要引入POI依赖即可实现,代码如下:
import java.io.File; import java.io.FileWriter; import java.io.IOException; public class FileListFromFolder { public static void main(String[] args) { // 目标文件夹路径 File demoFolder = new File("C:/Users/nikhil/Desktop/DemoFiles"); // 输出CSV文件路径 File csvFile = new File("C:/Users/nikhil/Desktop/hello.csv"); // 判断文件夹是否存在 if (!demoFolder.exists() || !demoFolder.isDirectory()) { System.out.println("目标文件夹不存在"); return; } try (FileWriter writer = new FileWriter(csvFile)) { // 写入表头 writer.write("文件名\n"); // 遍历文件夹下所有文件 File[] files = demoFolder.listFiles(); if (files != null) { for (File file : files) { // 只需要写入普通文件名、跳过子文件夹的话可加判断 if (file.isFile()) writer.write(file.getName() + "\n"); } } System.out.println("文件名写入成功,文件路径:" + csvFile.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); System.out.println("写入文件出错:" + e.getMessage()); } } }
方案2:用Apache POI生成标准.xlsx格式Excel
如果需要生成标准Excel文件,需要先引入Apache POI的poi、poi-ooxml相关依赖,代码如下:
import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class FileListFromFolder { public static void main(String[] args) { // 目标文件夹路径 File demoFolder = new File("C:/Users/nikhil/Desktop/DemoFiles"); // 输出Excel文件路径 File excelFile = new File("C:/Users/nikhil/Desktop/hello.xlsx"); if (!demoFolder.exists() || !demoFolder.isDirectory()) { System.out.println("目标文件夹不存在"); return; } // 创建工作簿和工作表 try (XSSFWorkbook workbook = new XSSFWorkbook(); FileOutputStream outStream = new FileOutputStream(excelFile)) { XSSFSheet sheet = workbook.createSheet("文件名列表"); // 创建表头行 XSSFRow headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("文件名"); // 遍历文件写入行 File[] files = demoFolder.listFiles(); if (files != null) { int rowIndex = 1; for (File file : files) { XSSFRow row = sheet.createRow(rowIndex++); row.createCell(0).setCellValue(file.getName()); } } // 自适应列宽 sheet.autoSizeColumn(0); // 写入文件 workbook.write(outStream); System.out.println("Excel生成成功,路径:" + excelFile.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); System.out.println("生成Excel出错:" + e.getMessage()); } } }
内容的提问来源于stack exchange,提问作者Nikhil Nbn
相关产品推荐
相关产品推荐

