杰瑞科技汇

Java Excel导入数据,如何高效处理?

Java Excel 数据导入指南

在Java中导入Excel数据,有多种方法可以实现,以下是几种常用的方案:

Java Excel导入数据,如何高效处理?-图1
(图片来源网络,侵删)

使用Apache POI库

Apache POI是最流行的Java操作Excel的库,支持.xls和.xlsx格式。

Maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

基本示例代码

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ExcelImporter {
    public static List<String[]> readExcel(String filePath) throws IOException {
        List<String[]> dataList = new ArrayList<>();
        try (FileInputStream fis = new FileInputStream(filePath);
             Workbook workbook = new XSSFWorkbook(fis)) {
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
            DataFormatter dataFormatter = new DataFormatter();
            for (Row row : sheet) {
                String[] rowData = new String[row.getLastCellNum()];
                for (Cell cell : row) {
                    rowData[cell.getColumnIndex()] = dataFormatter.formatCellValue(cell);
                }
                dataList.add(rowData);
            }
        }
        return dataList;
    }
    public static void main(String[] args) {
        try {
            List<String[]> data = readExcel("data.xlsx");
            for (String[] row : data) {
                System.out.println(String.join(", ", row));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用EasyExcel

EasyExcel是阿里巴巴开源的Excel处理库,性能更好,内存占用更低。

Maven依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

基本示例代码

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelImporter {
    public static void main(String[] args) {
        String fileName = "data.xlsx";
        List<UserData> data = new ArrayList<>();
        EasyExcel.read(fileName, UserData.class, new AnalysisEventListener<UserData>() {
            @Override
            public void invoke(UserData data, AnalysisContext context) {
                // 处理每一行数据
                System.out.println("解析到一条数据:" + data);
                this.dataList.add(data);
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                // 所有数据解析完成后的操作
                System.out.println("所有数据解析完成!");
            }
        }).sheet().doRead();
    }
    // 定义实体类
    public static class UserData {
        @ExcelProperty("姓名")
        private String name;
        @ExcelProperty("年龄")
        private Integer age;
        @ExcelProperty("邮箱")
        private String email;
        // getters and setters
    }
}

使用JXL库

JXL是一个轻量级的Excel操作库,但只支持.xls格式。

Maven依赖

<dependency>
    <groupId>net.sourceforge.jexcelapi</groupId>
    <artifactId>jxl</artifactId>
    <version>2.6.12</version>
</dependency>

基本示例代码

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class JxlExcelImporter {
    public static List<String[]> readExcel(String filePath) throws IOException, BiffException {
        List<String[]> dataList = new ArrayList<>();
        Workbook workbook = Workbook.getWorkbook(new File(filePath));
        Sheet sheet = workbook.getSheet(0);
        for (int i = 0; i < sheet.getRows(); i++) {
            String[] rowData = new String[sheet.getColumns()];
            for (int j = 0; j < sheet.getColumns(); j++) {
                rowData[j] = sheet.getCell(j, i).getContents();
            }
            dataList.add(rowData);
        }
        workbook.close();
        return dataList;
    }
}

处理大数据量Excel

对于大数据量Excel,建议使用EasyExcel的SAX模式(流式读取):

Java Excel导入数据,如何高效处理?-图2
(图片来源网络,侵删)
public void largeDataRead() {
    String fileName = "large_data.xlsx";
    // 使用监听器模式读取
    EasyExcel.read(fileName, LargeData.class, new PageReadListener(dataList -> {
        // 每次读取1000条数据
        for (LargeData data : dataList) {
            // 处理数据
        }
    })).sheet().doRead();
}

常见问题处理

  1. 日期格式处理

    Cell cell = row.getCell(0);
    if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
        Date date = cell.getDateCellValue();
        // 处理日期
    }
  2. 空值处理

    if (cell == null || cell.getCellType() == CellType.BLANK) {
        return "";
    }
  3. 性能优化

    • 对于大文件,使用EasyExcel的流式读取
    • 避免在循环中创建对象
    • 使用try-with-resources确保资源释放

选择哪种方法取决于你的具体需求,如文件格式、性能要求、代码简洁性等,对于新项目,推荐使用EasyExcel,它提供了更好的性能和更简洁的API。

Java Excel导入数据,如何高效处理?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇