前言: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