通用匯入工具類,通過poi和反射實現
將檔案從前端上傳到後端,就不說了,我的文章裡面有上傳的,剛開始寫,如果有問題歡迎批評指正
首先,先說一下用法,因為之前每增加一個匯入模板就要單獨開發,比較浪費時間,所以單獨搞了個通用類,引數有待解析檔案,輸出的類,欄位陣列,開始行數,然後返回一個List
1.我們已經獲取到這個檔案,先獲取檔名的字尾,再根據檔案的字尾選擇用不同的工作簿來解析
public static Workbook judgmentFileType(File file) throws IOException { Workbook wb = null; String fileName = file.getName();String extension = fileName.lastIndexOf(".") == -1 ? "" : fileName.substring(fileName.lastIndexOf(".") + 1); if ("xls".equals(extension)) { // 讀取 office 2003 excel wb = new HSSFWorkbook(new FileInputStream(file)); } else if ("xlsx".equals(extension)) { // 讀取Office 2007 excel wb = new XSSFWorkbook(new FileInputStream(file));} else { boolean deleteInfo = file.delete(); if(!deleteInfo){ throw new BusinessException(MsgType.ERROR.getFlag(), "檔案刪除失敗"); } throw new BusinessException(MsgType.ERROR.getFlag(), "不支援的檔案型別"); } return wb; }
2.獲取到工作簿之後,要獲取工作簿裡面表格的內容,先獲取sheet,再獲取物理行數
Workbook wb= judgmentFileType(file); //獲取工作簿的sheet sheet = wb.getSheetAt(0); for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { row = sheet.getRow(i); if (row == null) { continue; } row = sheet.getRow(i); int cells = sheet.getRow(0).getPhysicalNumberOfCells();
for (int j = 0; j < cells; j++) { cell = row.getCell(j); String cellValue = getCellValue(cell); cellValue = cellValue.replaceAll(" ", "");}
3.然後獲取物理行數之後還要再獲取每一個單元格的內容
public static String getCellValue(Cell cell) { String value = null; DecimalFormat df = new DecimalFormat("0");// 格式化 number String // 字元 DecimalFormat nf = new DecimalFormat("###.######");// 格式化數字 if(cell != null){ switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: value = cell.getStringCellValue(); break; case Cell.CELL_TYPE_NUMERIC: if ("@".equals(cell.getCellStyle().getDataFormatString())) { value = df.format(cell.getNumericCellValue()); } else if ("General".equals(cell.getCellStyle().getDataFormatString())) { value = nf.format(cell.getNumericCellValue()); } else { value = nf.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: value = String.valueOf(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_BLANK: value = ""; break; default: value = cell.toString(); } }else{ value = ""; } return value; }
4.然後利用反射將表格中的資料一行存在一個類中,這個類是動態的,先用反射把傳過來的類建立一個出來
Object obj = clazz.newInstance();
然後再獲取這個類的方法名
Field[] fields=clazz.getDeclaredFields();
貼上完整程式碼
public static List analysisExcel(File file, Class clazz, String[] headerFields, int BeginRow) throws IOException{ Sheet sheet = null; Row row = null; Cell cell = null; List list = new ArrayList(); Workbook wb = judgmentFileType(file); sheet = wb.getSheetAt(0); SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd"); try { Map<Integer, String> map = new HashMap<Integer, String>(); for (int i = BeginRow; i < sheet.getPhysicalNumberOfRows(); i++) { row = sheet.getRow(i); if (row == null) { continue; } row = sheet.getRow(i); int cells = sheet.getRow(0).getPhysicalNumberOfCells(); Object obj = clazz.newInstance(); for (int j = 0; j < cells; j++) { cell = row.getCell(j); String cellValue = getCellValue(cell); cellValue = cellValue.replaceAll(" ", ""); //用反射修改值 if(PubUtil.isNotEmpty(cellValue)){ //獲取方法名 Field[] fields=clazz.getDeclaredFields(); //遍歷方法名,從中找出我們所需要的欄位 for (Field field : fields) { if(headerFields[j].equals(field.getName())){ String fieldType = field.getType().getSimpleName(); //每個欄位對應的型別不一樣 if ("String".equals(fieldType)) { Method m = obj.getClass().getMethod(getAttributes(headerFields[j]), String.class); m.invoke(obj, cellValue.toString()); } else if ("Date".equals(fieldType)) { Date date = null; if(cellValue.length() > 15){ String result = cellValue.substring(0,10)+" "+cellValue.substring(10); date = formatter1.parse(result); }else{ date = formatter2.parse(cellValue); } Method m = obj.getClass().getMethod(getAttributes(headerFields[j]),Date.class); m.invoke(obj,date); } else if ("BigDecimal".equals(fieldType)) { Method m = obj.getClass().getMethod(getAttributes(headerFields[j]), BigDecimal.class); m.invoke(obj, new BigDecimal(cellValue)); } else { System.out.println("not supper type" + fieldType); } } } } } list.add(obj); } } catch (Exception e) { e.printStackTrace(); } return list; }
呼叫方法
String[] headerFields = {"id","one","two","three","four"}; List list = ImportUtil.analysisExcel(file,BEntity.class, headerFields,1);
相關推薦
通用匯入工具類,通過poi和反射實現
將檔案從前端上傳到後端,就不說了,我的文章裡面有上傳的,剛開始寫,如果有問題歡迎批評指正首先,先說一下用法,因為之前每增加一個匯入模板就要單獨開發,比較浪費時間,所以單獨搞了個通用類,引數有待解析檔案,輸出的類,欄位陣列,開始行數,然後返回一個List1.我們已經獲取到這個檔
AES加解密工具類,Android端和服務端加解密一致
別處找的AES工具類太坑,用過之後發現明明祕鑰一致,前端和後端加解密出來的結果卻不一樣。下面這個工具類通過了驗證,祕鑰一致則兩個端的加解密一致。 import java.io.UnsupportedEncodingException; import java.
自己封裝的工具類,使用原生SwipeRefreshLayout+RecycleView實現下拉重新整理和載入更多
實現SwipeRefreshLayout+RecycleView實現重新整理 在你的xml檔案裡寫上如下程式碼: <android.support.v4.widget.SwipeRefreshLayout
RedisUtil工具類,Java單例模式實現
基於Java單例模式和Jedis封裝的RedisUtil,提供了Redis中的Key、字串、Hash、ZSet等的操作。 package com.cumt.tools.redis; import com.alibaba.fastjson.JSON; im
Java通用的Excel檔案生成工具類,支援生成檔案和瀏覽器直接下載
<span style="font-size:14px;">java通用的Excel檔案建立方法,支援同文件多tab頁建立。只需要呼叫靜態方法,傳遞List<String>表頭和List<Map>資料集合等,即可生成Excel檔案。 p
基於hutool和POI的excel匯入工具類
excel匯入也可以很簡單,利用POI進行匯入,以及強大的hutool工具類,再加上對業務的理解,就可以封裝成一個超級好用的業務類了。 maven依賴 <!-- Hutool超級工具類 http://hutool.mydoc.i
Java 通過Xml導出Excel文件,Java Excel 導出工具類,Java導出Excel工具類
public emp cep sdf value 提交 bsp datetime rtm Java 通過Xml導出Excel文件,Java Excel 導出工具類,Java導出Excel工具類 ============================== ?Copyri
通用工具類,獲取配置檔案資訊
創作不易,請勿抄襲,轉載請註明出處。如有疑問,請加微信 wx15151889890,謝謝。 [本文連結:]https://blog.csdn.net/wx740851326/article/details/83744404 之前已經寫過了這個文章,現在把整個類粘出來 文章也用markdo
java配置多資料來源多連線池的工具類,這裡是mysql和mongoDB
public class DBManager { private static final String PREFIX="jdbc:apache:commons:dbcp:"; private static Log log =LogFactory.getLog(DBManager.clas
根據字串的形式,自動匯入模組並使用反射找到模組中的類,並例項化物件,利用importlib和getattr實現的
例如: auth資料夾下一個SCRF.py檔案,裡面有一個Cors類 class CORS(object): def process_request(self): print('666') auth資料
java第16天----TreeMap的注意點,增強for迴圈,Arrays和Collecttions工具類,多執行緒簡介
昨天知識總結 1.泛型 泛型的定義 泛型的基礎 泛型在類上,介面上,方法上的使用 泛型–限制上限,限制下線 2.Map Map與Collection的比較 Map介面常用方法 Map的遍歷----會—重點 HashMap的去重和TreeMap的排序 Tre
[轉]DES加密和解密工具類,可自定義key
import javax.crypto.Cipher; import java.security.Key; import java.security.Security; public class DesUtils { /** * 字串預設鍵
JS版日期格式化和解析工具類,毫秒級
/** * ===================================== * 日期相關方法 * ===================================== */ ;(function($) { $.extend(
一些通用的js工具類,新增自定義外掛
common_t.js /** * 通用工具元件 對原有的工具進行封裝,自定義某方法統一處理<br> * ^_^ * * Author: em.D * Date: 2016-05-17 * Version: 0.0.1 */ function send_htt
POI對Excel進行讀取操作,工具類,便於操作資料
一:首先POI對Excel 操作進行了一系列的封裝,匯入,匯出Excel這裡藉助於POI提供的jar包 專案當中匯入POI提供的Jar包,這裡使用Maven管理 進行匯入jar包 <!-- https://mvnrepository.c
【JavaEE學習筆記】Hibernate_03_快取機制,自定義通用HibernateDAO工具類
Hibernate_03 A.Hibernate快取 1.一級快取 一級快取是Session快取,屬於事務範圍的快取,由hibernate管理的 只要應用程式通過Session介面來執行CRUD操作 Hibernate就會啟用一級快取,把資料庫中的資料以物件的形式拷貝
封裝poi讀取excel的超強工具類,支援一行程式碼獲取excel內容
時隔多年,再次更新下部落格。特貢獻一份poi讀取excel的超強工具類,一行程式碼讀取excel的封裝。包括讀、寫等操作。具體還是跟著程式碼看吧。 ExcelReadDealUtils:excel讀取處理工具類 package all.file.ex
寫的一個簡單的工具類,可以做物件型別的判斷和迭代出一個物件所有屬性的值
import java.lang.reflect.Field; /** * @author songzheng */ public class TypeUtil { /** * 得到某個物件型別物件 */ public static Cl
luence的java工具類,通用型別解析,支援資料庫
最近在研究luence,根據實際情況寫了一個簡單的DEMO 功能滿足以下要求: 1、支援不同物件的傳入,建立索引和查詢 2、支援索引欄位的動態配置 3、支援索引結果的html處理 以下為工具類 package com.hellowin.luence; import ja
android學習筆記 通用介面卡工具類和ViewHolder工具類
<pre class="java" name="code">/** * 通用介面卡工具類 * Created by bobok on 2016/9/5. */ public abstract class CommonAdapter<T> ext