Java는 여러 excel 테이블을 zip 파일로 내보내기 -> 클라이언트가 다운로드할 수 있도록 합니다.

업무 수요: 수요자가 원하는 데이터를 excel표로 내보냅니다.
                1.요청 한 번만 보내기
                 2.모든 excel표에서 데이터 기록은 50개를 초과할 수 없습니다
건드린 구덩이: 원래 내가 보낸 것은 aax 요청이었고, 그 다음에 성공을 요청했지만 돌아온 것은 모두 난장판이었다!파일을 다운로드하고 싶은데!!!
aax 요청, 응답은 텍스트 데이터이기 때문에 다운로드 파일은 aax 요청을 사용할 수 없습니다!뭘로 할까요?링크로 하면 돼요.
  location.href= "../../aliGoodsOrder/export?startDate="+app.startDate+"&endDate="+app.endDate;

아니면 라벨.
백그라운드에서 excel을 어떻게 내보냅니까? 아주 간단한 도구 종류를 여러분에게 공유합니다.
@Log4j
public class Excel {

    public static HSSFWorkbook createExcel(String sheetName, List cellNameList) {

        HSSFWorkbook excel = new HSSFWorkbook();
        HSSFSheet sheet = excel.createSheet(sheetName);
        HSSFRow row = sheet.createRow(0);
        int cellIndex = 0;
        for (String cellName : cellNameList) {
            HSSFCell cell = row.createCell(cellIndex);
            cell.setCellValue(cellName);
            cellIndex++;
        }
        return excel;
    }

    public static HSSFWorkbook createExcelData(HSSFWorkbook excel, List excelData,int rowIndex ,int columnSum){
        HSSFRow row=excel.getSheetAt(0).createRow(rowIndex);
        for(int i = 0; i < columnSum; i++){
            row.createCell(i).setCellValue(excelData.get(i));
        }
        return excel;
    }

}
  
        
            org.apache.poi
            poi-ooxml
            3.16
        

 
어떻게 사용할까:

    /**
     * @ Date       :2018/11/05
     * @ Description: 1688 Excel
     */
    private HSSFWorkbook exportExcel(List allList,String name){
        log.info("|createdExcel================start!============|");
        HSSFWorkbook excel = null;
        try{
            List cellNameList = new ArrayList<>();
            cellNameList.add(" ");
            cellNameList.add(" ");
            cellNameList.add(" ( )");
            cellNameList.add(" 1( : )");
            cellNameList.add(" 2( : )");
            cellNameList.add(" - ");
            cellNameList.add(" - ");
            cellNameList.add(" - ");
            cellNameList.add(" - ");
            cellNameList.add(" - ");
            cellNameList.add(" - ");
            cellNameList.add(" ");
            cellNameList.add("1688 id");
            String fileName = name;
            String sheetName  = name;
            excel = Excel.createExcel(sheetName,cellNameList);

            int rowIndex = 1;
            for (AliGoodsOrder order:
                    allList ) {
                List excelDate = new ArrayList<>();
                excelDate.add("");// 
                excelDate.add(order.getTitle()+"");
                excelDate.add(order.getNum()+"");
                excelDate.add(order.getSku1()+"");
                excelDate.add(order.getSku2()+"");
                excelDate.add(order.getReceiverName()+"");
                excelDate.add(order.getReceiverTel()+"");
                excelDate.add(order.getDeliveryProvince()+"");
                excelDate.add(order.getDeliveryCity()+"");
                excelDate.add(order.getDeliveryDistrict()+"");
                excelDate.add(order.getDeliveryAddress()+"");
                excelDate.add(order.getBuyerMessage()+"");
                excelDate.add(order.getAliId()+"");
                excel = Excel.createExcelData(excel,excelDate,rowIndex,13);
                rowIndex++;
            }

            log.info("|createdExcel================end!============|");
        }catch (Exception e){
            log.error(ExceptionUtils.getTraceInfo(e));
        }
        return excel;
    }

현재 위치, excel의 내보내기가 완성되었습니까?클라이언트가 다운로드하고 싶은 아가들은 다음 방법을 도구 클래스에 넣을 수 있습니다.
    // excel 
    public static  void downLoad(HttpServletResponse response, String fileName, HSSFWorkbook wb){
        try {
            response.reset();
            response.setContentType("application/ms-excel;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName+".xls", "UTF-8"))));
            try {
                wb.write(response.getOutputStream());
                response.getOutputStream().flush();
            } catch (Exception e) {
                log.error("Excel ", e);
                throw e;
            }finally{
                if(response.getOutputStream()!=null){
                    response.getOutputStream().close();
                }
            }

        }catch (Exception e){
            log.error("downLoadExcel-------fail!");
            log.error(ExceptionUtils.getTraceInfo(e));
        }

    }

클라이언트가 excle 파일을 다운로드해 달라고 요청하면 여기서 끝납니다.
만약 여러 개의 excel표를 zip으로 포장한 후에 다운로드하고 싶다면 계속 보십시오
코드 알아볼 필요 없어!!!다음은 excel표의 목록을 얻기 위해서입니다. (여기 작은 지식이 하나 더 있습니다. 바로 목록의 하위 목록입니다.)
    /**
     *  Excel list 
     * @param startDate
     * @param endDate
     * @return
     */
    private List getExcelByPagination(String startDate, String endDate){
        List list = getOrderByDate(startDate,endDate);
        int totalPage = list.size()%50 == 0 ? list.size()/50 : list.size()/50 + 1;

        List hssfWorkbookList = new ArrayList<>();
        String fileName = startDate+" "+endDate+"1688 ";
        for(int page = 1; page <= totalPage; page++){

            int fromIndex = (page-1)*50;
            int toIndex;
            if(page == totalPage && list.size()%50!= 0){
                toIndex = fromIndex + list.size()%50;
            }else{
                toIndex = fromIndex + 50;
            }

            HSSFWorkbook hssfWorkbook = exportExcel(list.subList(fromIndex,toIndex),fileName);
            if(hssfWorkbook != null){
                hssfWorkbookList.add(hssfWorkbook);
            }

        }
        return hssfWorkbookList;
    }

zip 다운로드 도구 클래스가 나옵니다.
    // 
    public static void downFileByStream(HttpServletResponse response,List excels,String fileName){
        try {
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            ZipOutputStream zipOut = new ZipOutputStream(toClient);
            for(int i=0;i

용법---다운로드의 실현 서비스 클래스
    /**
     * @ Date       :2018/11/05
     * @ Description: excel 50 , zip 
     */
    @Override
    public void downLoadZip(HttpServletResponse response,String startDate, String endDate) {
        try {
            List hssfWorkbookList = getExcelByPagination(startDate,endDate);
            String fileName = startDate+" "+endDate+"1688 ";

//            File temp = File.createTempFile("temp",".zip");
//            FileUtil.zipFiles(hssfWorkbookList,temp,fileName);
//            response = FileUtil.downFile(response, temp);
//            temp.deleteOnExit();
            FileUtil.downFileByStream(response,hssfWorkbookList,fileName);
        }catch (Exception e){
            log.error("downLoadZip=======fail!"+ExceptionUtils.getTraceInfo(e));

        }

    }

앞쪽에서 뒷부분까지 코드를 다 붙였어요.
왜 위의 코드에 몇 줄의 코드 주석이 있습니까?excel을 내보내서 zip 파일로 묶으면 클라이언트가 파일을 다운로드해 달라고 요청할 수 있다는 생각이었기 때문이다.
그러나 그 후에 이런 짓을 많이 한 것을 발견하고 파일을 response에 직접 저장했습니다.get Output Stream () 안에 있으면 돼요.
이 쓸데없는 코드도 붙여.
   /**
     *  Excel zip 
     * @param srcfile
     * @param zipfile
     */
    public static void zipFiles(List srcfile, File zipfile,String fileName) {
        try {
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile));
            for (int i = 0; i < srcfile.size(); i++) {
                out.putNextEntry(new ZipEntry(fileName+i+".xls"));
                srcfile.get(i).write(out);
            }
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     *  
     * @param response
     * @param file
     * @return
     */
    public static HttpServletResponse downFile(HttpServletResponse response, File file) {
        try {
            //  。
            InputStream fis = new BufferedInputStream(new FileInputStream(file.getPath()));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            //  response
            response.reset();
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/x-zip-compressed");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return null;
    }

이 다운로드 파일의 코드를 보고 나는 또 한마디 더 중얼거렸다. 왜 나는 마지막에 다시 되돌아왔을까?response로 돌아가서 틀렸잖아. 인터넷을 보면 다들
response.getOutputStream() out.write() , , null 。。。

이 블로그는 이렇게 대충 코드를 붙여 놓는 기능을 가지고 있는데, 다음 편에서는 만나는 새로운 지식점을 다시 이야기하겠다

좋은 웹페이지 즐겨찾기