Springboot Excle導入導出


Springboot Excle導入導出

導入操作:Excle批量導入

導出操作:下載模版

開發筆記


 pom.xml

        <!-- Excle相關jar -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.11</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

工具類

ExcleUtils:

package com.wechat.cwbt.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

/**
 * 
 * 
 * @Package: com.wechat.cwbt.util 
 * @ClassName: ExcleUtils 
 * @Description:Excle相關工具
 * @author: zk
 * @date: 2019年8月30日 下午4:29:22
 */
public final class ExcleUtils {
    /**
     * 
     * @description Excle導入
     * @author zk
     * @date 2019年8月30日
     * @param file
     * @return 返回數據對象格式為: 表頭->數據
     */
    public static Map<String, Object> getDataList(MultipartFile file){
        Map<String, Object> result = new HashMap<String, Object>();
//        System.out.println(file.getName()+"\t"+file.getOriginalFilename());
        List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
 
        //判斷Excel文件是否有內容
        boolean notNull=false;
        String filename=file.getOriginalFilename();
        if (!filename.matches("^.+\\.(?i)(xls)$") && !filename.matches("^.+\\.(?i)(xlsx)$")) {
            result.put("msg","上傳文件格式不正確!");
            result.put("SUCCESS", false);
            return result;
        }
        //判斷Excel文件的版本
        boolean isExcel2003=true;
        if (filename.matches("^.+\\.(?i)(xlsx)$")) {
            isExcel2003 = false;
        }
        Workbook wb = null;
        try {
            InputStream fis=file.getInputStream();
            if (isExcel2003) {
                wb = new HSSFWorkbook(fis);
            } else  {
                wb = new XSSFWorkbook(fis);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        // 總共有多少張sheet表
        int sheetnum = wb.getNumberOfSheets();
        //判斷有無數據
        if(sheetnum == 1) {
            Sheet sheet = wb.getSheetAt(0);
            // 第一行數據數據
            int rowNum = sheet.getPhysicalNumberOfRows();
            if(rowNum==1){
                result.put("msg","無數據");
                result.put("SUCCESS", false);
                return result;
            }
        }
        //獲取數據
        for (int i = 0; i < sheetnum; i++) {
            Sheet sheet = wb.getSheetAt(i);
            // 表頭數據
            Row namerow = sheet.getRow(0);
 
            // 第一行數據
            Row headrow = sheet.getRow(1);
 
            if (null != headrow) {
 
                // 總行數
                int rowNum = sheet.getPhysicalNumberOfRows();
                // int rowNum = sheet.getLastRowNum();
//                System.out.println(file.getName() + "共:" + rowNum + " 行!");
 
                // 總列數
                int colNum = headrow.getPhysicalNumberOfCells();
 
                // 判斷工作表是否為空
                if (rowNum == 0) {
                    continue;
                }
 
                // 循環行
                for (int j = 1; j <= rowNum; j++) {
                    Row row = sheet.getRow(j);
                    if (null != row) {

                        Map<String, Object> rowmap = new HashMap<String, Object>();
                        for(int h=0;h<colNum;h++) {
                            String str1 = namerow.getCell(h).getStringCellValue();
                            row.getCell(h).setCellType(Cell.CELL_TYPE_STRING);//設置Cell的類型,按照String取出數據
                            String str2 = row.getCell(h).getStringCellValue();
                            rowmap.put(str1,str2);
                        }
                        dataList.add(rowmap);
 
                        //continue;
                    }
                }
            }
        }
        result.put("data", dataList);
        result.put("SUCCESS", true);
        return result;
    }
    
    /**
     * 
     * @description Excle導出
     * @author zk
     * @date 2019年8月30日
     * @param filename 文件名稱
     * @param namearr 表頭
     * @param datalist 數據
     * @return
     */
    public static Workbook exportDailyBill(String filename,String[] namearr,List<Map<String, Object>> datalist){
        // 創建excel工作簿
        Workbook workbook = new XSSFWorkbook();
        // 創建第一個sheet(頁),並命名
        Sheet sheet = workbook.createSheet(filename);
        //設置首行標題標題
        Row row = sheet.createRow(0);
        for(int i=0;i<namearr.length;i++) {
            row.createCell(i).setCellValue(namearr[i]);
        }
        if(datalist!=null) {
            //新增數據行,並且設置單元格數據
            int rowNum = 1;
            for(Map<String, Object> data : datalist)
            {
                row = sheet.createRow(rowNum);
                for(int i=0;i<namearr.length;i++) {
                    row.createCell(i).setCellValue((String)data.get(namearr[i]));
                }
                rowNum++;
            }
        }
        return workbook;
    }
}

調用:

controller:

   /**
     * 
     * @description 下載模版
     * @author zk
     * @date 2019年9月9日
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @RequestMapping("/downloadExcle")
    public void downloadExcle(HttpServletRequest request, HttpServletResponse response)throws Exception{
        String fileName = "按鍵錄入表";//文件名
        String[] namearr = {"按鍵類型","按鍵名稱","按鍵編碼"};//標題
        List<Map<String, Object>> datalist = null;//數據
        Workbook workbook = ExcleUtils.exportDailyBill(fileName, namearr, datalist);
        String name = new String(fileName.getBytes("utf-8"), "ISO-8859-1");//處理文件名稱
        response.setContentType("application/octet-stream;charset=ISO8859-1");
        response.setHeader("Content-disposition", "attachment;filename=" + name + ".xlsx");
        response.addHeader("Pargam", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
        OutputStream out = response.getOutputStream();
        workbook.write(response.getOutputStream());
        out.flush();
        out.close();
    }
    

    /**
     *
     * @description 批量導入Excle
     * @author 左坤
     * @date 2019年9月10日
     * @param file
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @Transactional
    @RequestMapping("/importExcle")
    @ResponseBody
    public Map<String, Object> importExcle(MultipartFile file,HttpServletRequest request, HttpServletResponse response){
        Map<String, Object> result = new HashMap<String, Object>();
        Map<String, Object> resmap = ExcleUtils.getDataList(file);
        if((boolean)resmap.get("SUCCESS")) {//有數據
            List<Map<String, Object>> list = (List<Map<String, Object>>) resmap.get("data");
            List<Keyboard> keyboardlist = new ArrayList<Keyboard>();
            if(list!=null) {
                for(int i=0;i<list.size();i++) {
                    Map<String, Object> mapstr = list.get(i);
                    Keyboard keyboard = new Keyboard();
                    keyboard.setName((String)mapstr.get("按鍵名稱"));
                    keyboard.setKeycode(Integer.parseInt((String)mapstr.get("按鍵編碼")));
                    keyboard.setTypeid((String)mapstr.get("按鍵類型"));
                    keyboard.setCreatetime(new Date());
                    keyboard.setUpdatetime(new Date());
                    keyboard.setIsshow("0");
                    keyboard.setIsdel("0");
                    keyboardlist.add(keyboard);
                }
                int count = keyboardService.insertlist(keyboardlist);//成功條數
                if(count<keyboardlist.size()) {//成功條數小於插入條數
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手動回滾
                    result.put("SUCCESS", false);
                    result.put("msg", "Excle第"+(count+2)+"行存在問題");
                    return result;
                }
                result.put("SUCCESS", true);
                result.put("msg", "操作成功");
            }
        }else {//無數據
            result.put("SUCCESS", false);
            result.put("msg", "Excle無數據");
        }
        return result;
    }

結束

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM