1. 通過 Maven 下載 Easy Excel 依賴包
在項目的 pom.xml
文件中添加以下依賴:
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version> <!-- 使用最新版本 -->
</dependency><!-- 如果使用 Lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope>
</dependency>
maven下載依賴包詳情見文章:https://blog.csdn.net/Y1_again_0_again/article/details/148828971?spm=1011.2124.3001.6209
2. 創建 Excel 對應的實體類
根據Excel表格的列名(如"姓名")和數據類型(如字符串類型),創建對應的Java類來映射表格結構。
使用 Lombok 插件快速創建實體類
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data // 自動添加 get&set 方法、toString 方法
@AllArgsConstructor // 自動添加有參構造方法
@NoArgsConstructor // 自動添加無參構造方法
public class UserData {@ExcelProperty("用戶ID") // 對應 Excel 表頭private Integer id;@ExcelProperty("用戶名")private String username;@ExcelProperty("年齡")private Integer age;@ExcelProperty("郵箱")private String email;@ExcelProperty("注冊時間")private Date registerTime;
}
3. Excel 數據讀取
執行 Excel 數據讀取并輸出結果:
List<StudentsData> students = EasyExcel.read("D:\\Users\\1\\IdeaProjects\\Test_Java_Maven\\src\\test\\resources\\test.xlsx").head(UserData.class).sheet(0).doReadSync();
System.out.println(students);
基本讀取方法
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;public class ExcelReader {public static void main(String[] args) {// 文件路徑String fileName = "user_data.xlsx";// 讀取 Excel 文件EasyExcel.read(fileName, UserData.class, new PageReadListener<UserData>(dataList -> {// 每次讀取 100 條數據會保存一次,處理讀取到的數據for (UserData user : dataList) {System.out.println("讀取到數據: " + user);// 這里可以添加業務邏輯,如保存到數據庫}})).sheet().doRead();}
}
自定義讀取監聽器(更靈活)
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;public class UserDataListener implements ReadListener<UserData> {@Overridepublic void invoke(UserData data, AnalysisContext context) {// 逐行讀取數據System.out.println("解析到一條數據: " + data);// 業務處理...}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println("所有數據解析完成");}
}// 使用自定義監聽器
EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();
4. 寫入 Excel 數據
基本寫入方法
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class ExcelWriter {public static void main(String[] args) {// 文件路徑String fileName = "output_user_data.xlsx";// 模擬數據List<UserData> dataList = new ArrayList<>();dataList.add(new UserData(1, "張三", 25, "zhangsan@example.com", new Date()));dataList.add(new UserData(2, "李四", 30, "lisi@example.com", new Date()));dataList.add(new UserData(3, "王五", 28, "wangwu@example.com", new Date()));// 寫入 ExcelEasyExcel.write(fileName, UserData.class).sheet("用戶數據") // 工作表名稱.doWrite(dataList);}
}
復雜寫入示例(設置表頭、樣式等)
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.IndexedColors;public class AdvancedExcelWriter {public static void main(String[] args) {String fileName = "advanced_user_data.xlsx";// 設置表頭樣式WriteCellStyle headStyle = new WriteCellStyle();headStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex()); // 藍色背景// 設置內容樣式WriteCellStyle contentStyle = new WriteCellStyle();contentStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); // 淺灰色背景HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(headStyle, contentStyle);EasyExcel.write(fileName, UserData.class).registerWriteHandler(styleStrategy) // 注冊樣式策略.sheet("高級用戶數據").doWrite(DataGenerator.generateUserData());}
}
5. 實際應用場景示例
批量導入用戶數據到數據庫
import com.alibaba.excel.EasyExcel;
import org.springframework.stereotype.Service;@Service
public class UserImportService {@Autowiredprivate UserRepository userRepository;public void importUsersFromExcel(String filePath) {EasyExcel.read(filePath, UserData.class, new ReadListener<UserData>() {// 每讀取100條保存一次private static final int BATCH_SIZE = 100;private List<UserData> cachedDataList = new ArrayList<>(BATCH_SIZE);@Overridepublic void invoke(UserData userData, AnalysisContext analysisContext) {cachedDataList.add(userData);if (cachedDataList.size() >= BATCH_SIZE) {saveData();cachedDataList = new ArrayList<>(BATCH_SIZE);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {saveData();}private void saveData() {if (!cachedDataList.isEmpty()) {userRepository.saveAll(cachedDataList.stream().map(this::convertToEntity).collect(Collectors.toList()));}}private User convertToEntity(UserData userData) {User user = new User();user.setUsername(userData.getUsername());user.setAge(userData.getAge());user.setEmail(userData.getEmail());return user;}}).sheet().doRead();}
}