Directorio de artículos
FácilExcel
EasyExcel es una herramienta de procesamiento de Excel rápida y concisa basada en Java que resuelve el desbordamiento de memoria de archivos grandes.
Le permite completar rápidamente la lectura, escritura y otras funciones de Excel sin considerar el rendimiento, la memoria y otros factores.
Introducir dependencias
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.3</version>
</dependency>
Introducir la dependencia de Dozermapper para la conversión de tipos posterior entre objetos.
<dependency>
<groupId>com.github.dozermapper</groupId>
<artifactId>dozer-spring-boot-starter</artifactId>
<version>6.5.0</version>
</dependency>
Estructura de la tabla
mesa de estudiantes
CREATE TABLE `student` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学生表ID',
`sname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学生姓名',
`sno` bigint NOT NULL COMMENT '学号',
`sex` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '性别',
`age` int NOT NULL COMMENT '年龄',
`is_deleted` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除',
PRIMARY KEY (`id`)
);
Estructura del proyecto
Clase de herramienta DozerUtils
public class DozerUtils {
public static <T,S> List<T> mapList(final Mapper mapper, List<S> sourceList, Class<T> targetObjectClass){
List<T> targetList=new ArrayList<T>();
for(S s:sourceList){
targetList.add(mapper.map(s,targetObjectClass));
}
return targetList;
}
}
Clase de entidad Estudiante
@ExcelProperty(value = "El nombre del encabezado de este campo en Excel")
@ExcelIgnore: ignora este campo al analizar
@Data
public class Student {
/**主键ID**/
@ExcelIgnore
private Long id;
/**学生姓名**/
@ExcelProperty(value = "姓名")
private String sname;
/**学号**/
@ExcelProperty(value = "学号")
private Long sno;
/**性别**/
@ExcelProperty(value = "性别")
private String sex;
/**年龄**/
@ExcelProperty(value = "年龄")
private Integer age;
/**是否删除**/
@ExcelIgnore
private Integer isDeleted;
}
Controlador
@RestController
@RequestMapping("/easyExcel")
public class EasyExcelController {
@Resource
private IStudentService studentService;
@PostMapping("/studentInput")
public void studentInput(MultipartFile file){
studentService.studentInput(file);
}
}
Clase de monitoreo
Esta vez, está configurado en 1000 piezas de datos para una importación por lotes. Se puede ajustar dentro de 3000 según la situación real.
Esta importación no establece la lógica de importación. Si necesita configurar la lógica, llame al método de servicio agregado de acuerdo con la lógica en el método saveDate de la clase de escucha.
@Data
public class StudentListener extends AnalysisEventListener<Student> {
/**
*单次缓存量为1000
*/
private final int BATCH_SIZE = 1000;
/**
* 临时存储List
*/
List<Student> cacheData = new ArrayList<Student>();
private IStudentService studentService;
private Mapper dozerMapper;
public StudentListener(IStudentService studentService, Mapper dozerMapper){
this.studentService = studentService;
this.dozerMapper = dozerMapper;
}
@Override
public void invoke(Student data, AnalysisContext analysisContext) {
cacheData.add(data);
if (cacheData.size() >= BATCH_SIZE){
saveData();
//每批存储完成后清空list
cacheData.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
if (cacheData.size() > 0){
saveData();
}
}
/**
* 加入数据库
*/
private void saveData(){
List<Student> students = DozerUtils.mapList(dozerMapper,cacheData,Student.class);
studentService.saveBatch(students);
}
}
Servicio
public interface IStudentService extends IService<Student> {
void studentInput(MultipartFile file);
}
ServicioImpl
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {
@Resource
private IStudentService studentService;
@Resource
private Mapper dozerMapper;
@Override
@Transactional(rollbackFor = Throwable.class)
public void studentInput(MultipartFile file) {
try {
InputStream inputStream = file.getInputStream();
EasyExcel.read(inputStream, Student.class,
new StudentListener(studentService, dozerMapper)).sheet().doRead();
}catch (Exception e){
e.printStackTrace();
}
}
}
mapeador
public interface StudentMapper extends BaseMapper<Student> {
}
Proyecto de inicio
prueba
Datos de prueba
Tenga en cuenta que el texto del nombre de la columna es el mismo que el texto en la anotación del campo correspondiente de la clase de entidad.
prueba de cartero
Establecer el formato para presentar en formulario-datos
Seleccione el archivo de prueba que desea cargar
Una vez completado, verifique la base de datos
y la importación se realizó correctamente.