Java使用POI操作Excel

在工作中遇到需要使用Excel导入数据到数据库中的需求,因此需要使用Java解析Excel文件,并把解析完成后的每一条记录循环插入到数据库中,同时还需要对Excel文件中每一列的数据做格式校验,校验完成后才执行插入的操作。

因为是前台上传Excel,后台接口中需要接收对应的文件,然后将其转换为Workbook对象,交由业务层进行解析。

		/**
     * 批量导入
     * @return
     * @throws Exception
     */
    @RequestMapping("/batchUpload")
    @ResponseBody
    public String batchUpload(HttpServletRequest request, HttpServletResponse response)throws Exception{
        Writer out = null;
        Workbook workbook = null;
        try {
            response.setContentType("text/html;charset=UTF-8;type=json");
            out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));
            CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                    request.getSession().getServletContext());
            if (multipartResolver.isMultipart(request)) {
                MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
                Iterator<String> iter = multiRequest.getFileNames();
                while (iter.hasNext()) {
                    MultipartFile file = multiRequest.getFile(iter.next());
                    if (file != null) {
                        workbook = ExcelUtil.readExcelByMultipartFile(file);
                    }
                }
            }
            excelService.batchUpload(out,workbook);
            return ResponseEntity.success(null,"success");
        }catch (Exception e){
            logger.error("batchUpload抛出了异常: ", e.getMessage()+e);
            throw new Exception(e);
        }
    }

ExcelUtil工具类的作用是将接收到的Excel文件转换成Workbook,然后进行解析操作,上传的文件支持以xls和xlsx结尾。

	/**
	 * 获取 xls 或 xlsx 的操作
	 * @param item
	 * @return
	 * @throws Exception
	 */
	public static Workbook readExcelByMultipartFile(MultipartFile item) throws Exception {
		try {
			InputStream is = null;
			String fileName = item.getOriginalFilename().substring(item.getOriginalFilename().lastIndexOf("\\")+1);//获取文件名(带后缀)
			String suffix = fileName.substring(fileName.lastIndexOf("."));
			is = item.getInputStream();
			if (".xls".equals(suffix)) {
				return new HSSFWorkbook(is);
			} else if (".xlsx".equals(suffix)) {
				return new XSSFWorkbook(is);
			} else {
				throw new RuntimeException("文件格式错误!");
			}
		} catch (IOException e) {
			throw new Exception("文件上传错误!");
		}
	}

进入Service层对Workbook对象进行操作,创建数据库对应的Object,将每一列的数据set到对象中。

		/**
     * excelService
     * @param out
     * @param workbook
     */
    @Override
    public void batchUpload(Writer out, Workbook workbook) throws Exception{
        try {
            //得到第一个sheet
            Sheet sheet = workbook.getSheetAt(0);
            //得到excel的行数
            int totalRows=sheet.getLastRowNum()+1;
            int totalCells=0;
            //得到excel的列数
            if(totalRows>=1 && sheet.getRow(0) != null){
                totalCells=sheet.getRow(0).getPhysicalNumberOfCells();
            }
            //创建数据集合
            List<Object> dataList = new ArrayList<>();
            Object object = null;

            //从第2行开始,第1行标题除外
            for (int r = 1; r < totalRows; r++) {
                Row row = sheet.getRow(r);
                if (row == null) continue;//row为空直接跳出当前循环
                object = new Object();
                //循环excel的列
                for(int c = 0; c <=totalCells; c++){
                    Cell cell = row.getCell(c);
                    if (c == 0){
                        if(cell==null){
                            throw new RuntimeException("请填写序号");
                        }
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        String id = cell.getStringCellValue();
                        object.setId(id.replaceAll(" ",""));
                    }
                }
                dataList.add(object);
            }
            for (Object object : dataList) {
                excelMapper.addList(object);
            }
        }catch (Exception e){
            logger.error("batchUpload: " + e.getMessage() + e);
            throw new Exception(e.getMessage());
        }
    }

Service层解析完成后,循环调用mapper的插入方法,一个一个将对象插入到数据库中。Excel批量导入介绍完了,下一次总结将数据库的数据导出为Excel。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

当一艘船沉入海底8

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值