在Java中实现Excel文件转换为文本格式(如TXT、CSV等),可以通过多种方式完成。下面介绍几种常用的实现方法,包括使用Apache POI、EasyExcel等库处理不同Excel格式(.xls和.xlsx),并导出为文本格式。
![图片[1]_使用Java将Excel转换为Text的实现方法_知途无界](https://zhituwujie.com/wp-content/uploads/2025/10/d2b5ca33bd20251008110754.png)
一、常见文本格式说明
- 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类(HSSFWorkbook或XSSFWorkbook)来加载工作簿。 - 读取工作表:代码默认读取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 GitHub 或 Maven中央仓库 获取最新版本号。
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. 使用步骤
- 创建Java项目:使用IDE(如IntelliJ IDEA、Eclipse)或命令行工具创建一个新的Java项目。
- 添加依赖:如果使用Maven,将上述
pom.xml中的Apache POI依赖添加到项目中。如果使用其他构建工具或手动管理依赖,请下载相应的POI JAR包并添加到项目的类路径中。 - 替换文件路径:在
main方法中,将excelFilePath和csvFilePath替换为实际的Excel文件路径和希望保存的CSV文件路径。 - 运行程序:编译并运行Java程序,程序将读取指定的Excel文件,并将其内容转换为CSV格式,保存到指定的输出路径。
- 查看结果:打开生成的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)或工具,以实现更高的性能和灵活性。

























暂无评论内容