java中Excel處理工具類
/**
該工具類會返回處理結果和封裝之後的資料,獲取資料直接從
**/ import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.suixingpay.sms.admin.controller.profitTradeSum.ExcelProfitRead; import com.suixingpay.sms.util.excel.ExcelCommon; public class ExcelUtil { private static Logger LOGGER = LoggerFactory.getLogger(ExcelProfitRead.class); public static Map<String, Object> readExcel(String fileName,InputStream inputStream) throws Exception { Map<String, Object> excelMap = null; if (fileName == null || ExcelCommon.EMPTY.equals(fileName)) { excelMap = new HashMap<String,Object>(); excelMap.put("readStatus", "error"); excelMap.put("errorMsg", "無法讀取Excel檔案內容"); return excelMap; } else { String postfix = getPostfix(fileName); if (!ExcelCommon.EMPTY.equals(postfix) && (ExcelCommon.OFFICE_EXCEL_2003_POSTFIX.equals(postfix.toLowerCase()) || ExcelCommon.OFFICE_EXCEL_2010_POSTFIX.equals(postfix.toLowerCase()))) { if (ExcelCommon.OFFICE_EXCEL_2003_POSTFIX.equals(postfix.toLowerCase())) { excelMap = readXls(inputStream); } else if (ExcelCommon.OFFICE_EXCEL_2010_POSTFIX .equals(postfix.toLowerCase())) { excelMap = readXlsx(inputStream); } } else { //Annotation LOGGER.error(fileName + ExcelCommon.NOT_EXCEL_FILE); excelMap = new HashMap<String,Object>(); excelMap.put("readStatus", "error"); excelMap.put("errorMsg", "請選擇Excel檔案上傳"); return excelMap; } } return excelMap; } public static String getPostfix(String fileName) throws Exception{ if (fileName == null || ExcelCommon.EMPTY.equals(fileName.trim())) { return ExcelCommon.EMPTY; } if (fileName.contains(ExcelCommon.POINT)) { return fileName.substring(fileName.lastIndexOf(ExcelCommon.POINT) + 1, fileName.length()); } return ExcelCommon.EMPTY; } public static Map<String, Object> readXls(InputStream inputStream) throws Exception{ LOGGER.info("Read the Excel 2003-2007"); List<List<Object>> dataList = new ArrayList<List<Object>>(); Map<String, Object> excelMap = new HashMap<String, Object>(); HSSFWorkbook wb=null; try { wb = new HSSFWorkbook(inputStream); } catch (IOException e) { excelMap.put("readStatus", "error"); excelMap.put("errorMsg", "無法讀取Excel檔案內容"); e.printStackTrace(); return excelMap; } HSSFSheet sheet = wb.getSheetAt(0); HSSFRow row = null; HSSFCell cell = null; Object val = null; DecimalFormat df = new DecimalFormat("#,###,##0.00");// 格式化數字 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字串 try { for (int i = sheet.getFirstRowNum(); i < sheet .getPhysicalNumberOfRows(); i++) { row = sheet.getRow(i); if (row == null) { continue; } List<Object> objList = new ArrayList<Object>(); for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) { cell = row.getCell(j); if (cell == null) { val = null; objList.add(val); continue; } switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: val = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: if ("@".equals(cell.getCellStyle().getDataFormatString())) { val = df.format(cell.getNumericCellValue()); } else if ("General".equals(cell.getCellStyle().getDataFormatString())) { val = df.format(cell.getNumericCellValue()); } else { //val = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())); val = df.format(cell.getNumericCellValue()); } break; case HSSFCell.CELL_TYPE_BOOLEAN: val = cell.getBooleanCellValue(); break; case HSSFCell.CELL_TYPE_BLANK: val = ""; break; default: val = cell.toString(); break; } objList.add(val); } dataList.add(objList); } excelMap.put("readStatus", "pass"); excelMap.put("dataList", dataList); } catch (Exception e) { e.printStackTrace(); excelMap.put("readStatus", "error"); excelMap.put("errorMsg", "匯入出錯,請聯絡管理員"); } return excelMap; } public static Map<String, Object> readXlsx(InputStream inputStream) throws Exception{ LOGGER.info("Read the Excel 2010"); Map<String, Object> excelMap = new HashMap<String, Object>(); List<List<Object>> dataList = new ArrayList<List<Object>>(); XSSFWorkbook xssfWorkbook = null; try { xssfWorkbook = new XSSFWorkbook(inputStream); }catch (IOException e) { excelMap.put("readStatus", "error"); excelMap.put("errorMsg", "無法讀取Excel檔案內容"); e.printStackTrace(); return excelMap; } //讀取臺卡類營銷政策sheet頁 XSSFSheet sheet = xssfWorkbook.getSheetAt(0); XSSFRow row = null; XSSFCell cell = null; Object val = null; DecimalFormat df = new DecimalFormat("#0.00");// 格式化數字 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字串 try { for (int i = sheet.getFirstRowNum(); i < sheet .getPhysicalNumberOfRows(); i++) { row = sheet.getRow(i); if (row == null) { continue; } List<Object> objList = new ArrayList<Object>(); for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) { cell = row.getCell(j); if (cell == null) { val = null; objList.add(val); continue; } switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_STRING: val = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_NUMERIC: if ("@".equals(cell.getCellStyle().getDataFormatString())) { val = df.format(cell.getNumericCellValue()); } else if ("General".equals(cell.getCellStyle().getDataFormatString())) { val = df.format(cell.getNumericCellValue()); } else { val = df.format(cell.getNumericCellValue()); } break; case XSSFCell.CELL_TYPE_BOOLEAN: val = cell.getBooleanCellValue(); break; case XSSFCell.CELL_TYPE_BLANK: val = ""; break; default: val = cell.toString(); break; } objList.add(val); } dataList.add(objList); } excelMap.put("readStatus", "pass"); excelMap.put("dataList", dataList); } catch (Exception e) { e.printStackTrace(); excelMap.put("readStatus", "error"); excelMap.put("errorMsg", "匯入出錯,請聯絡管理員"); } return excelMap; } }
使用示例
//解析excel Map<String, Object> resultMap = null;
resultMap = readExcel(excelFile.getOriginalFilename(),excelFile.getInputStream())
List<List<Object>> listNumbers = new ArrayList<List<Object>>();//匯入資料的list集合
listNumbers = (List<List<Object>>) resultMap.get("dataList");//匯入資料的條數符合要求
if (listNumbers.size() == 1) {//匯入的資料為空 model.addAttribute("col", "匯入的Excel資料為空!"); changeInfoRecord.setPreviousInfo("匯入的Excel資料為空!"); changeInfoRecordService.saveChangeInfoRecord(changeInfoRecord); return "newprofit/newProfitImportResult"; }
List<Map<String,String>> resultList=new ArrayList<Map<String,String>>();//用於存放批量匯入時的錯誤資訊
outDetailImport(listNumbers, resultList);
private void outDetailImport(List<List<Object>> listNumbers, List<Map<String, String>> resultList) { //代理商編號,代理商名稱,調整資料(補發),調整說明(補發),調整資料(補釦無需開票),調整說明(補釦無需開票),調整資料(補釦需開票) //,調整說明(補釦需開票),扣除機具款項,臺卡類營銷政策分潤,機具類營銷政策分潤,維護費,損失資料,嗨go分潤 for (int j = 1; j < listNumbers.size(); j++) {//遍歷所傳的資料集合 List<Object> list = listNumbers.get(j); logger.info("第"+j+"條資料:"+list.toString()); Map<String, String> map = new HashMap<String, String>(); if (null == list.get(0) || "".equals(list.get(0))) {//機構編號為空 map.put("error", "第" + j + "條資料有誤,檢測到代理商編號為空,請修改後再操作匯入!"); resultList.add(map); continue; } else {//機構編號不為空 if (list.get(0).toString().length() != 10) {//機構編號不為10位數字 map.put("error", "第" + j + "條資料有誤,檢測到代理商編號"+list.get(0)+"輸入有誤,請修改後再操作匯入!"); resultList.add(map); continue; } if(!orgService.isAllStsTopOrg((String)list.get(0))) { map.put("error", "第" + j + "條資料有誤,檢測到代理商編號"+list.get(0)+"為非一代代理商,請修改後再操作匯入!"); resultList.add(map); continue; } if("2".equals(orgService.getExpandMercTypeByOrgNo((String)list.get(0)))) { map.put("error", "第" + j + "條資料有誤,檢測到代理商編號"+list.get(0)+"為非優質代理商,請修改後再操作匯入!"); resultList.add(map); continue; } } //調整資料(補發)校驗 if(null!=list.get(2)&&!"".equals(list.get(2).toString())){ boolean flag = list.get(2).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,調整資料(補發)為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //調整資料(補釦無需開票)校驗 if(null!=list.get(4)&&!"".equals(list.get(4).toString())){ boolean flag = list.get(4).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,調整資料(補釦無需開票)為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //調整資料(補釦需開票)校驗 if(null!=list.get(6)&&!"".equals(list.get(6).toString())){ boolean flag = list.get(6).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,調整資料(補釦需開票)為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //扣除機具款校驗 if(null!=list.get(8)&&!"".equals(list.get(8).toString())){ boolean flag = list.get(8).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,扣除機具款項為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //臺卡類營銷政策分潤校驗 if(null!=list.get(9)&&!"".equals(list.get(9).toString())){ boolean flag = list.get(9).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,臺卡類營銷政策分潤為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //機具類營銷政策分潤校驗 if(null!=list.get(10)&&!"".equals(list.get(10).toString())){ boolean flag = list.get(10).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,機具類營銷政策分潤為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //維護費分潤校驗 if(null!=list.get(11)&&!"".equals(list.get(11).toString())){ boolean flag = list.get(11).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,維護費為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //損失資料校驗 if(null!=list.get(12)&&!"".equals(list.get(12).toString())){ boolean flag = list.get(12).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,損失資料為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } //嗨go分潤校驗 if(null!=list.get(13)&&!"".equals(list.get(13).toString())){ boolean flag = list.get(13).toString().matches("^[+]{0,1}(\\d+)$|^[+]{0,1}(\\d+\\.\\d+)$"); if(!flag) { map.put("error", "第" + j + "條資料有誤,機具類營銷政策分潤為正數,請修改後再操作匯入!"); resultList.add(map); continue; } } continue; } }
相關推薦
java中Excel處理工具類
/** 該工具類會返回處理結果和封裝之後的資料,獲取資料直接從 **/ import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import ja
Java 中的Array工具類
查詢 bool als 二分 對數 score 對象 int 定義 1、boolean equals(array1,array2):比較兩個數組是否相等。import java.util.Arrays;public class Ch03 { public static vo
Java併發程式設計的藝術之八----java中的併發工具類
1.等待多執行緒完成的countDownLatch CountDownLatch允許一個或多個執行緒等待其他執行緒完成操作。 執行緒中,讓一個執行緒等待最簡單的做法是使用join方法,執行緒A中呼叫B.join方法,說明讓執行緒A等待執行緒B完成之後再執行。 實現原理:不停檢查執行緒是否
Java中的併發工具類
前言: JDK1.5中增加了幾個併發工具類,CountDownLatch,CyclicBarrier,Semaphore分別提供了一種併發流程控制的手段,Exchanger則提供了線上程間交換資料的一種手段. 1.等待多執行緒完成的CountDownLatch
在JAVA中封裝JSONUtils工具類及使用
import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map;
【搞定Java併發程式設計】第27篇:Java中的併發工具類之執行緒間交換資料的 Exchanger
上一篇:Java中的併發工具類之控制併發執行緒數的 Semaphore Exchanger(交換者)是一個用於執行緒間協作的工具類。Exchanger用於進行執行緒間的資料交換。它提供一個同步點,在這個同步點,兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchange方法交換資料,如果第一個
【搞定Java併發程式設計】第26篇:Java中的併發工具類之控制併發執行緒數的 Semaphore
上一篇:Java中的併發工具類之同步屏障 CyclicBarrier 本文目錄: 1、獲取許可證 2、釋放許可證 本文轉載自:https://mp.weixin.qq.com/s/LS8YBKpiJnHEY1kMWmwoxg 推薦閱讀:剖析基於併發AQS的共享鎖的實現(基於訊
【搞定Java併發程式設計】第25篇:Java中的併發工具類之同步屏障 CyclicBarrier
上一篇:Java中的併發工具類之CountDownLatch 本文目錄: 1、CyclicBarrier的簡單概述 2、CyclicBarrier 的原始碼分析 3、CyclicBarrier與CountDownLatch的區別 1、CyclicBarrier的簡單概述
【搞定Java併發程式設計】第24篇:Java中的併發工具類之CountDownLatch
上一篇:Java中的阻塞佇列 BlockingQueue 詳解 本文目錄: 1、CountDownLatch的基本概述 2、CountDownLatch的使用案例 3、CountDownLatch的原始碼分析 1、CountDownLatch的基本概述 Count
JAVA中的併發工具類(一)----控制併發數的Semaphore
本文使用的Demo可以在我的github中找到。 前面我們使用執行緒池技術來控制訪問資源的執行緒數目,假設對某一檔案的訪問,我們允許幾十個執行緒來讀他,但是出於某種限制,我們要求只允許10個執行緒可以同時讀該檔案。這就好比十字路口有100輛車想要過馬路,我們只
java中併發常用工具類
前言:在你無聊的時候,想想比你優秀還努力的人,也許就不覺的無聊了 今天下午沒事幹把買的java併發程式設計藝術這本書拿出來看了看,看了下也記不住,還是好記性不如爛筆頭,今天講四個併發中可能會用到的工具
Java併發程式設計藝術 8 Java中的併發工具類
第8章 Java中的併發工具類 併發工具類中主要提供了一些併發流程控制的手段。主要有CountDownLatch、CyclicBarriery和Semaphore Exchanger工具類提供線上程間交換資料的一種手段。 CountDownLatch CountDo
java中小數處理,bigDecimal類應用
add opened 對象 spl eof 轉換成 () double ply 1、構造一個BigDecimal對象: 1 //創建一個BigDecimal對象,初始化必須使用字符串,因為用數值初始化會得到近似值,不準確 2 BigDec
Java中的日歷類/集合類/數學類/正則表達式/數組工具類等的常用方法與基本功能
calendar類和Data類 Collection類和List 正則表達式regex Math類和Random類 System類和Iterator類 一、 Arrays 針對數組操作的工具類,提供了一些針對數組排序和二分搜索的方法。常用方法:1、public static String
Java中遍歷實體類(處理MongoDB)
boot common ech set declare code mod exc reflect 在實際過程中,經常要將實體類進行封裝,尤其是處理數據庫的過程中;因此,對於遍歷實體類能夠與數據庫中的一行數據對應起來。 我是使用的環境是Spring boot,訪問的數據庫時M
java常用工具類(二)—— JSON處理工具類
tor ast val simple sta 轉換 local pass password package com.springboot.commons.utils; import com.springboot.commons.scan.JacksonObjectMapp
java後端時間處理工具類,返回 "XXX 前" 的字串
我們經常會遇到顯示 "某個之間之前" 的需求(比如各種社交軟體,在回覆訊息時,顯示xxx之前回復),我們可以在後端進行處理,也可以在前端進行處理,這裡講講在後端進行處理的方法. 其實很簡單,我們只需要將從資料庫中取到的date型別的欄位進行處理。 工具類如下: import java.
#Java--POI之Excel匯出工具類(支援多個sheet頁同時匯出)
一、核心程式碼 package com.yx.yzh.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.
java poi匯入Excel通用工具類
問題引入和分析 提示:如果不想看羅嗦的文章,可以直接到最後點選原始碼下載執行即可 最近在做一個匯入Excel的功能,在做之前在百度上面查詢“java通用匯入Excel工具類”,沒有查到,大多數都是java通用匯出Excel。後來仔細想想,匯出可
java excel匯出工具類
使用的是apache poi與註解類實現:maven:<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifact