java實現導出Excel

每次遇見這個需求都得上網現查,還有各種坑,現自己記錄下~

前臺:

function exportMap(){
    var startTime = $("#startTime").val();
    var endTime = $("#endTime").val();
    var deviceId = $("#device").val();
    if(startTime==""){
        layer.alert('請選擇開始時間', {
            title: '提示框',
            icon: 1
        });
        return;
    }
    if(endTime==""){
        layer.alert('請選擇結束時間', {
            title: '提示框',
            icon: 1
        });
        return;
    }
    if(deviceId==""){
        layer.alert('請選擇設備', {
            title: '提示框',
            icon: 1
        });
        return;
    }
    else{
        window.location.href = '../map/export?startTime='+startTime+'&endTime='+endTime+'&deviceId='+deviceId;
    }
}

後臺:

@RequestMapping(value = "export")
@ResponseBody
public void export(HttpServletRequest request, HttpServletResponse response) {
    String startTime = request.getParameter("startTime");
    String endTime = request.getParameter("endTime");
    String deviceId = request.getParameter("deviceId");
    PositionPoints positionPoints = new PositionPoints();
    positionPoints.setFacilityId(Integer.parseInt(deviceId));
    positionPoints.setStartTime(startTime);
    positionPoints.setEndTime(endTime);
    //根據選擇的時間查詢歷史記錄表
    List<PositionPoints> pointsList = positionPointsService.getPointsByTimeAndDeviceId(positionPoints);
    if (!pointsList.isEmpty()) {
        //文件名
        String fileName = "電子地圖" + System.currentTimeMillis();
        String ys = "D://" + fileName + ".xlsx";
        // 1.生成Excel
        XSSFWorkbook userListExcel = createUserListExcel(pointsList);

        try{
            //輸出成文件
            this.setResponseHeader(response,ys);
            OutputStream os = response.getOutputStream();
            userListExcel.write(os);
            os.flush();
            os.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
private static XSSFWorkbook createUserListExcel(List<PositionPoints> listresult){
    // 1.創建HSSFWorkbook,一個HSSFWorkbook對應一個Excel文件
    XSSFWorkbook wb = new XSSFWorkbook();
    // 2.在workbook中添加一個sheet,對應Excel文件中的sheet
    XSSFSheet sheet = wb.createSheet("sheet1");
    // 3.設置表頭,即每個列的列名
    String[] titel = {"設備ID","經度","緯度"};
    // 3.1創建第一行
    XSSFRow row = sheet.createRow(0);
    // 將列名寫入
    for (int i = 0; i < titel.length; i++) {
        // 給列寫入數據,創建單元格,寫入數據
        row.createCell(i).setCellValue(titel[i]);
    }
    //設置列爲文本格式
    CellStyle textStyle = wb.createCellStyle();
    DataFormat format = wb.createDataFormat();
    textStyle.setDataFormat(format.getFormat("@"));
    // 寫入正式數據
    for (int i = 0; i < listresult.size(); i++) {
        sheet.setDefaultColumnStyle(i,textStyle);
        // 創建行
        row = sheet.createRow(i+1);

        row.createCell(0).setCellValue(listresult.get(i).getFacilityId().toString());

        sheet.autoSizeColumn(0, true);

        row.createCell(1).setCellValue(listresult.get(i).getLongitude()*10000000);

        sheet.autoSizeColumn(1, true);

        row.createCell(2).setCellValue(listresult.get(i).getLatitude()*10000000);

        sheet.autoSizeColumn(3, true);
    }
    /**
     * 上面的操作已經是生成一個完整的文件了,只需要將生成的流轉換成文件即可;
     * 下面的設置寬度可有可無,對整體影響不大
     */
    // 設置單元格寬度
    int curColWidth = 0;
    for (int i = 0; i <= titel.length; i++) {
        // 列自適應寬度,對於中文半角不友好,如果列內包含中文需要對包含中文的重新設置。
        sheet.autoSizeColumn(i, true);
        // 爲每一列設置一個最小值,方便中文顯示
        curColWidth = sheet.getColumnWidth(i);
        if(curColWidth<2500){
            sheet.setColumnWidth(i, 2500);
        }
        // 第3列文字較多,設置較大點。
        sheet.setColumnWidth(3, 2500);
    }
    return wb;
}
//發送響應流方法
public void setResponseHeader(HttpServletResponse response, String fileName) {
    try {
        try {
            fileName = new String(fileName.getBytes(),"ISO8859-1");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        response.setContentType("application/octet-stream;charset=ISO8859-1");
        response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
        response.addHeader("Pargam", "no-cache");
        response.addHeader("Cache-Control", "no-cache");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章