1. 程式人生 > >通用匯入工具類,通過poi和反射實現

通用匯入工具類,通過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

基於hutoolPOI的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配置多資料來源多連線池的工具這裡是mysqlmongoDB

public class DBManager { private static final String PREFIX="jdbc:apache:commons:dbcp:"; private static Log log =LogFactory.getLog(DBManager.clas

根據字串的形式自動匯入模組並使用反射找到模組中的並例項化物件利用importlibgetattr實現

例如: auth資料夾下一個SCRF.py檔案,裡面有一個Cors類 class CORS(object): def process_request(self): print('666') auth資料

java第16天----TreeMap的注意點增強for迴圈ArraysCollecttions工具多執行緒簡介

昨天知識總結 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 /** * 通用工具元件 對原有的工具進行封裝,自定義某方法統一處理&lt;br&gt; * ^_^ * * 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