使用poi操作Excel的處理工具類自動解析填充數(shù)據(jù)

直接傳入對應(yīng)的對象直接生成Excel中的數(shù)據(jù)集合
Excel模板-表頭所在行為1(所在行從一開始)


image.png

首先需要導(dǎo)入的Excel表頭行中要添加批注坦康,內(nèi)容為對應(yīng)JavaBean的屬性值脖捻。處理導(dǎo)入數(shù)據(jù)時是根據(jù)批注使用反射來填充bean對應(yīng)的屬性值柑潦。

1.導(dǎo)入依賴包

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
   <!--用于處理word控乾、ppt崎脉、viso撬碟、outlook-->
   <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>3.17</version>
    </dependency>

2.工具類

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.DateUtil;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * @author chenzan
 * @version V1.0
 * @modifier
 * @modifier-data
 */
public class POIUtil {
/**
 * 讀取excel文件
 *
 * @param excelFile 包含文件數(shù)據(jù)
 * @param headRowIn 表頭所在所在行 1-n
 * @return
 */
public static <T> List<T> readExcel(MultipartFile excelFile, int 
  headRowIn, Class<T> tClass) {
    List<T> rowLists = new ArrayList<>();
    try {
        InputStream inputStream = excelFile.getInputStream();
        Workbook workbook = WorkbookFactory.create(inputStream);
        int numberOfSheets = workbook.getNumberOfSheets();
        for (int i = 0; i < numberOfSheets; i++) {
            Sheet sheet = workbook.getSheetAt(i);
            //獲得數(shù)據(jù)行數(shù)
            int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
            if (physicalNumberOfRows > 0) {
                handlerRowData(headRowIn, tClass, rowLists, sheet, 
                 physicalNumberOfRows);
            }
        }
        return rowLists;
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException();
    }
}

/**
 * 處理每一行數(shù)據(jù)
 *
 * @param headRowIn
 * @param tClass
 * @param rowLists
 * @param sheet
 * @param physicalNumberOfRows
 * @param <T>
 * @throws NoSuchFieldException
 * @throws IllegalAccessException
 */
private static <T> void handlerRowData(int headRowIn, Class<T> tClass, 
 List<T> rowLists, Sheet sheet, int physicalNumberOfRows)
        throws IllegalAccessException, InstantiationException {
    Row headRow = sheet.getRow(headRowIn - 1);
    if (headRow != null) {
        int cellCount = headRow.getPhysicalNumberOfCells();
        for (int j = headRowIn; j < physicalNumberOfRows; j++) {
            T t = tClass.newInstance();
            for (int k = 0; k < cellCount; k++) {
                Cell cell = sheet.getRow(j).getCell(k);
                String cellValue;
                cellValue = handlerCellValue(cell);
                Cell headCell = headRow.getCell(k);
                //表頭批注
                String cellCode = headCell.getCellComment().getString().toString();
                try {
                    Field field = tClass.getDeclaredField(cellCode);
                    field.setAccessible(true);
                    field.set(t, cellValue);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
            }
            rowLists.add(t);
        }
    } else {
        throw new RuntimeException("please check headRowIn parameters");
    }
}

/**
 * 處理列數(shù)據(jù)
 *
 * @param cell
 * @return
 */
private static String handlerCellValue(Cell cell) {
    String cellValue;
    switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:
            cellValue = cell.getStringCellValue();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:// true:日期類型撵摆;false:數(shù)字類型
            if (DateUtil.isCellDateFormatted(cell)) {
                Date date = cell.getDateCellValue();
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
                cellValue = dateFormat.format(date);
            } else {
                Double doubleValue = cell.getNumericCellValue();
                cellValue = String.valueOf(doubleValue.longValue());
            }
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            cellValue = String.valueOf(cell.getBooleanCellValue());
            break;
        default:
            HSSFDataFormatter hSSFDataFormatter = new HSSFDataFormatter();
            cellValue = hSSFDataFormatter.formatCellValue(cell);
            break;
    }
    return cellValue;
   }
}

3.創(chuàng)建bean

public class ContactBean implements Serializable {
private String staffId;//員工Id
private String name;
private String mobile;
private String deptName;//部門
private String title;//職位
private String jobNumber;//工號

public String getStaffId() {
    return staffId;
}
public void setStaffId(String staffId) {
    this.staffId = staffId;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getMobile() {
    return mobile;
}
public void setMobile(String mobile) {
    this.mobile = mobile;
}
public String getDeptName() {
    return deptName;
}
public void setDeptName(String deptName) {
    this.deptName = deptName;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getJobNumber() {
    return jobNumber;
}
public void setJobNumber(String jobNumber) {
    this.jobNumber = jobNumber;
}
}

4.使用

//參數(shù)3 為表頭所在行 從一開始
List<ContactsBean> contacts = POIUtil.readExcel(file, 3, ContactsBean.class);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末底靠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子特铝,更是在濱河造成了極大的恐慌暑中,老刑警劉巖壹瘟,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鳄逾,居然都是意外死亡俐筋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門严衬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笆呆,你說我怎么就攤上這事请琳。” “怎么了赠幕?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵俄精,是天一觀的道長。 經(jīng)常有香客問我榕堰,道長竖慧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任逆屡,我火速辦了婚禮圾旨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魏蔗。我一直安慰自己砍的,他們只是感情好,可當我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布莺治。 她就那樣靜靜地躺著廓鞠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谣旁。 梳的紋絲不亂的頭發(fā)上床佳,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機與錄音榄审,去河邊找鬼砌们。 笑死,一個胖子當著我的面吹牛瘟判,可吹牛的內(nèi)容都是我干的怨绣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼拷获,長吁一口氣:“原來是場噩夢啊……” “哼篮撑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起匆瓜,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤赢笨,失蹤者是張志新(化名)和其女友劉穎未蝌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茧妒,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡萧吠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桐筏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纸型。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梅忌,靈堂內(nèi)的尸體忽然破棺而出狰腌,到底是詐尸還是另有隱情,我是刑警寧澤牧氮,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布琼腔,位于F島的核電站,受9級特大地震影響踱葛,放射性物質(zhì)發(fā)生泄漏丹莲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一尸诽、第九天 我趴在偏房一處隱蔽的房頂上張望甥材。 院中可真熱鬧,春花似錦性含、人聲如沸擂达。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽板鬓。三九已至,卻和暖如春究恤,著一層夾襖步出監(jiān)牢的瞬間俭令,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工部宿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抄腔,地道東北人。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓理张,卻偏偏與公主長得像赫蛇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雾叭,可洞房花燭夜當晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容