excel帶圖片導入(POI)

/**
     * excel導入
     *
     * @param file
     * @return
     */
    @Transactional
    @Override
    public String importInstallManageExcel(FileItem file) {
        try {

            //服務器地址
            String uploadRoot = "D:/";

            //上傳的目錄
            String uploadSubDir = "pic";

            //圖片對應的行和圖片數據
            Map<Integer, PictureData> sheetIndexPicMap = new HashMap<Integer, PictureData>();

            //圖片對應的行和存放路徑
            Map<Integer, String> path = new HashMap<Integer, String>();

            Sheet sheet;
            if (file.getName().substring(file.getName().length() - 4).equals("xlsx")) {
                XSSFWorkbook workBook = new XSSFWorkbook(file.getInputStream());
                sheet = workBook.getSheetAt(0);

                //讀取sheet的圖片放入Map
                for (POIXMLDocumentPart dr : ((XSSFSheet) sheet).getRelations()) {
                    if (dr instanceof XSSFDrawing) {
                        XSSFDrawing drawing = (XSSFDrawing) dr;
                        List<XSSFShape> shapes = drawing.getShapes();
                        for (XSSFShape shape : shapes) {
                            XSSFPicture pic = (XSSFPicture) shape;
                            XSSFClientAnchor anchor = pic.getPreferredSize();
                            CTMarker ctMarker = anchor.getFrom();
                            sheetIndexPicMap.put(ctMarker.getRow(), pic.getPictureData());

                            //獲取圖片格式
                            String ext = pic.getPictureData().suggestFileExtension();

                            //保存的文件名
                            String fileName = UUID.randomUUID().toString() + "." + ext;

                            path.put(ctMarker.getRow(), uploadSubDir + "/" + fileName);
                        }
                    }
                }
            } else {
                HSSFWorkbook workBook = new HSSFWorkbook(file.getInputStream());
                sheet = workBook.getSheetAt(0);

                //讀取sheet的圖片放入Map
                List<HSSFPictureData> pictures = workBook.getAllPictures();
                if (pictures.size() != 0) {
                    for (HSSFShape shape : ((HSSFSheet) sheet).getDrawingPatriarch().getChildren()) {
                        HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
                        if (shape instanceof HSSFPicture) {
                            HSSFPicture pic = (HSSFPicture) shape;
                            int pictureIndex = pic.getPictureIndex() - 1;
                            HSSFPictureData picData = pictures.get(pictureIndex);
                            sheetIndexPicMap.put(anchor.getRow1(), picData);

                            //獲取圖片格式
                            String ext = picData.suggestFileExtension();

                            //保存的文件名
                            String fileName = UUID.randomUUID().toString() + "." + ext;

                            path.put(anchor.getRow1(), uploadSubDir + "/" + fileName);
                        }
                    }
                }
            }

            if (sheet.getLastRowNum() == 0) {
                logger.error("表中無數據!");
                return "表中無數據!";
            }

            //定義數據集合存放excel全部數據
            List<LockWorker> installManageList = new ArrayList<LockWorker>();

            for (int i = 1; i <= sheet.getLastRowNum(); i++) {

                //錯誤提示消息
                StringBuffer msg = new StringBuffer();

                Row row = sheet.getRow(i);

                if (null == row)
                    continue;

                LockWorker im = new LockWorker();

                im.setInstallerPicture(path.get(i));

                for (int j = 1; j < 12; j++) {
                    Cell cell = row.getCell(j);

                    String value = null;

                    if (null != cell) {
                        //所有做爲文本處理
                        cell.setCellType(HSSFCell.CELL_TYPE_STRING);

                        value = cell.getStringCellValue();
                    }

                    if (1 == j) {//姓名
                        if (StringUtils.isNotBlank(value)){
                            im.setInstallerName(value);
                        }else {
                            msg.append("請填寫姓名!\n");
                        }
                    } else if (2 == j) {//備註
                        im.setRemark(value);
                    }
                }

                if (!StringUtils.isBlank(msg.toString())) {
                    logger.error("第\t" + i + "行: " + msg.toString());
                    return "第\t" + i + "行: " + msg.toString();
                }

                installManageList.add(im);

            }

            if (!installManageList.isEmpty()) {

                if (!sheetIndexPicMap.isEmpty()) {

                    for (Map.Entry<Integer, PictureData> map : sheetIndexPicMap.entrySet()) {

                        // 獲取圖片流
                        PictureData pic = map.getValue();

                        byte[] data = pic.getData();

                        //輸出全路徑
                        String outPath = uploadRoot + path.get(map.getKey());

                        FileOutputStream out = new FileOutputStream(outPath);
                        out.write(data);
                        out.close();
                    }
                }

                //批量保存
                installerManageMapper.batchInsert(installManageList);

            }

        } catch (Exception e) {
            logger.error("導入異常", e);
            return "系統異常";
        }

        return "success";
    }
相關文章
相關標籤/搜索