You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:29:17