excel上傳與下載

pom

 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

 

 

一、excel下載

1.前臺向後臺發送數據。

因爲ajax無法實現下載,所以的用的是from表單提交

//將from表單寫在方法中
  $(".daochu").click(function(){
    var data=getQueryUtility();
//方式1
{
   //向後臺傳送的數據
    var form= $("<form action='提交路徑"+"' method='post'></form>")
    form.append("<input type='hidden' name='date1' value='"+data.date1+"'>");
    form.append("<input type='hidden' name='date2' value='"+data.date2+"'>");
    form.append("<input type='hidden' name='selectModel' value='"+data.selectModel+"'>");
    form.append("<input type='hidden' name='number' value='"+data.number+"'>");
    $(document.body).append(form);
    form.submit();
}
//方式2
{
 window.location.href='[[@{/portal/WhiteListsController/download/}]]';//用這種方式也可以
}


  });

2.後臺

a.後臺接受數據

  /**
     * 
     *queryUtility 接受數據自動封裝爲一個對象
     * @return 是否下載成功
     */
    @RequestMapping(value="/downNetSafety", method = {RequestMethod.POST})
    public String downNetSafety( QueryUtility queryUtility, HttpServletRequest request, HttpServletResponse response){
       //數據庫獲取的數據
        List<Map<String,String>> listsMap=getNetSafetyData(queryUtility);

        String sheetName[]={};//表頭
        String excelname=;//excel表單名
        String [] keys=[];keys,通過key獲得value
        String [] headerName=[];表頭
       //獲取excel表格
        HSSFWorkbook workbook=SetNetSafetyExcel(keys,headerName,listsMap,excelname);
       //excel表單
        String fileName=excelname+".xls";
       //將數據下載
        downExcel(fileName,workbook,request,response);
        return null;
    }

b.寫成一個excel文檔

 /**
     *
     * @param keys 獲取數據key
     * @param headerName 表頭
     * @param listsMap  數據
     * @param sheetname sheet名
     * @return 返回excel文件
     */
    private  HSSFWorkbook SetNetSafetyExcel(  String [] keys, String [] headerName, List<Map<String,String>> listsMap,String sheetname){
        HSSFWorkbook workbook = new HSSFWorkbook();

        //設置excel表格
        HSSFSheet sheet = workbook.createSheet(sheetname);
        HSSFRow row = sheet.createRow(0);
        for(int i=0;i<keys.length;i++){
            sheet.setColumnWidth(i, 20*256);
        }
        HSSFCellStyle style = workbook.createCellStyle();
        HSSFFont font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
     //設置excel第一行表頭
        HSSFCell cell;
        for(int i=0;i<headerName.length;i++){
            cell = row.createCell(i);
            cell.setCellValue(headerName[i]);
            cell.setCellStyle(style);
        }
     //將數據寫入excel
        for(int i=0,k=listsMap.size();i<k;i++){
            HSSFRow row1 = sheet.createRow(i+1);
            Map<String,String> map=listsMap.get(i);
            for(int j=0,g1=keys.length;j<g1;j++){
                HSSFCell cell1=row1.createCell(j);
                cell1.setCellValue(map.get(keys[j]));
            }
        }
        return  workbook;
    }

c.,下載

  /**
     *
     * @param fileName   文件名
     * @param workbook   文件
     * @param request
     * @param response  
     */
    private  void downExcel(  String fileName,HSSFWorkbook workbook,HttpServletRequest request, HttpServletResponse response){
        try {
            response.reset();
            //設置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" +  
             java.net.URLEncoder.encode(fileName, "UTF-8"));
            OutputStream os = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/vnd.ms-excel;charset=gb2312");
            //將excel寫入到輸出流中
            workbook.write(os);
            os.flush();
            os.close();
        }catch (Exception e){
            System.out.println(e);
        }
    }

二、excel上傳

1.前臺

 //前臺上傳
    function  updataWhiteList(){
        //上傳的文件
        var formData = new FormData();
        formData.append("file",$("#file").prop("files")[0]);
        $.ajax({
            type: "POST",
            url: "",
            data: formData,
            async: false,
            cache: false,
            contentType: false,
            processData: false,
            success: function (data) {
                
            }, error: function (data) {
                alert("請求失敗");
            }
        })

    }

2.後臺

a.後臺接受

    /**
     * file爲輸入文件
     */
    @RequestMapping("/updataWhiteList")
    @ResponseBody
    public String updata(@RequestParam(value = "file") MultipartFile excelFile, HttpServletRequest req, HttpServletResponse resp) {
       String result="";
        try {
         //判斷是不是excel文件
           result= isExcelFile(excelFile);
         //獲取excel文件
            Workbook woek=getWorkBook(excelFile);
         //讀取數據並存入數據庫
            result=CheckExcel(woek);
        } catch (Exception e){
            System.out.println(e);
        }
return result;
    }

b.判斷是不是excel文件

/**
     * 檢查是不是爲excel文件
     * @param excelFile
     * @throws IOException
     */
    private String isExcelFile(MultipartFile excelFile) throws IOException{
        if(null == excelFile){
            return "文件不存在";
        }
        String fileName = excelFile.getOriginalFilename();
        if(!fileName.endsWith("xls") && !fileName.endsWith("xlsx")){
            return "不是excel文件";
        }
        return "格式正確";
    }

c.獲取excel文件

    /**
     *
     * 獲取不同版本的excel
     * @param formFile
     * @return
     */
    private Workbook  getWorkBook(MultipartFile formFile){
        String fileName = formFile.getOriginalFilename();
        Workbook workbook = null;
        try {
            //獲得excel文件的io流
            InputStream is = formFile.getInputStream();

            //根據文件後綴名不同(xls和xlsx)獲得不同的workbook實現類對象
            if(fileName.endsWith("xls")){
                //2003
                workbook = new HSSFWorkbook(is);

            }else if(fileName.endsWith("xlsx")){
                //2007

                 workbook = new XSSFWorkbook(is);

            }else {

            }
        } catch (IOException e) {

        }

        return workbook;
    }

d.將表格種每一格獲取的數據轉爲字符串

 //將表格中數據轉換爲字符串
    private String getValue(Cell cell) {
        if (cell == null || "".equals(cell.toString())) {
            return "";
        }
        String value = "";
        switch (cell.getCellTypeEnum()) {
            case BOOLEAN:
                value = String.valueOf(cell.getBooleanCellValue());
                break;
            case ERROR:
                value = String.valueOf(cell.getErrorCellValue());
                break;
            case NUMERIC:
                value = (new DecimalFormat("0")).format(cell.getNumericCellValue());
                break;
            case STRING:
                value = cell.getStringCellValue();
                break;
            default:
                break;
        }
        return value;
    }

e.將數據讀取出來存入數據庫

/*
*
* 檢查上傳白名單是否符合要求
*
* */
private String CheckExcel(Workbook workbook){
    Sheet sheet=workbook.getSheetAt(0);
    //獲取sheet行數
    int num=sheet.getPhysicalNumberOfRows();
    List<WhiteList> lists= new ArrayList<>();
//第一行爲表頭,直接從第二行開始獲取
    for(int i=1;i<num;i++){
      //獲取的數據
        WhiteList list= new WhiteList();
       
        Cell cell=row.getCell(0);
        String decive_number=getValue(cell);
        list.setDevice_number(decive_number);
      
        lists.add(list);
    }

    int size=lists.size();
    int page;
    if(size>500){
        page=size/500;
        int index=0;
 do {
//存入數據庫,一次存入500條
whiteListService.insertList(lists.subList(0,500));
//清除500數據
lists.subList(0,500).clear();

     index++;
 }while (index<page);
    }
    if(lists.size()>0) {
        whiteListService.insertList(lists);
    }
        return "上傳成功," +
                "成功上傳了"+size+"條";
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章