如何用Java借助Apache POI将Excel单元格输出转为文本文件
嘿,既然你已经用Apache POI搞定了Excel读取和控制台输出,那把内容转成文本文件其实没什么难度——本质就是把原本输出到System.out的内容,改写到文件里就行。我给你两种实用的实现方案,你可以根据自己的场景选:
方法1:用BufferedWriter逐行写入(推荐大文件场景)
这种方式效率更高,还能灵活控制单元格分隔符、换行等格式,适合处理数据量较大的Excel文件。
import org.apache.poi.ss.usermodel.*; import java.io.*; public class ExcelToTextConverter { public static void main(String[] args) { // 用try-with-resources自动关闭资源,避免泄漏 try (Workbook workbook = new XSSFWorkbook(new FileInputStream("your-input-file.xlsx")); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8"))) { Sheet targetSheet = workbook.getSheetAt(0); // 读取第一个工作表,可根据需求调整索引或名称 for (Row row : targetSheet) { StringBuilder rowContent = new StringBuilder(); for (Cell cell : row) { // 用辅助方法获取更准确的单元格内容,比直接toString靠谱 String cellValue = getFormattedCellValue(cell); rowContent.append(cellValue).append("\t"); // 用制表符分隔单元格,可换成逗号、空格等 } // 去掉末尾多余的分隔符,写入一行后换行 writer.write(rowContent.toString().trim()); writer.newLine(); } System.out.println("文本文件已成功生成!"); } catch (IOException e) { e.printStackTrace(); } } // 辅助方法:处理不同类型的单元格,避免格式错误 private static String getFormattedCellValue(Cell cell) { if (cell == null) return ""; switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { // 日期类型可自定义格式,比如用SimpleDateFormat调整 return cell.getDateCellValue().toString(); } else { // 数字转成普通字符串,避免科学计数法 return String.valueOf((long) cell.getNumericCellValue()); } case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: // 公式单元格计算出实际结果 FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator(); return getFormattedCellValue(evaluator.evaluateInCell(cell)); default: return ""; } } }
方法2:用Files类批量写入(适合小文件场景)
如果你的Excel数据量不大,可以先把所有行的内容收集到列表里,再一次性写入文件,代码更简洁:
import org.apache.poi.ss.usermodel.*; import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class ExcelToTextConverter { public static void main(String[] args) { List<String> textContent = new ArrayList<>(); try (Workbook workbook = new XSSFWorkbook(new FileInputStream("your-input-file.xlsx"))) { Sheet targetSheet = workbook.getSheetAt(0); for (Row row : targetSheet) { StringBuilder rowContent = new StringBuilder(); for (Cell cell : row) { rowContent.append(getFormattedCellValue(cell)).append("\t"); } textContent.add(rowContent.toString().trim()); } // 一次性写入所有内容,UTF-8编码避免中文乱码 Files.write(Paths.get("output.txt"), textContent, StandardCharsets.UTF_8); System.out.println("文本文件生成成功!"); } catch (IOException e) { e.printStackTrace(); } } // 和方法1相同的辅助方法,处理单元格内容 private static String getFormattedCellValue(Cell cell) { if (cell == null) return ""; switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { return cell.getDateCellValue().toString(); } else { return String.valueOf((long) cell.getNumericCellValue()); } case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); case FORMULA: FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator(); return getFormattedCellValue(evaluator.evaluateInCell(cell)); default: return ""; } } }
几个关键注意点
- 文件路径:建议使用绝对路径(比如
"C:/data/input.xlsx"),避免因当前工作目录问题找不到文件。 - 字符编码:一定要指定UTF-8,否则中文等非ASCII字符容易出现乱码。
- 单元格类型处理:直接用
cell.toString()可能会导致数字变成科学计数法、日期显示异常,用辅助方法处理不同类型的单元格会更准确。 - 资源管理:使用
try-with-resources语法,Workbook和Writer会自动关闭,不用手动调用close(),避免资源泄漏。
内容的提问来源于stack exchange,提问作者Jeet
相关产品推荐
相关产品推荐

