使用Java将Excel转换为Text的实现方法

在Java中实现Excel文件转换为文本格式(如TXT、CSV等),可以通过多种方式完成。下面介绍几种常用的实现方法,包括使用Apache POI、EasyExcel等库处理不同Excel格式(.xls和.xlsx),并导出为文本格式。

图片[1]_使用Java将Excel转换为Text的实现方法_知途无界

一、常见文本格式说明

  • TXT​:纯文本格式,需自定义分隔符(如制表符、逗号等)来模拟表格结构。
  • CSV(Comma-Separated Values)​​:以逗号分隔的文本格式,可用Excel直接打开,是最常用的文本格式之一。

本文将以 ​CSV​ 作为主要的文本输出格式进行讲解,因为其通用性强且易于实现。如果需要纯TXT格式,可以根据需求调整分隔符。


二、使用Apache POI实现Excel转CSV

1. 添加依赖

如果使用 ​Maven,在 pom.xml 中添加以下依赖,以支持处理 .xls(HSSF)和 .xlsx(XSSF)格式的Excel文件:

<dependencies>
    <!-- Apache POI 核心库 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.4</version> <!-- 请根据需要选择最新版本 -->
    </dependency>
    <!-- Apache POI OOXML,用于处理 .xlsx 文件 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.4</version> <!-- 请根据需要选择最新版本 -->
    </dependency>
</dependencies>

注意​:请访问 Apache POI 官方网站Maven中央仓库 获取最新版本号。

2. 实现代码:Excel转CSV

以下示例代码展示了如何使用Apache POI读取Excel文件(支持 .xls.xlsx),并将其内容写入CSV文件。代码会根据文件扩展名自动选择相应的POI处理类。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; // 用于 .xls
import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 用于 .xlsx

import java.io.*;

public class ExcelToCsvConverter {

    /**
     * 将Excel文件转换为CSV文件
     *
     * @param excelFilePath 输入的Excel文件路径
     * @param csvFilePath   输出的CSV文件路径
     * @throws IOException 文件读写异常
     */
    public static void convertExcelToCsv(String excelFilePath, String csvFilePath) throws IOException {
        // 输入流
        InputStream inputStream = new FileInputStream(new File(excelFilePath));
        Workbook workbook = null;

        try {
            // 根据文件扩展名创建相应的Workbook
            if (excelFilePath.toLowerCase().endsWith(".xlsx")) {
                workbook = new XSSFWorkbook(inputStream);
            } else if (excelFilePath.toLowerCase().endsWith(".xls")) {
                workbook = new HSSFWorkbook(inputStream);
            } else {
                throw new IllegalArgumentException("不支持的文件格式。仅支持 .xls 和 .xlsx 文件。");
            }

            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 创建CSV文件输出流
            BufferedWriter writer = new BufferedWriter(new FileWriter(csvFilePath));

            // 遍历每一行
            for (Row row : sheet) {
                StringBuilder sb = new StringBuilder();
                // 遍历每一个单元格
                for (int i = 0; i < row.getLastCellNum(); i++) {
                    Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    String cellValue = getCellValueAsString(cell);
                    sb.append(cellValue);
                    if (i < row.getLastCellNum() - 1) {
                        sb.append(","); // 使用逗号作为分隔符
                    }
                }
                // 写入行数据
                writer.write(sb.toString());
                writer.newLine(); // 换行
            }

            // 关闭写入器
            writer.close();
            System.out.println("Excel文件已成功转换为CSV文件:" + csvFilePath);

        } finally {
            // 关闭工作簿和输入流
            if (workbook != null) {
                workbook.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }

    /**
     * 获取单元格的值为字符串
     *
     * @param cell 单元格对象
     * @return 单元格值的字符串表示
     */
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        DataFormatter formatter = new DataFormatter();
        return formatter.formatCellValue(cell);
    }

    // 示例用法
    public static void main(String[] args) {
        String excelFilePath = "path/to/your/excel.xlsx"; // 替换为你的Excel文件路径
        String csvFilePath = "path/to/output/converted.csv"; // 替换为你想保存的CSV文件路径

        try {
            convertExcelToCsv(excelFilePath, csvFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 代码说明

  • 文件格式判断​:根据输入的Excel文件路径的扩展名(.xls.xlsx),使用不同的POI类(HSSFWorkbookXSSFWorkbook)来加载工作簿。
  • 读取工作表​:代码默认读取Excel文件中的第一个工作表​(Sheet),如果需要处理多个工作表,可以扩展代码逻辑。
  • 遍历行与单元格​:通过嵌套循环遍历每一行和每一个单元格,使用 DataFormatter 将单元格的值格式化为字符串,以处理不同数据类型(如日期、数字、公式等)。
  • 写入CSV​:将每个单元格的值以逗号分隔,写入到CSV文件中。如果单元格内容中包含逗号或换行符等特殊字符,可能需要进一步处理(如使用引号包裹字段),但本示例为简化处理,未包含这些逻辑。
  • 资源管理​:使用 try-finally 块确保工作簿和输入流在使用后被正确关闭,避免资源泄漏。

4. 处理特殊字符(可选)

如果Excel单元格内容中可能包含逗号、换行符或双引号等特殊字符,建议按照CSV格式规范,将字段用双引号包裹,并对双引号进行转义(即用两个双引号表示一个双引号)。以下是改进后的 getCellValueAsString 方法:

private static String getCellValueAsString(Cell cell) {
    if (cell == null) {
        return "";
    }
    DataFormatter formatter = new DataFormatter();
    String value = formatter.formatCellValue(cell);
    // 如果值中包含逗号、换行符或双引号,则用双引号包裹,并转义双引号
    if (value.contains(",") || value.contains("\"") || value.contains("\n") || value.contains("\r")) {
        value = value.replace("\"", "\"\"");
        return "\"" + value + "\"";
    }
    return value;
}

同时,确保在写入CSV时,字段按照上述规则处理,这样生成的CSV文件可以被Excel正确解析。


三、使用EasyExcel实现Excel转CSV(可选)

EasyExcel 是阿里巴巴开源的一个简单、省内存的Java Excel操作工具,主要用于处理大数据量的Excel读写。虽然EasyExcel主要用于读取和写入Excel,但也可以结合其他方式实现Excel转CSV。

1. 添加依赖

pom.xml 中添加EasyExcel依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version> <!-- 请根据需要选择最新版本 -->
</dependency>

注意​:请访问 EasyExcel GitHubMaven中央仓库 获取最新版本号。

2. 实现代码:Excel转CSV

以下示例使用EasyExcel读取Excel文件,并将数据写入CSV文件。由于EasyExcel更擅长处理大数据量,但对于简单的Excel转CSV,使用Apache POI可能更为直接。

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class EasyExcelToCsvConverter {

    public static void convertExcelToCsv(String excelFilePath, String csvFilePath) throws IOException {
        // 创建一个列表来存储读取的数据(这里假设只读取第一个Sheet的少量数据)
        List<Object> data = new ArrayList<>();

        // 使用EasyExcel读取Excel文件
        EasyExcel.read(excelFilePath, new AnalysisEventListener<Object>() {
            @Override
            public void invoke(Object rowData, AnalysisContext context) {
                data.add(rowData);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                // 所有数据解析完成后的操作
                // 这里需要根据rowData的实际类型进行处理,因为EasyExcel需要定义具体的Java模型类
                // 为了简化,此处不展开,推荐使用Apache POI处理通用情况
                System.out.println("数据读取完成,但需要进一步处理以生成CSV。");
            }
        }).sheet().doRead();

        // 注意:EasyExcel通常需要定义具体的Java模型类来映射Excel的行数据,这里仅为示例
        // 为了简化,推荐使用Apache POI实现通用Excel转CSV
        System.out.println("EasyExcel读取完成,但需要进一步处理以生成CSV。推荐使用Apache POI进行通用转换。");
    }

    // 示例用法(不完整,需根据具体模型类实现)
    public static void main(String[] args) {
        String excelFilePath = "path/to/your/excel.xlsx"; // 替换为你的Excel文件路径
        String csvFilePath = "path/to/output/converted.csv"; // 替换为你想保存的CSV文件路径

        try {
            convertExcelToCsv(excelFilePath, csvFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

说明​:EasyExcel 更适合处理大数据量的Excel文件,并且通常需要为每一行数据定义对应的Java模型类,以便将Excel数据映射为Java对象。对于简单的Excel转CSV需求,使用Apache POI更为简便和通用。因此,推荐优先使用Apache POI实现。


四、将Excel转换为纯TXT格式(自定义分隔符)

如果需要将Excel转换为纯TXT格式,可以使用类似的方法,只需更改输出文件的后缀名和分隔符。例如,使用制表符(Tab)作为分隔符:

1. 修改代码:使用制表符分隔

在之前的 ExcelToCsvConverter 类中,将分隔符从逗号 , 修改为制表符 \t,并将输出文件后缀名改为 .txt

// 将这一行
sb.append(","); // 使用逗号作为分隔符
// 修改为
sb.append("\t"); // 使用制表符作为分隔符

// 将输出文件路径改为 .txt
String txtFilePath = "path/to/output/converted.txt";

2. 完整示例代码:Excel转TXT(制表符分隔)

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; // 用于 .xls
import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 用于 .xlsx

import java.io.*;

public class ExcelToTxtConverter {

    /**
     * 将Excel文件转换为TXT文件(制表符分隔)
     *
     * @param excelFilePath 输入的Excel文件路径
     * @param txtFilePath   输出的TXT文件路径
     * @throws IOException 文件读写异常
     */
    public static void convertExcelToTxt(String excelFilePath, String txtFilePath) throws IOException {
        // 输入流
        InputStream inputStream = new FileInputStream(new File(excelFilePath));
        Workbook workbook = null;

        try {
            // 根据文件扩展名创建相应的Workbook
            if (excelFilePath.toLowerCase().endsWith(".xlsx")) {
                workbook = new XSSFWorkbook(inputStream);
            } else if (excelFilePath.toLowerCase().endsWith(".xls")) {
                workbook = new HSSFWorkbook(inputStream);
            } else {
                throw new IllegalArgumentException("不支持的文件格式。仅支持 .xls 和 .xlsx 文件。");
            }

            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 创建TXT文件输出流
            BufferedWriter writer = new BufferedWriter(new FileWriter(txtFilePath));

            // 遍历每一行
            for (Row row : sheet) {
                StringBuilder sb = new StringBuilder();
                // 遍历每一个单元格
                for (int i = 0; i < row.getLastCellNum(); i++) {
                    Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    String cellValue = getCellValueAsString(cell);
                    sb.append(cellValue);
                    if (i < row.getLastCellNum() - 1) {
                        sb.append("\t"); // 使用制表符作为分隔符
                    }
                }
                // 写入行数据
                writer.write(sb.toString());
                writer.newLine(); // 换行
            }

            // 关闭写入器
            writer.close();
            System.out.println("Excel文件已成功转换为TXT文件:" + txtFilePath);

        } finally {
            // 关闭工作簿和输入流
            if (workbook != null) {
                workbook.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }

    /**
     * 获取单元格的值为字符串
     *
     * @param cell 单元格对象
     * @return 单元格值的字符串表示
     */
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        DataFormatter formatter = new DataFormatter();
        return formatter.formatCellValue(cell);
    }

    // 示例用法
    public static void main(String[] args) {
        String excelFilePath = "path/to/your/excel.xlsx"; // 替换为你的Excel文件路径
        String txtFilePath = "path/to/output/converted.txt"; // 替换为你想保存的TXT文件路径

        try {
            convertExcelToTxt(excelFilePath, txtFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

说明​:此代码与之前的CSV转换代码类似,只是将分隔符从逗号更改为制表符,并将输出文件后缀名改为 .txt。根据需求,您可以自定义其他分隔符或格式。


五、完整示例:Excel转CSV(使用Apache POI)

为了便于理解,以下是完整的、可直接运行的示例代码,使用Apache POI将Excel(.xls 或 .xlsx)转换为CSV文件。

1. 完整代码

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; // 用于 .xls
import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 用于 .xlsx

import java.io.*;

public class ExcelToCsvConverter {

    /**
     * 将Excel文件转换为CSV文件
     *
     * @param excelFilePath 输入的Excel文件路径
     * @param csvFilePath   输出的CSV文件路径
     * @throws IOException 文件读写异常
     */
    public static void convertExcelToCsv(String excelFilePath, String csvFilePath) throws IOException {
        // 输入流
        InputStream inputStream = new FileInputStream(new File(excelFilePath));
        Workbook workbook = null;

        try {
            // 根据文件扩展名创建相应的Workbook
            if (excelFilePath.toLowerCase().endsWith(".xlsx")) {
                workbook = new XSSFWorkbook(inputStream);
            } else if (excelFilePath.toLowerCase().endsWith(".xls")) {
                workbook = new HSSFWorkbook(inputStream);
            } else {
                throw new IllegalArgumentException("不支持的文件格式。仅支持 .xls 和 .xlsx 文件。");
            }

            // 获取第一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 创建CSV文件输出流
            BufferedWriter writer = new BufferedWriter(new FileWriter(csvFilePath));

            // 遍历每一行
            for (Row row : sheet) {
                StringBuilder sb = new StringBuilder();
                // 遍历每一个单元格
                for (int i = 0; i < row.getLastCellNum(); i++) {
                    Cell cell = row.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    String cellValue = getCellValueAsString(cell);
                    sb.append(cellValue);
                    if (i < row.getLastCellNum() - 1) {
                        sb.append(","); // 使用逗号作为分隔符
                    }
                }
                // 写入行数据
                writer.write(sb.toString());
                writer.newLine(); // 换行
            }

            // 关闭写入器
            writer.close();
            System.out.println("Excel文件已成功转换为CSV文件:" + csvFilePath);

        } finally {
            // 关闭工作簿和输入流
            if (workbook != null) {
                workbook.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }

    /**
     * 获取单元格的值为字符串,处理特殊字符(如逗号、双引号、换行符)
     *
     * @param cell 单元格对象
     * @return 单元格值的字符串表示,符合CSV格式规范
     */
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }
        DataFormatter formatter = new DataFormatter();
        String value = formatter.formatCellValue(cell);
        // 如果值中包含逗号、双引号、换行符,则用双引号包裹,并转义双引号
        if (value.contains(",") || value.contains("\"") || value.contains("\n") || value.contains("\r")) {
            value = value.replace("\"", "\"\"");
            return "\"" + value + "\"";
        }
        return value;
    }

    // 示例用法
    public static void main(String[] args) {
        // 替换为你的Excel文件路径
        String excelFilePath = "path/to/your/excel.xlsx";
        // 替换为你想保存的CSV文件路径
        String csvFilePath = "path/to/output/converted.csv";

        try {
            convertExcelToCsv(excelFilePath, csvFilePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 使用步骤

  1. 创建Java项目​:使用IDE(如IntelliJ IDEA、Eclipse)或命令行工具创建一个新的Java项目。
  2. 添加依赖​:如果使用Maven,将上述 pom.xml 中的Apache POI依赖添加到项目中。如果使用其他构建工具或手动管理依赖,请下载相应的POI JAR包并添加到项目的类路径中。
  3. 替换文件路径​:在 main 方法中,将 excelFilePathcsvFilePath 替换为实际的Excel文件路径和希望保存的CSV文件路径。
  4. 运行程序​:编译并运行Java程序,程序将读取指定的Excel文件,并将其内容转换为CSV格式,保存到指定的输出路径。
  5. 查看结果​:打开生成的CSV文件,您将看到Excel中的数据以逗号分隔的形式存储,可以用Excel或其他文本编辑器打开查看。

六、其他注意事项

1. 处理多个工作表

上述示例代码仅处理Excel文件中的第一个工作表。如果需要处理多个工作表,可以扩展代码,为每个工作表创建单独的CSV文件,或在一个CSV文件中通过某种方式区分不同工作表的数据。

2. 处理大文件

对于非常大的Excel文件,使用Apache POI可能会导致内存消耗较高。可以考虑使用事件模型(如SAX解析)​或使用EasyExcel等支持流式读取的库来优化内存使用。

3. 字符编码

在写入CSV或TXT文件时,默认使用平台的字符编码。如果需要指定字符编码(如UTF-8),可以使用 OutputStreamWriter 包装 FileOutputStream,并指定编码。例如:

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFilePath), StandardCharsets.UTF_8));

确保在读取和写入时使用一致的字符编码,以避免乱码问题。

4. 错误处理与日志

在实际应用中,建议添加更完善的错误处理机制和日志记录,以便更好地调试和维护代码。


七、总结

通过使用Apache POI库,Java可以方便地读取Excel文件(包括 .xls.xlsx 格式),并将其内容转换为文本格式(如CSV或TXT)。上述提供的示例代码展示了如何实现这一功能,并包括了处理特殊字符和不同文件格式的细节。根据具体需求,您可以进一步扩展和优化代码,例如处理多个工作表、支持更多文本格式、优化大文件处理等。

如果需要处理更复杂的转换需求或大数据量的Excel文件,可以考虑结合使用其他库(如EasyExcel)或工具,以实现更高的性能和灵活性。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞15 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容