1. 程式人生 > >POI匯出資料並且實現匯出時顯示進度條

POI匯出資料並且實現匯出時顯示進度條

js程式碼

/* 進度條隱藏 */
                function modalClose() {
                    //$("#myModal").modal('hide');
                    $('#PerExcelModal').modal('hide');
                    $(".modal-backdrop").remove();
                    $("body").removeClass('modal-open');
                    //$("#d").trigger('click');
                }
                function ajax_send(func){
                    $.ajax({
                        type:"POST",
                        url: "${base}/business/order/isExport",
                        datatype:"json",
                        success:function(res){
                            var res=JSON.parse(res);
                            func.call(this,res);
                        }
                    });
                 }
               function  aa(){
                    var interval = setInterval(function(){
                        ajax_send(function(res){
                        if(res){
                            modalClose();
                            clearInterval(interval);
                        }else{
                            
                        };
                    });
                },1000); //每隔1秒呼叫一次函式
              };  
                
                //匯出excel
                $repExcel.click(function(){
                    var status=$("#status").val();
                    $("#prestatus").val(status);
                    
                    var type=$("#type").val();
                    $("#pretype").val(type);
                    /* var searchValue=$("#searchValue").val();
                    $("#presearchValue").val(searchValue); */
                    $("#repFrom").submit();
                    //setTimeout(modalClose, 5000);
                    aa();
                });
          

     <!-- 進度條 -->
        <div id="PerExcelModal" class="modal fade" tabindex="-1"  data-backdrop="static">
            <div class="modal-dialog modal-lg">
                <div class="modal-content">
                    <div class="modal-header">
                        <button class="close" type="button" data-dismiss="modal">&times;</button>
                        <h5 class="modal-title">下載進度</h5>
                    </div>
                    <div class="modal-body ">
                        <div class="form-group">
                            <div class="progress progress-striped">
                                <div class="progress-bar progress-bar-success" style="width: 100%;"><span></span>正在匯出,請稍等...
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

 

<form action="${base}/business/order/reportExcelOrders" method="post" id="repFrom">
                <input name="pageSize" type="hidden" value="${page.pageSize}">
                <input name="searchProperty" type="hidden" value="${page.searchProperty}">
                <input name="orderProperty" type="hidden" value="${page.orderProperty}">
                <input name="orderDirection" type="hidden" value="${page.orderDirection}">
                <input name="isPendingReceive" type="hidden" value="[#if isPendingReceive??]${isPendingReceive?string("true", "false")}[/#if]">
                <input name="isPendingRefunds" type="hidden" value="[#if isPendingRefunds??]${isPendingRefunds?string("true", "false")}[/#if]">
                <input name="isAllocatedStock" type="hidden" value="[#if isAllocatedStock??]${isAllocatedStock?string("true", "false")}[/#if]">
                <input name="hasExpired" type="hidden" value="[#if hasExpired??]${hasExpired?string("true", "false")}[/#if]">
                
                <input name="status" type="hidden" id="prestatus">
                <input name="type" type="hidden" id="pretype">
                <input name="searchValue" type="hidden" id="presearchValue">
                
            </form>
      

 

controller 程式碼:

 

/**
     * 訂單匯出Excel
     * @throws IOException 
     */
    @RequestMapping("/reportExcelOrders")
    public ResponseEntity<?> reportExcelOrders(HttpServletRequest request,HttpServletResponse response,Order.Type type, Order.Status status, String memberUsername, Boolean isPendingReceive, Boolean isPendingRefunds, Boolean isAllocatedStock, Boolean hasExpired, Pageable pageable, @CurrentStore Store currentStore, ModelMap model,@CurrentUser Business business) throws IOException{
        //條件查詢資料
        Member member = memberService.findByUsername(memberUsername);
        pageable.setPageSize(Integer.MAX_VALUE);
        
        List<Order> all=orderService.findPageExcel(type, status, currentStore, member, null, isPendingReceive, isPendingRefunds, null, null, isAllocatedStock, hasExpired, pageable);
//        List<Order> all = orderService.findBusinessOrder(business);
//        List<Order> all =new ArrayList<>();
//        if(alls.size()<100){
//            for (int i = 0; i <alls.size(); i++) {
//                all.add(alls.get(i));
//            }
//        }else {
//            for (int i = 0; i <99; i++) {
//                all.add(alls.get(i));
//            }
//        }
//        if(all==null){
//            return Results.badRequest("資料為空,不能匯出");
//        }
        
        
        // 查詢出 滿足當前條件 結果資料
        //List<Order> all = orderService.findAll();
//        List<Order> all = orderService.findOrder();
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
        HSSFSheet sheet = hssfWorkbook.createSheet("訂單資料");
        HSSFRow headRow = sheet.createRow(0);
        headRow.createCell(0).setCellValue("訂單號");
        headRow.createCell(1).setCellValue("產品條碼");
        headRow.createCell(2).setCellValue("訂單狀態");
        headRow.createCell(3).setCellValue("買家id");
        headRow.createCell(4).setCellValue("子訂單編號");
        headRow.createCell(5).setCellValue("買家暱稱");
        headRow.createCell(6).setCellValue("商品名稱");
        headRow.createCell(7).setCellValue("產品規格");
        headRow.createCell(8).setCellValue("商品單價");
        headRow.createCell(9).setCellValue("商品數量");
        headRow.createCell(10).setCellValue("商品總價");
        headRow.createCell(11).setCellValue("運費");
        headRow.createCell(12).setCellValue("購買優惠資訊");
        headRow.createCell(13).setCellValue("總金額");
        headRow.createCell(14).setCellValue("買家購買附言");
        headRow.createCell(15).setCellValue("收貨人姓名");
        headRow.createCell(16).setCellValue("收貨地址-省市");
        headRow.createCell(17).setCellValue("收貨地址-街道地址");
        headRow.createCell(18).setCellValue("郵編");
        
        headRow.createCell(19).setCellValue("收貨人手機");
        headRow.createCell(20).setCellValue("收貨人電話");
        headRow.createCell(21).setCellValue("買家選擇運送方式");
        headRow.createCell(22).setCellValue("賣家備忘內容");
        headRow.createCell(23).setCellValue("訂單建立時間");
        headRow.createCell(24).setCellValue("付款時間");
        headRow.createCell(25).setCellValue("物流公司");
        headRow.createCell(26).setCellValue("物流單號");
        
        headRow.createCell(27).setCellValue("發貨附言");
        headRow.createCell(28).setCellValue("發票擡頭");
        headRow.createCell(29).setCellValue("電子郵件");
        
        // 表格資料
        for (Order order : all) {
            HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            
            dataRow.createCell(0).setCellValue(order.getSn());
            dataRow.createCell(1).setCellValue(order.getSn());
            if(Order.Status.PENDING_PAYMENT.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("等待付款");
            }else if(Order.Status.PENDING_REVIEW.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("等待稽核");
            }else if(Order.Status.PENDING_SHIPMENT.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("等待發貨");
            }else if(Order.Status.SHIPPED.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("已發貨");
            }else if(Order.Status.RECEIVED.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("已收貨");
            }else if(Order.Status.COMPLETED.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("已完成");
            }else if(Order.Status.FAILED.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("已失敗");
            }else if(Order.Status.CANCELED.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("已取消");
            }else if(Order.Status.DENIED.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("已拒絕");
            }else if(Order.Status.DELETE.equals(order.getStatus())){
                dataRow.createCell(2).setCellValue("已刪除");
            }
            
            
            dataRow.createCell(3).setCellValue(order.getMember().getId());
            dataRow.createCell(4).setCellValue("");//子訂單編號
            dataRow.createCell(5).setCellValue(order.getMember().getUsername());
            List<OrderItem> orderItems = order.getOrderItems();
            for (OrderItem orderItem : orderItems) {
                dataRow.createCell(6).setCellValue(orderItem.getName());
                dataRow.createCell(7).setCellValue(orderItem.getSpecifications().toString());
                dataRow.createCell(8).setCellValue(orderItem.getPrice().toString());
            }
            
            
            dataRow.createCell(9).setCellValue(order.getQuantity());
            dataRow.createCell(10).setCellValue(order.getAmount().toString());
            dataRow.createCell(11).setCellValue(order.getFreight().toString());
            dataRow.createCell(12).setCellValue("");
            dataRow.createCell(13).setCellValue(order.getAmount().toString());
            dataRow.createCell(14).setCellValue(order.getMemo());
            dataRow.createCell(15).setCellValue(order.getConsignee());
            dataRow.createCell(16).setCellValue(order.getAreaName());
            dataRow.createCell(17).setCellValue(order.getAddress());
            dataRow.createCell(18).setCellValue(order.getZipCode());
            //收貨人手機
            dataRow.createCell(19).setCellValue(order.getPhone());
            //收貨人電話
            dataRow.createCell(20).setCellValue(order.getPhone());
            
            
            dataRow.createCell(21).setCellValue(order.getShippingMethodName());
            dataRow.createCell(22).setCellValue("");
            dataRow.createCell(23).setCellValue(order.getCreatedDate());
            //付款時間
            OrderPayment orderPayment = orderPaymentService.findBySn(order.getSn());
            if(orderPayment!=null){
                dataRow.createCell(24).setCellValue(orderPayment.getCreatedDate());
            }
            //物流
            OrderShipping orderShipping=orderShippingService.findOrder(order);
            if(orderShipping!=null){
                dataRow.createCell(25).setCellValue(orderShipping.getDeliveryCorp());
                dataRow.createCell(26).setCellValue(orderShipping.getTrackingNo());
                dataRow.createCell(27).setCellValue(orderShipping.getMemo());
            }
            
            dataRow.createCell(28).setCellValue(order.getInvoice()!=null?order.getInvoice().getTitle():"");//發票擡頭
            dataRow.createCell(29).setCellValue(order.getMember().getEmail());//電子郵件
            
            
        }
        // 下載匯出
        // 設定頭資訊    
//        ServletActionContext.getResponse().setContentType(
//                "application/vnd.ms-excel");
        response.setContentType("application/vnd.ms-excel");    
        String filename = "訂單資料.xls";
        String agent = request.getHeader("user-agent");
        filename = FileUtils.encodeDownloadFilename(filename, agent);
        response.setHeader("Content-Disposition",
                "attachment;filename=" + filename);
        ServletOutputStream outputStream = response.getOutputStream();
        hssfWorkbook.write(outputStream);
        // 關閉
        hssfWorkbook.close();
        //匯出完成,更改狀態
        statusEXcel=true;
        return Results.OK;
    }
    
    //判斷是否匯出完畢的方法
    /**
     * @Description: 是否匯出完畢
     * @version: v1.0.0
     * @date: 2018年9月18日 下午4:32:32 
     *
     * Modification History:
     * Date         Author          Version            Description
     *-------------------------------------------------------------
     */
    @PostMapping("/isExport")
    @ResponseBody
    public Boolean isExport(HttpServletRequest request,HttpServletResponse response){
       // Object exportedFlag = request.getSession().getAttribute("exportedFlag");
        if(statusEXcel){
            //已經導完;
            statusEXcel=false;
            return true;
        }else{
           //還未導完;
            return false;
        }
    }        

工具類:

import java.io.IOException;
import java.net.URLEncoder;

import sun.misc.BASE64Encoder;

public class FileUtils {
        public static String encodeDownloadFilename(String filename, String agent)
                throws IOException {
            if (agent.contains("Firefox")) { // 火狐瀏覽器
                filename = "=?UTF-8?B?"
                        + new BASE64Encoder().encode(filename.getBytes("utf-8"))
                        + "?=";
                filename = filename.replaceAll("\r\n", "");
            } else { // IE及其他瀏覽器
                filename = URLEncoder.encode(filename, "utf-8");
                filename = filename.replace("+"," ");
            }
            return filename;
        }
}