返回

Java大师秘技:轻松读写Excel,秒速导入数据库!

后端

Java大师秘技:轻松读写Excel,秒速导入数据库

子标题 1:导入必备神器

在Java后端开发中,处理Excel文件是家常便饭,如何高效地读写Excel,导入数据到数据库就显得至关重要。今天,让我们来揭秘Java大师级技巧,助你轻松搞定Excel数据处理!

第一步:导入必要的库

import org.springframework.web.multipart.MultipartFile;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
  • MultipartFile:用来处理文件上传
  • WorkbookXSSFWorkbook:Apache POI库提供的类,用于操作Excel文件
  • AutowiredService:Spring注解,用于自动注入依赖和标记服务类

子标题 2:读取Excel文件

掌握了导入库的诀窍,接下来就是读取Excel文件了:

Workbook workbook = new XSSFWorkbook(file.getInputStream());
Sheet sheet = workbook.getSheetAt(0); // 获取第一个sheet页
  • file.getInputStream():获取文件输入流,用于读取Excel文件
  • getSheetAt(0):获取Excel文件中的第一个sheet页,如果有多个sheet页,可以使用不同的索引号获取

接下来,就可以遍历sheet页中的行和列,读取每一格的数据了:

for (int i = 0; i < sheet.getLastRowNum() + 1; i++) {
    Row row = sheet.getRow(i);
    // 读取每一行的数据
}
  • getLastRowNum():获取sheet页中最后一行的数据行号(注意:下标从0开始)

子标题 3:导入数据到数据库

读完Excel文件,接下来就是将数据导入到数据库了。这里以Spring Boot和JPA为例:

List<SiteConfig> siteConfigs = new ArrayList<>();
List<LaneConfig> laneConfigs = new ArrayList<>();
List<GunConfig> gunConfigs = new ArrayList<>();

for (int i = 0; i < sheet.getLastRowNum() + 1; i++) {
    Row row = sheet.getRow(i);
    // 解析每一行的数据,并转换为对应的实体类对象
}

excelRepository.saveAll(siteConfigs);
excelRepository.saveAll(laneConfigs);
excelRepository.saveAll(gunConfigs);
  • 创建三个集合,分别存放解析后的数据
  • 解析每一行的数据,并转换为对应的实体类对象
  • 使用Spring Data JPA的saveAll()方法将数据保存到数据库中

子标题 4:解决日志打印问题

在SpringBoot中,如果控制台输出的日志信息中包含MultipartFile类型的参数,可能会导致日志冗长。解决方法是修改日志切面代码:

@Aspect
@Configuration
@Slf4j
public class LogAspect {

    @Pointcut("execution(* com.example.demo.controller.*.*(..))")
    public void controllerLog() {}

    @Around("controllerLog()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        HttpServletRequest request = (HttpServletRequest) pjp.getArgs()[0];
        if (isMultipartRequest(request)) {
            log.info("Skip logging MultipartFile type parameters");
            return pjp.proceed();
        }

        // 正常打印其他参数
        Object[] args = pjp.getArgs();
        log.info("Controller method: {}, parameters: {}", pjp.getSignature(), Arrays.toString(args));

        return pjp.proceed();
    }

    private boolean isMultipartRequest(HttpServletRequest request) {
        return request.getContentType() != null && request.getContentType().startsWith("multipart/form-data");
    }
}
  • 通过@Around注解实现对控制器的环绕通知
  • 判断请求是否为multipart/form-data类型,如果是则跳过MultipartFile类型的参数打印
  • 正常打印其他参数

结论

掌握了这些Java大师级技巧,你就可以轻松实现Excel内容的读取和导入,大大提高开发效率。希望本文能够助你成为Java后端开发的佼佼者!

常见问题解答

  1. 如何处理多sheet页的Excel文件?
int sheetCount = workbook.getNumberOfSheets();
for (int i = 0; i < sheetCount; i++) {
    Sheet sheet = workbook.getSheetAt(i);
    // 读取sheet页中的数据
}
  1. 如何解析不同数据类型的单元格?
Cell cell = row.getCell(j);
if (cell.getCellType() == CellType.NUMERIC) {
    // 数值类型
} else if (cell.getCellType() == CellType.STRING) {
    // 字符串类型
}
  1. 如何将数据转换为实体类对象?

使用BeanUtils等库进行属性拷贝,或手动实现数据转换。

  1. 如何解决导入数据时出现的数据冲突问题?

使用Spring Data JPA的saveOrUpdate()方法或自定义冲突处理逻辑。

  1. 如何优化Excel数据导入的性能?
  • 使用批处理技术
  • 并发处理多个文件
  • 使用高效的解析库