1. 程式人生 > >java中Excel處理工具類

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;
   }
}

相關推薦

javaExcel處理工具

/** 該工具類會返回處理結果和封裝之後的資料,獲取資料直接從 **/ 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