excel表格的特殊需求引起的Java思考

前言:html

前些天遇到了這樣的一個需求,將下圖:java

 

將表格中貨號-前面部分一致的行合成一行,而且將第二行,第三行的價格添加到第一行中爲價格二,價格三。如圖:數據庫

接到這樣的需求,個人第一感受是直接手動合併(暗暗再想這也太簡單了),而後我看了總記錄數我放棄了,決定在網上找找excel的操做方法,找了一會沒發現,心想不能浪費太多時間,不如本身動手豐衣足食,可能也是小弟(剛剛說老漢被批評了)比較愚昧,畢竟沒怎麼學過excel,望有會的大神留言,也當學習了。好了廢話很少說了,接下來讓咱們來看看如何實現的吧。緩存

首先想要實現此功能須要將讀入excel表格,我這裏使用的是HSSFWorkbook,由於用的是03版,若是想要兼容07版能夠訪問此博客http://www.cnblogs.com/yejg1212/p/3969822.html,我這就很少作介紹。想要讀入文件咱們首先是要獲得這個文件流,即:性能

InputStream is = new FileInputStream("C://jlo.xls");

而後利用HSSFWorkbook讀取,首先讀取sheet,找到本身想要的sheet,獲取循環全部行獲得每列的值,以下:學習

 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
        HashMap<String, String> map = new HashMap<>();
        // 循環工做表Sheet
        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            if (hssfSheet == null) {
                continue;
            }
            // 循環行Row
            for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                if (hssfRow == null) {
                    continue;
                }
}
}

  我這裏爲了更好的保存的,因此我建了一個實體類用於保存所得到值,寫着寫着忽然停了,蒙了,我該如何將貨號同樣的內容拼接成一個實體類中了,想了想用數據庫確定不合適,太影響性能,因此機智的我選擇了全局變量,相似於緩存,由於根據本excel顯示規則,最多有三個會相同,而其餘內容都是一致,因此只須要將相同的每一行的價格記錄下來,保存到HashMap集合中,將其所有保存至最後一個實體model中,而且將其放入用於緩存的全局變量hashMap中,最後將其hashMap中全部value值便是處理後實體進行循環寫入一個excel中,哇,就這麼完成了。有點簡單的,比在網上找excel操做而且還找不到感受要快。接下來就是讀取excel的具體代碼實現:excel

 /**
     * 讀取xls文件內容
     * 
     * @throws IOException
     *             輸入/輸出(i/o)異常
     */
    private void readXls() throws IOException {
        InputStream is = new FileInputStream("C://jlo.xls");
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
        HashMap<String, String> map = new HashMap<>();
        // 循環工做表Sheet
        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            if (hssfSheet == null) {
                continue;
            }
            // 循環行Row
            for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                if (hssfRow == null) {
                    continue;
                }
                XlsDto xld = new XlsDto();
                xld.setSmiles(getValue(hssfRow.getCell(0)));
            	xld.setHuoHao(getValue(hssfRow.getCell(1)).substring(0,getValue(hssfRow.getCell(1)).indexOf("-")));
            	xld.seteName(getValue(hssfRow.getCell(2)));
            	xld.setcName(getValue(hssfRow.getCell(3)));
                xld.setCas(getValue(hssfRow.getCell(4)));  	
                xld.setHuoDate(getValue(hssfRow.getCell(5)));
                xld.setPurity(getValue(hssfRow.getCell(6)));
                xld.setKunCun(getValue(hssfRow.getCell(7)));
                xld.setIsCreate(getValue(hssfRow.getCell(8)));
            	xld.setaCost(getValue(hssfRow.getCell(9)));
            	xld.setxType(getValue(hssfRow.getCell(1)).substring(0,getValue(hssfRow.getCell(1)).indexOf("-")));
                if(StringUtils.isNotBlank(getValue(hssfRow.getCell(1)))){
                	if(!map.containsKey(xld.getxType())){
                		String cost = getValue(hssfRow.getCell(9)); 
                    	//insertX(xld);
                    	hashMap.put(xld.getxType(), xld);
                    	map.put(xld.getxType(), "1");
                    	map.put(xld.getxType()+"1", cost);
                    }else{
                    	//String xType = getValue(hssfRow.getCell(1)).substring(0,getValue(hssfRow.getCell(1)).indexOf("-"));
                    	if("1".equals(map.get(xld.getxType()))){
                    		String cost = getValue(hssfRow.getCell(9)); 
                    		xld.setaCost(map.get(xld.getxType()+"1"));
                    		xld.setbCost(cost);
                    		hashMap.put(xld.getxType(), xld);
                    		//updateX(xType, cost,1);
                    		map.put(xld.getxType(), "2");
                    		map.put(xld.getxType()+"2", cost);
                    	}else{
                    		String cost = getValue(hssfRow.getCell(9)); 
                    		xld.setaCost(map.get(xld.getxType()+"1"));
                    		xld.setbCost(map.get(xld.getxType()+"2"));
                    		xld.seteCost(cost);
                    		hashMap.put(xld.getxType(), xld);
                    		//updateX(xType, cost,2);
                    		map.put(xld.getxType(), "3");
                    	}
                }
                
                	
                }
            }
        }
    }

  處理完成以後,將其再次導入給excel,實現以下:code

/**
   * 
   * @param xls
   *            XlsDto實體類的一個對象
   * @throws Exception
   *             在導入Excel的過程當中拋出異常
   */
  public static void xlsDto2Excel(List<XlsDto> xls) throws Exception {
	// 獲取總列數
      int CountColumnNum = xls.size();
      // 建立Excel文檔
      HSSFWorkbook hwb = new HSSFWorkbook();
      XlsDto xlsDto = null;
   // sheet 對應一個工做頁
      HSSFSheet sheet = hwb.createSheet("sheet1");
      HSSFRow firstrow = sheet.createRow(0); // // 下標爲0的行開始
      HSSFCell[] firstcell = new HSSFCell[CountColumnNum];
      String[] names = new String[12];
      names[0] = "SMILES";
      names[1] = "貨號";
      names[2] = "產品名稱(英文";
      names[3] = "產品名稱(中文";
      names[4] = "CAS號";
      names[5] = "貨期(天)";
      names[6] = "純度";
      names[7] = "庫存";
      names[8] = "是否可定製";
      names[9] = "包裝/價格1";
      names[10] = "包裝/價格2";
      names[11] = "包裝/價格3";
      for (int j = 0; j < 12; j++) {
          firstcell[j] = firstrow.createCell(j);
          firstcell[j].setCellValue(new HSSFRichTextString(names[j]));
      }
      for (int i = 0; i < xls.size(); i++) {
    	  // 建立一行
          HSSFRow row = sheet.createRow(i + 1);
          // 獲得要插入的每一條記錄
          xlsDto = xls.get(i);
              // 在一行內循環
              HSSFCell xh = row.createCell(0);
              xh.setCellValue(xlsDto.getSmiles());
              HSSFCell xm = row.createCell(1);
              xm.setCellValue(xlsDto.getHuoHao());
              HSSFCell yxsmc = row.createCell(2);
              yxsmc.setCellValue(xlsDto.geteName());
              HSSFCell kcm = row.createCell(3);
              kcm.setCellValue(xlsDto.getcName());
              HSSFCell cj = row.createCell(4);
              cj.setCellValue(xlsDto.getCas());
              HSSFCell hd = row.createCell(5);
              hd.setCellValue(xlsDto.getHuoDate());
              HSSFCell purity = row.createCell(6);
              purity.setCellValue(xlsDto.getPurity());
              HSSFCell kuncun = row.createCell(7);
              kuncun.setCellValue(xlsDto.getKunCun());
              HSSFCell isc = row.createCell(8);
              isc.setCellValue(xlsDto.getIsCreate());
              HSSFCell ac = row.createCell(9);
              ac.setCellValue(xlsDto.getaCost());
              HSSFCell bc = row.createCell(10);
              bc.setCellValue(xlsDto.getbCost());
              HSSFCell ec = row.createCell(11);
              ec.setCellValue(xlsDto.geteCost());
          
      }
      // 建立文件輸出流,準備輸出電子表格
      OutputStream out = new FileOutputStream("C://jlol.xls");
      hwb.write(out);
      out.close();
      System.out.println("數據庫導出成功");
  }

  完美的解決了這個比較特殊而又不特殊的需求,代碼提供僅供互相你們學習,歡迎訪問提點不足之處。htm

相關文章
相關標籤/搜索