【Java代碼】——Java實現匯出Excel中的圖片和資料

來源:互聯網
上載者:User
前言

最近公司需要做匯出Excel中的圖片和資料,雖然不是什麼新的技術,但是我的業務需要圖片和資料對應,而每一行肯定會有資料,但是不一定有圖片,這時候就需要考慮如何保證圖片和資料是一一對應,圖片和資料走的是不同的方式,所以這時候就需要考慮讓擷取每一行圖片的row,在迴圈row的過程中,判斷row相等則取出圖片,否則就是當前該資料沒有圖片。 內容

Control層代碼

/**     *      * @param key     * @param file     * @param request     * @param response     *            void     * @description 將excel資料匯入到資料庫中     * @date 2018年4月10日     * @author 21     */    @RequestMapping("/importExcel")    @ResponseBody    public Map<String, Object> importExcel(HttpSession session, @RequestParam("lefile") MultipartFile file,            HttpServletRequest request, HttpServletResponse response) {        Map<String, Object> map = new HashMap<>();        int code = Constants.SUCCESS_CODE;        String message = Constants.SUCCESS_MGS;        boolean isExcel2003 = true;        String basePath = session.getServletContext().getRealPath("/zjk/zjzp/");        try {            String filename = file.getOriginalFilename();            if (isExcel2007(filename)) {                isExcel2003 = false;            }            int count = dataListService.importExcelData(file.getInputStream(), isExcel2003, basePath);            if (count <= 0) {                code = Constants.FAILTURE_CODE;                message = Constants.FAILTURE_MGS;            }        } catch (IOException e) {            code = Constants.FAILTURE_CODE;            message = Constants.FAILTURE_MGS;            e.printStackTrace();        }        map.put("code", code);        map.put("message", message);        return map;    }public static boolean isExcel2003(String filepath) {        return filepath.matches("^.+\\.(?i)(xls)$");    }    public static boolean isExcel2007(String filepath)            {        return filepath.matches("^.+\\.(?i)(xlsx)$");    }

Service層代碼

@Transactional    public int importExcelData(InputStream is, boolean isExcel2003, String basePath) {        int count = 0;        Map<String, PictureData> sheetIndexPicMap = new HashMap<String, PictureData>();        try {            Workbook workbook = null;            Sheet sheet = null;            if (isExcel2003) {                workbook = new HSSFWorkbook(is);                sheet = workbook.getSheetAt(0);                sheetIndexPicMap = ExcelImageUtil.getSheetPictures03(0, (HSSFSheet) sheet, workbook);            } else {                workbook = new XSSFWorkbook(is); // 2007版本之上的                sheet = workbook.getSheetAt(0);                sheetIndexPicMap = ExcelImageUtil.getSheetPictures07(0, (XSSFSheet) sheet, workbook);            }            List<ZJModel> list = readExcelValue(workbook, sheet, basePath, sheetIndexPicMap);            // 儲存到資料庫中            count = dataListDao.insertZJList(list);        } catch (Exception e) {            e.printStackTrace();        }        return count;    }public List<ZJModel> readExcelValue(Workbook wb, Sheet sheet, String basePath,            Map<String, PictureData> sheetIndexPicMap) {        // 得到第一個sheet        List<ZJModel> zjModels = new ArrayList<ZJModel>();        try {            Integer totalCells = 0;            Integer totalRows = sheet.getPhysicalNumberOfRows();            if (totalRows > 1 && sheet.getRow(0) != null) {                totalCells = sheet.getRow(0).getPhysicalNumberOfCells();            }            for (int i = 1; i < totalRows; i++) {                Row row = sheet.getRow(i);                if (row == null) {                    continue;                }                ZJModel zjModel = new ZJModel();                String uuid = UUID.randomUUID().toString().replaceAll("-", "");                zjModel.setId(uuid);                if (sheetIndexPicMap.get("" + i + "") != null) {// 圖片資訊                    String picUuid = UUID.randomUUID().toString().replaceAll("-", "");                    PictureData pictureData = sheetIndexPicMap.get("" + i + "");                    byte[] buffer = pictureData.getData();                    String ext = pictureData.suggestFileExtension();// 擷取檔案拓展名;                    FileOutputStream outputStream = new FileOutputStream(basePath + picUuid + "." + ext);                    outputStream.write(buffer);                    outputStream.close();                    zjModel.setZjzp(picUuid + "." + ext);                }else{                    zjModel.setZjzp(Constants.DEFAULT_FILE_NAME);//預設圖片                }                for (int j = 0; j < totalCells; j++) {                    Cell cell = row.getCell(j);                    if (cell != null) {                        switch (j) {                        case 1:// 專家姓名                            zjModel.setName(cell.getStringCellValue());                            zjModel.setYwm(cell.getStringCellValue());                            break;                        case 2: //中文譯名                            zjModel.setZwym(cell.getStringCellValue());                            break;                        case 3:// 從事領域 //照片                            break;                        case 4: //單位                            zjModel.setDw(cell.getStringCellValue());                            break;                        case 5:// 專業 //職務/職稱                            zjModel.setZw(cell.getStringCellValue());                            break;                        case 6: //連絡方式                            if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {                                BigDecimal bigDecimal = new BigDecimal(cell.getNumericCellValue());                                String phone = bigDecimal.toString();                                zjModel.setPhone(phone);                            }                            break;                        case 7:  //固定電話                            if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {                                BigDecimal bigDecimal = new BigDecimal(cell.getNumericCellValue());                                String tel = bigDecimal.toString();                                zjModel.setTel(tel);                            }                            break;                        case 8:  //傳真                            if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {                                BigDecimal bigDecimal = new BigDecimal(cell.getNumericCellValue());                                String fax = bigDecimal.toString();                                zjModel.setFax(fax);                            }                            break;                        case 9: //郵箱                            zjModel.setEmail(cell.getStringCellValue());                            break;                        case 10: //社會安全號碼                            zjModel.setIdnumber(cell.getStringCellValue());                            break;                        case 11: //護照號/及有效證件                            zjModel.setHz(cell.getStringCellValue());                            break;                        case 12: //從事領域                            zjModel.setCsly(cell.getStringCellValue());                            break;                        case 13:  //學曆                            zjModel.setXl(cell.getStringCellValue());                            break;                        case 14:  //專業                            zjModel.setZy(cell.getStringCellValue());                            break;                        case 15:  //國籍                            zjModel.setGj(cell.getStringCellValue());                            break;                        case 16:   //性別                            zjModel.setSex(cell.getStringCellValue() == "男" ? 0 : 1);                            break;                        case 17:   //銀行卡號                            zjModel.setYhkh(cell.getStringCellValue());                            break;                        case 18:  //開戶行                            zjModel.setKhh(cell.getStringCellValue());                            break;                        case 19: //銀行代碼                            zjModel.setYhdm(cell.getStringCellValue());                            break;                        case 20:  //住址                            zjModel.setAddress(cell.getStringCellValue());                            break;                        case 21:                            zjModel.setBz(cell.getStringCellValue());                            break;                        }                    }                }                zjModels.add(zjModel);            }        } catch (Exception e) {            e.printStackTrace();        }        return zjModels;    }

由於在Excel2003和Excel2007版本擷取圖片的方法不同,所以抽出來兩種方法

public class ExcelImageUtil { public static Map<String, PictureData> getSheetPictures03(int sheetNum,HSSFSheet sheet,Workbook workbook){      Map<String,PictureData> sheetIndexPicMap=new HashMap<String, PictureData>();      @SuppressWarnings("unchecked")    List<HSSFPictureData> pictures=(List<HSSFPictureData>) workbook.getAllPictures();      if(pictures.size()>0){          for (HSSFShape shape : 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);                  String picIndex=String.valueOf(anchor.getRow1());                  sheetIndexPicMap.put(picIndex, picData);              }        }      }      return sheetIndexPicMap;  }  public static Map<String, PictureData> getSheetPictures07(int sheetNum,XSSFSheet sheet,Workbook workbook){      Map<String,PictureData> sheetIndexPicMap=new HashMap<String, PictureData>();      for(POIXMLDocumentPart dr: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();                String picIndex=String.valueOf(ctMarker.getRow());                sheetIndexPicMap.put(picIndex, pic.getPictureData());            }          }      }      return sheetIndexPicMap;   }  }
總結

這也是一次對代碼的積累,我相信每一次對代碼的總結都會對自己的能力有提升,感謝您的瀏覽,對於代碼有可以改進的進步,請不吝賜教。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.