在Spring Boot中使用easyExcel
库可以非常简便地将本地Excel文件内容读取并存入Java对象列表中。easyExcel
是一个基于Apache POI但更加简洁易用的库,它专注于性能和内存占用的优化。
首先,你需要在pom.xml
中添加easyExcel
的依赖(如果你使用Maven):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>最新版本</version> <!-- 请检查并使用最新版本 -->
</dependency>
然后,创建一个Java对象(DTO)来表示Excel文件中的数据行:
import com.alibaba.excel.annotation.ExcelProperty;
public class DataRow {
@ExcelProperty("列1标题")
private String column1;
@ExcelProperty("列2标题")
private String column2;
// 省略getter和setter方法
}
在上面的代码中,@ExcelProperty
注解用于指定Excel列与Java对象字段之间的映射关系。
接下来,编写一个服务类来读取Excel文件并将其内容转换为Java对象列表:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
public class ExcelService {
public List<DataRow> readExcel(MultipartFile file) throws IOException {
List<DataRow> dataRows = new ArrayList<>();
EasyExcel.read(file.getInputStream(), DataRow.class, new ReadListener<DataRow>() {
@Override
public void invoke(DataRow dataRow, ReadContext context) {
dataRows.add(dataRow);
}
@Override
public void doAfterAllAnalysed(ReadContext context) {
// 所有数据解析完成后会调用此方法,可以在这里执行后续操作
}
}).sheet().doRead(); // 这里指定了读取所有sheet,可以根据需要指定sheet
return dataRows;
}
}
注意:在实际生产代码中,你可能需要处理更大的Excel文件,而上面的代码示例在内存使用方面可能不是最优的。easyExcel
提供了一个基于事件的API来处理大数据量,以避免内存溢出。在这个例子中,我们简化了代码以便于理解,但对于大数据量,你应该使用ExcelReader
和ReadListener
的异步读取方式。
最后,在控制器中调用这个服务来处理文件上传:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
public class ExcelController {
@Autowired
private ExcelService excelService;
@PostMapping("/upload")
public List<DataRow> uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
return excelService.readExcel(file);
}
}
这样,当前端上传Excel文件到/upload
端点时,后端会读取文件内容,将其转换为DataRow
对象列表,并返回给前端。记得在前端HTML中设置一个表单来上传文件,如之前的例子所示。