記錄一次文件導(dǎo)入問(wèn)題

需要的依賴(lài)

<!-- poi 解析excel -->

<dependency>

  <groupId>org.apache.poi</groupId>

  <artifactId>poi-ooxml</artifactId>

  <version>3.17</version>

</dependency>

直接上源碼

package org.jeecg.common.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Created by zl
 * @Date 2020/5/14 0:36
 * @Description TODO
 */
@Slf4j
public class ExcelUtil {

    public static final String excel2003L = ".xls";
    public static final String excel2007U = ".xlsx";

    /**
     * 描述:根據(jù)文件后綴,自適應(yīng)上傳文件的版本
     *
     * @param inStr    將file.getInputStream()獲取的輸入流
     * @param fileName file.getOriginalFilename()獲取的原文件名
     */
    public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception {
        Workbook wb = null;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if (excel2003L.equals(fileType)) {
            wb = new HSSFWorkbook(inStr); // 2003-
        } else if (excel2007U.equals(fileType)) {
            wb = new XSSFWorkbook(inStr); // 2007+
        } else {
            throw new Exception("解析的文件格式有誤浦箱!");
        }
        return wb;
    }

    /**
     * 讀取excel文件
     * 注意:在使用的過(guò)程中吸耿,文件中每一列的的信息必需和對(duì)象屬性一 一對(duì)應(yīng)
     * 讀取excel 中的文本信息
     *
     * @param wb     wb
     * @param sheet  需要讀取的sheet
     * @param row    數(shù)據(jù)從哪一行開(kāi)始讀取
     * @param tClass 對(duì)象
     * @param format 指定格式中的時(shí)間格式 默認(rèn)時(shí)間格式y(tǒng)yyy-MM-dd HH:mm:ss
     * @param <T>
     * @return
     */
    public static <T> List<T> getFileRead(Workbook wb, int sheet, int row, Class<T> tClass, String format) {
        List<T> result = new ArrayList<>();
        try {
            //獲得工作表
            Sheet sheetAt = wb.getSheetAt(sheet);
            //獲得工作表的總行數(shù)
            int sheetRow = sheetAt.getPhysicalNumberOfRows();
            while (row < sheetRow) {
                //獲得總列數(shù)
                int physicalNumberOfCells = sheetAt.getRow(0).getPhysicalNumberOfCells();
                //獲得屬性數(shù)組
                Field[] fields = tClass.getDeclaredFields();
                T t = tClass.newInstance();
                for (int i = 0; i < physicalNumberOfCells; i++) {
                    Cell cell = sheetAt.getRow(row).getCell(i);
                    if (cell == null) {
                        continue;
                    }
                    //獲得sheet中值,都是設(shè)置成string類(lèi)型進(jìn)行獲取
                    cell.setCellType(CellType.STRING);
                    String stringCellValue = cell.getStringCellValue();
                    //讀取excel中的值,如果為空酷窥,直接進(jìn)入下一列
                    if (null == stringCellValue || "".equals(stringCellValue)) {
                        continue;
                    }
                    //獲得屬性名
                    String name = fields[i].getName();
                    //得到set方法
                    name = name.substring(0, 1).toUpperCase() + name.substring(1);
                    String tMethodName = "set" + name;

                    String[] split = fields[i].getType().getName().split("\\.");
                    //得到數(shù)據(jù)類(lèi)型
                    String type = split[split.length - 1];

                    Method method = tClass.getDeclaredMethod(tMethodName, fields[i].getType());
                    //如果還有其它類(lèi)型咽安,只需要在這里進(jìn)行相應(yīng)的補(bǔ)充就可以
                    switch (type) {
                        case "Date":
                            method.invoke(t, getDate(stringCellValue, format));
                            break;
                        case "Integer":
                            method.invoke(t, Integer.valueOf(stringCellValue));
                            break;
                        case "Byte":
                            method.invoke(t, Byte.valueOf(stringCellValue));
                            break;
                        case "Double":
                            method.invoke(t, Double.valueOf(stringCellValue));
                            break;
                        case "BigDecimal":
                            method.invoke(t, BigDecimal.valueOf(stringCellValue.contains("\\.") ? Double.valueOf(stringCellValue) : Integer.valueOf(stringCellValue)));
                            break;
                        default:
                            method.invoke(t, stringCellValue);
                            break;
                    }
                }
                result.add(t);
                //讀取下一行
                row++;
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("解析excel數(shù)據(jù)異常, exception:{}", e);
        } finally {
        }
        return result;
    }

    /**
     * 轉(zhuǎn)換時(shí)間格式
     *
     * @param dataStr 時(shí)間字符串
     * @param format  需要轉(zhuǎn)換的格式信息
     * @return
     * @throws ParseException
     */
    private static Date getDate(String dataStr, String format) throws ParseException {
        if (null == format || "".equals(format)) {
            format = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.parse(dataStr);
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蓬推,隨后出現(xiàn)的幾起案子妆棒,更是在濱河造成了極大的恐慌,老刑警劉巖沸伏,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糕珊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毅糟,警方通過(guò)查閱死者的電腦和手機(jī)红选,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)姆另,“玉大人喇肋,你說(shuō)我怎么就攤上這事〖7” “怎么了蝶防?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)明吩。 經(jīng)常有香客問(wèn)我间学,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任菱鸥,我火速辦了婚禮宗兼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氮采。我一直安慰自己殷绍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布鹊漠。 她就那樣靜靜地躺著主到,像睡著了一般。 火紅的嫁衣襯著肌膚如雪躯概。 梳的紋絲不亂的頭發(fā)上登钥,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音娶靡,去河邊找鬼牧牢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姿锭,可吹牛的內(nèi)容都是我干的塔鳍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呻此,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼轮纫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起焚鲜,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掌唾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后忿磅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體糯彬,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年贝乎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了情连。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡览效,死狀恐怖却舀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锤灿,我是刑警寧澤挽拔,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站但校,受9級(jí)特大地震影響螃诅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一术裸、第九天 我趴在偏房一處隱蔽的房頂上張望倘是。 院中可真熱鬧,春花似錦袭艺、人聲如沸搀崭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瘤睹。三九已至,卻和暖如春答倡,著一層夾襖步出監(jiān)牢的瞬間轰传,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工瘪撇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留获茬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓倔既,卻偏偏與公主長(zhǎng)得像锦茁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叉存,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355