【Springboot+Vue】 Excel資料導(dǎo)入/上傳(含前后端)

本案例為某后臺管理系統(tǒng)信息導(dǎo)入模塊,Excel格式是已知的(如知残,已知每列的數(shù)據(jù)類型辱志,首行是表頭)虐急。

1.后臺接口實(shí)現(xiàn)

主要工作:獲取前端上傳的文件流止吁,進(jìn)行解析被辑;
處理流程:
1. 獲取HSSFWorkbook對象,獲取workbook表單的個數(shù)敬惦,進(jìn)行遍歷盼理;
2. 對于每一個表單,先獲取行數(shù)俄删,進(jìn)行遍歷宏怔,第一行跳過;
3. 單元格的格式有多種畴椰,需在不同的switch分支中進(jìn)行處理臊诊;(代碼27-54行)
4. 最后講遍歷得到的員工數(shù)據(jù)集合返回。

public static Listexcel2Supplier(MultipartFile file) {
    List list =new ArrayList<>();
    Supplier supplier =null;
    try {
        //1. 創(chuàng)建一個 workbook 對象
        HSSFWorkbook workbook =new HSSFWorkbook(file.getInputStream());
        //2. 獲取 workbook 中表單的數(shù)量
        int numberOfSheets = workbook.getNumberOfSheets();
        for (int i =0; i < numberOfSheets; i++) {
            //3. 獲取表單
            HSSFSheet sheet = workbook.getSheetAt(i);
            //4. 獲取表單中的行數(shù)
            int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
            for (int j =0; j < physicalNumberOfRows; j++) {
                //5. 跳過標(biāo)題行
                if (j ==0) {
                        continue;//跳過標(biāo)題行
                }
                //6. 獲取行
                HSSFRow row = sheet.getRow(j);
                if (row ==null) {
                    continue;//防止數(shù)據(jù)中間有空行
                }
                //7. 獲取列數(shù)
                int physicalNumberOfCells = row.getPhysicalNumberOfCells();
                supplier =new Supplier();
                for (int k =0; k < physicalNumberOfCells; k++) {
                    HSSFCell cell = row.getCell(k);
                    //按照每一列的不同類型 獲取數(shù)據(jù)
                    switch (cell.getCellType()) {   
                        //如果是String類型
                        case STRING:    
                            String cellValue = cell.getStringCellValue();
                            switch (k) {//看它是第幾列的內(nèi)容
                                case 1:
                                    supplier.setSupplier_code(cellValue);
                                    break;
                                //省略其他的 case
                            }
                            break;
                        default: {
                            switch (k) {
                                //不同類型的獲取函數(shù)不同:
                                //日期類型:getDateCellValue()
                                //數(shù)字類型:getNumericCellValue()斜脂,返回double值
                                case 18:
                                    supplier.setStatus((int) cell.getNumericCellValue());
                                    break;
                                //省略其他的 case
                            }
                        }
                        break;
                    }
                }
                list.add(supplier);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    //返回搜集好數(shù)據(jù)的List
    return list;
}

在數(shù)據(jù)導(dǎo)入接口中調(diào)用上述方法

  • 代碼流程:獲取數(shù)據(jù)集合抓艳,插入數(shù)據(jù)庫,代碼如下:
//上傳Excel請求
@PostMapping("/ImportSup")
public void importSup(MultipartFile file){
    //獲取數(shù)據(jù)集合
    List<Supplier> suppliers = ExceLIO.excel2Supplier(file);
    //插入數(shù)據(jù)庫
    supplierService.addSuppliers(suppliers);
}

保存數(shù)據(jù)集合

  • 上述代碼中調(diào)用的Service層函數(shù)addSuppliers() 帚戳,將數(shù)據(jù)集合插入數(shù)據(jù)庫玷或;
  • 實(shí)現(xiàn)方法:循環(huán)單條逐一插入,調(diào)用插入一條數(shù)據(jù)的函數(shù)addSup() 片任;
    //添加多條信息(Excel導(dǎo)入)
    public void addSuppliers(List<Supplier> suppliers) {
        Integer num = suppliers.size();
        for(Integer i=0 ; i<num ; i++){
            addSup(suppliers.get(i));
        }
    }

2.前端實(shí)現(xiàn)

  • 直接采用 Element 的文件上傳控件偏友,代碼如下:
<!--上傳資料-->
<el-upload
    :show-file-list="false"
    accept="application/vnd.ms-excel"
    :before-upload="beforeUpload"
    :on-success="onSuccess"
    :on-error="onError"
    :disabled="importDataDisabled"
    style="display: inline-flex;margin-right: 0"
    :action="actionup">
    <el-button :disabled="importDataDisabled" type="success" :icon="importDataBtnIcon">
        導(dǎo)入
    </el-button>
</el-upload>

其中,accept為接收文件類型对供;action為上傳接口位他;
data中定義 actionup : this.HOST + "/ImportSup" ,解決了跨域訪問的問題犁钟。

相關(guān)回調(diào)函數(shù)如下:

    beforeUpload() {
        this.importDataBtnText = '正在導(dǎo)入';
        this.importDataBtnIcon = 'el-icon-loading';
        this.importDataDisabled = true;
      },
      onError(err, file, fileList) {
        this.importDataBtnText = '導(dǎo)入數(shù)據(jù)';
        this.importDataBtnIcon = 'el-icon-upload2';
        this.importDataDisabled = false;
      },
      onSuccess(response, file, fileList) {
        this.importDataBtnText = '導(dǎo)入數(shù)據(jù)';
        this.importDataBtnIcon = 'el-icon-upload2';
        this.importDataDisabled = false;
        this.initEmps();
      }

以上完整的實(shí)現(xiàn)了“Springboot+Vue后臺管理系統(tǒng)”的Excel資料導(dǎo)入功能棱诱,這一過程中常遇到的BUG及解決方案請移步閱讀:
Springboot上傳文件報(bào)錯:java.lang.NullPointerException
如果有其他問題泼橘,歡迎留言討論~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涝动,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子炬灭,更是在濱河造成了極大的恐慌醋粟,老刑警劉巖靡菇,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異米愿,居然都是意外死亡厦凤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門育苟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來较鼓,“玉大人,你說我怎么就攤上這事违柏〔├茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵漱竖,是天一觀的道長禽篱。 經(jīng)常有香客問我,道長馍惹,這世上最難降的妖魔是什么躺率? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮万矾,結(jié)果婚禮上悼吱,老公的妹妹穿的比我還像新娘。我一直安慰自己勤众,他們只是感情好舆绎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著们颜,像睡著了一般吕朵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窥突,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天努溃,我揣著相機(jī)與錄音,去河邊找鬼阻问。 笑死梧税,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的称近。 我是一名探鬼主播第队,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼刨秆!你這毒婦竟也來了凳谦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衡未,失蹤者是張志新(化名)和其女友劉穎尸执,沒想到半個月后家凯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡如失,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年绊诲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褪贵。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掂之,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脆丁,到底是詐尸還是另有隱情板惑,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布偎快,位于F島的核電站冯乘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晒夹。R本人自食惡果不足惜裆馒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丐怯。 院中可真熱鬧喷好,春花似錦、人聲如沸读跷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽效览。三九已至无切,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丐枉,已是汗流浹背哆键。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘦锹,地道東北人籍嘹。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像弯院,于是被迫代替她去往敵國和親辱士。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355