栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

基于PIO把带有数据和图片的excel表导入到数据库中(图片存储到服务器中,可访问图片路径存入在数据库中)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于PIO把带有数据和图片的excel表导入到数据库中(图片存储到服务器中,可访问图片路径存入在数据库中)

基于PIO把带有数据和图片的excel表导入到数据库中(图片存储到服务器中,可访问图片路径存入在数据库中)

文章目录
  • 基于PIO把带有数据和图片的excel表导入到数据库中(图片存储到服务器中,可访问图片路径存入在数据库中)
  • 前言
    • 创作来之不易可点一颗小心心
  • 一、工具类getExcelMap说明?
  • 二、使用步骤
    • 1.引入库
    • 2.读excel中的数据和图片
    • 2.ExcelUtil:获取图片和存图片
  • 总结


前言 创作来之不易可点一颗小心心 一、工具类getExcelMap说明?

以下工具类都是基于PIO原生态实现的,其中包含了.xls和.xlsx的导入,也涉及到了在excel解析图片。

二、使用步骤 1.引入库

            org.apache.poi
            poi-ooxml
            4.1.0
        
2.读excel中的数据和图片

代码如下(示例):

public List> getExcelMap(MultipartFile multipartFile,List inputFields,String filePath,String webPath ) {
        List> list=new ArrayList<>();
        //如果excel表中有日期的话,则把日期规范化
        DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try (InputStream inputStream = multipartFile.getInputStream()) {
            //读取excel
            Workbook workbook;
            Map sheetPictures=null;
            Sheet sheet=null;
            if (multipartFile.getOriginalFilename().endsWith(".xls")) {
                workbook = new HSSFWorkbook(inputStream);
                sheet= workbook.getSheetAt(0);
                //获取图片
                sheetPictures = ExcelUtil.getPictures((HSSFSheet)sheet);
            } else {
                workbook = new XSSFWorkbook(inputStream);
                sheet= workbook.getSheetAt(0);
                //获取图片
                sheetPictures = ExcelUtil.getPictures((XSSFSheet) sheet);
            }
            Map printImgMap=null;
            //把图片存入数据库中,返回图片存储路径
            if (sheetPictures.size()!=0){
                printImgMap= ExcelUtil.printImg( sheetPictures,filePath,webPath);
            }

            //获取的firstRowNum其实是=0的,firstCellNum 也是=0
            int firstRowNum = sheet.getFirstRowNum();
            Row firstRow = sheet.getRow(firstRowNum);
            int lastRowNum = sheet.getLastRowNum();
            int firstCellNum = firstRow.getFirstCellNum();
            int lastCellNum = firstRow.getLastCellNum();
            //firstRowNum + 1是因为单元格都是坐标(0,0)开始算的。excel表中的第一行是表头,所以不需要获取,就直接从第二行数据行开始
            for (int i = firstRowNum + 1; i <= lastRowNum; i++) {
                Row row = sheet.getRow(i);
               //空表格就不需要进循环了,根据第一列名称的有无来判断是否是空白行
               
                DataFormatter formatter = new DataFormatter();
                if (StringUtil.isBlank(formatter.formatCellValue(row.getCell(0)))){
                    break;
                }
                String value = "";
                Map map=new LinkedHashMap<>();
                log.info("lastCellNum------>{}",lastCellNum);
                for (int j = firstCellNum; j < lastCellNum; j++) {
                    value = "";
                    Cell cell = row.getCell(j);
					//null != cell避免遇到空指针。使用StringUtil.isNotBlank(cell)的话会报错,原因是如果单元格没有内容的话会报空指针异常。
                    if(null != cell) {
                        log.info("第【{}】行,第【{}】列数据:{}", i, j, cell);
                        if (cell.getCellType().equals(CellType.NUMERIC)) {
                            if (DateUtil.isCellDateFormatted(cell)) {
                                Date d = cell.getDateCellValue();
                                value = formater.format(d);
                            } else {
                                cell.setCellType(CellType.STRING);
                                value = cell.getStringCellValue();
                            }
                        }else if(StringUtil.isNotBlank(printImgMap.get(i + "_" +j))){
                            value=printImgMap.get(i+"_"+j);
                        } else {
                            cell.setCellType(CellType.STRING);
                            value = cell.getStringCellValue();
                        }
                    }
					//遍历列,获得第一行对应的表头所在列的单元格中的字段中文名称。然后根据字段中文名获取到字段英文名。为key值。
                    Cell headCell = firstRow.getCell(j);
                    log.info("headCell[{}]:{}", j, headCell);
                    String fieldNameCn = headCell.getStringCellValue();
                    log.info("fieldNameCn:{}", fieldNameCn);
                    String fieldNameEn = fieldMap.get(fieldNameCn);
                    log.info("fieldNameEn:{}", fieldNameEn);
                    map.put(fieldNameEn,value);
                    log.info("map:{}",map);
                }
                list.add(map);
            }
        } catch (IOException e) {
            log.error("拼接sql发生异常 [{}]", e);
        }
        return list;
    }
2.ExcelUtil:获取图片和存图片
public class ExcelUtil{

 
    public static Map getPictures(HSSFSheet sheet) {
        Map map = new HashMap<>();
        List list = sheet.getDrawingPatriarch().getChildren();
        for (HSSFShape shape : list) {
            if (shape instanceof HSSFPicture) {
                HSSFPicture picture = (HSSFPicture) shape;
                HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();
                PictureData pData = picture.getPictureData();
                String key = cAnchor.getRow1() + "_" + cAnchor.getCol1();
                map.put(key, pData);
            }
        }
        return map;
    }

    
    public static Map getPictures (XSSFSheet sheet) throws IOException {
        Map map = new HashMap<>();
        for (POIXMLDocumentPart dr : sheet.getRelations()) {
            if (dr instanceof XSSFDrawing) {
                XSSFDrawing drawing = (XSSFDrawing) dr;
                List shapes = drawing.getShapes();
                for (XSSFShape shape : shapes) {
                    XSSFPicture pic = (XSSFPicture) shape;
                    XSSFClientAnchor anchor = (XSSFClientAnchor) shape.getAnchor();
                    CTMarker ctMarker = anchor.getFrom();
                    String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol();
                    map.put(picIndex, pic.getPictureData());
                }
            }
        }
        return map;
    }


 

    //图片写出
    public static Map printImg(Map mapList,String filePath,String webPath) throws IOException {
        Map map = new HashMap<>();
        mapList.forEach((key, pic) -> {
            // 文件扩展名
            String ext = pic.suggestFileExtension();
            // 图片数据
            byte[] data = pic.getData();
            //图片保存路径 医院名称+微信公众号/医院照片+图片后缀
            String ImgName= UUID.randomUUID().toString()+"." + ext;
            //写入到对应的文件夹路径下面去
            //filePath+imgName=/aaa/bbb/xxxxx.jpg
            try (FileOutputStream out = new FileOutputStream(filePath+imgName)) {
            out.write(bytes);
        	} catch (Exception e) {
            e.printStackTrace();
        	}
        	//map中的value为:http://localhost:8080/aaa/bbb/xxxxx.jpg
            map.put(key, webPath+ImgPath);
            });
            return map;
        }

    }


}

总结

由于List> getExcelMap最后的返回list存入数据库去的方式是使用jdbc原生态insert语句拼接而成的,过程很复杂,但其核心取excel中的数据和图片已实现

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024206.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号