• EasyExcel动态导出数据


    头的数据格式设置为 List<List<String>>  并且具体的数据格式也设置为List<List<String>>具体的数据和表头一一对应

    public <T> void exportTerminalnew(ExportHandlerDS handler, List<String> excelHeaders, String  staffCode, FastFileStorageClient fastFileClient, String fdfsUrl, IReportService reportExportDetailService, Long id) {
            
            ......
                            //根据前端选择的字段生成表头
            List<List<String>> head = head(excelHeaders);
            WriteSheet writeSheet = EasyExcel.writerSheet().head(head).
                    //设置样式
                    registerWriteHandler(setExcelStyle()).
                    //自定义列宽
                    registerWriteHandler(new Custemhandler()).
                    //registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).
                    //固定表头
                    registerWriteHandler(new CustomSheetWriteHandler()).
                            //动态合并单元格
                            registerWriteHandler(new ExcelCellMergeStrategy()).
                    build();
            //设置列宽?
            // writeSheet.setColumnWidthMap();
            ExcelWriter excelWriter = EasyExcel.write(baos).excelType(ExcelTypeEnum.XLSX).build();
            WriteTable build = EasyExcel.writerTable(0).needHead(false).build();
           
           .....
           
                //根据传入的字段筛选导出哪些数据
                List<List<String>> body = getBody(list, excelHeaders);
                excelWriter.write(body,writeSheet,build);
                excelWriter.finish();
                StorePath storePath=null;
                if(!selImage){
                    final ByteArrayInputStream byteIs = new ByteArrayInputStream(baos.toByteArray());
                    //生成的文件上传到fast DFS系统上
                     storePath = fastFileClient.uploadFile(byteIs, byteIs.available(), ExcelTypeEnum.XLSX.getValue().substring(1), null);
                }else {
                    StringBuilder fileNewPath=new StringBuilder();
                    final ByteArrayInputStream byteIs = new ByteArrayInputStream(getFile(baos,fileNewPath,list,staffCode));
                    //生成的文件上传到fast DFS系统上
                    storePath = fastFileClient.uploadFile(byteIs, byteIs.available(), "zip", null);
                     // 删除文件夹及文件
                    path.add(fileNewPath.toString());
                }
                String fullPath = storePath.getFullPath();
                filePath = fdfsUrl + "/" + fullPath;
                // 1: 执行成功 -1: 执行失败
                if (StringUtils.isNotBlank(fullPath)) {
                    reportExportDetailDTO.setStatus(1);
                    reportExportDetailDTO.setFilePath(filePath);
                } else {
                    reportExportDetailDTO.setStatus(-1);
                }
    
            } catch (Exception e) {
                reportExportDetailDTO.setStatus(-1);
                log.error("导出Excel报表文件出错",e);
            } finally {
                if(CollectionUtils.isNotEmpty(path)){
                    //删除文件
                    delFile(path);
                    log.error("要删除的目录地址:"+path);
                }
                reportExportDetailDTO.setId(id);
                reportExportDetailService.updateExport(reportExportDetailDTO);
            }
        }
    **
     * 设置excel样式
     * @return
     */
    private HorizontalCellStyleStrategy setExcelStyle(){
        // 表头策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        WriteFont writeFont=new WriteFont();
        writeFont.setFontName("宋体");
        writeFont.setFontHeightInPoints((short) 11);
        //加粗
        writeFont.setBold(true);
        headWriteCellStyle.setWriteFont(writeFont);
        //内容样式策略
        WriteCellStyle contextWriteeCellStyle=new WriteCellStyle();
        //设置水平居中
        contextWriteeCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle,contextWriteeCellStyle);
        return horizontalCellStyleStrategy;
    }
    /**
    easyexcel提供的自动列宽不能满足需求,只能自己根据业务要求重写
    * @description: EasyExcel设置列宽 * @author: qiuqingxin * @create: 2020-08-07 15:49 **/ public class Custemhandler extends AbstractColumnWidthStyleStrategy { private static final int MAX_COLUMN_WIDTH = 50; public Custemhandler() { } @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { int columnWidth=20; if (isHead ) { if (cell.getStringCellValue().equals("照片类型")){ columnWidth=20; } if (cell.getStringCellValue().equals("当前位置")){ columnWidth=50; } if (cell.getStringCellValue().equals("备注")){ columnWidth=30; } ...... writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256); } } }
    /**
     * @description: easyExcel拦截器
     * @author: qiuqingxin
     * @create: 2020-06-16 11:29
     **/
    public class CustomSheetWriteHandler implements SheetWriteHandler {
        @Override
        public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    
        }
        @Override
        public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
            //固定表头
                writeSheetHolder.getSheet().createFreezePane(0,1,0,1);
        }
    }
    
    /**
     * @description: 自定义合并单元格
     * @author: qiuqingxin
     * @create: 2020-08-07 16:38
     **/
    public class ExcelCellMergeStrategy implements CellWriteHandler {
        private int fileColumnIndex = -1;
        private int imageColumnIndex = -1;
        private String  regEx="[^0-9]";
    
        @Override
        public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        @Override
        public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
        }
        /**
        每在excel中写入一个单元格数据都会调用次方法
        **/
        @Override
        public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
            if (isHead) {
                if ("附件".equals(cell.getStringCellValue())) {
                    fileColumnIndex = cell.getColumnIndex();
                    return;
                }
                if ("现场照片".equals(cell.getStringCellValue())) {
                    imageColumnIndex = cell.getColumnIndex();
                    return;
                }
            } else {
    
                if (imageColumnIndex != -1) {
                    //找到附件所在的列
                    if (cell.getColumnIndex() == imageColumnIndex + 1) {
                        // Sheet sheet = writeSheetHolder.getSheet();
                        Row row = cell.getRow();
                        Cell cell1 = row.getCell(imageColumnIndex);
                        Cell cell2 = row.getCell(imageColumnIndex + 1);
                        String imageUrl = cell2.getStringCellValue();
                        String imageName = cell1.getStringCellValue();
                        if (!isZero(imageName)) {
                            cell1.setCellFormula( "HYPERLINK("" + imageUrl + "","" + imageName + "")");
                        }else {
                            cell1.setCellValue("");
                        }
                        row.removeCell(cell2);
                    }
                }
    
    
                if (fileColumnIndex != -1) {
                    if (null == cell.getRow().getCell(fileColumnIndex)) {
                        //找到附件所在的列
                        if (cell.getColumnIndex() == fileColumnIndex + 2) {
                            // Sheet sheet = writeSheetHolder.getSheet();
                            Row row = cell.getRow();
                            Cell cell3 = row.createCell(fileColumnIndex);
                            Cell cell1 = row.getCell(fileColumnIndex + 1);
                            Cell cell2 = row.getCell(fileColumnIndex + 2);
                            String fileUrl = cell2.getStringCellValue();
                            cell3.setCellFormula("HYPERLINK("" + fileUrl + "","" + cell1.getStringCellValue() + "")");
                            row.removeCell(cell1);
                            row.removeCell(cell2);
                        }
                    } else {
                        if (cell.getColumnIndex() == fileColumnIndex + 1) {
                            // Sheet sheet = writeSheetHolder.getSheet();
                            Row row = cell.getRow();
                            Cell cell1 = row.getCell(fileColumnIndex );
                            Cell cell2 = row.getCell(fileColumnIndex + 1);
                            String fileUrl = cell2.getStringCellValue();
                            cell1.setCellFormula("HYPERLINK("" + fileUrl + "","" + cell1.getStringCellValue() + "")");
                            row.removeCell(cell2);
                        }
                    }
    
    
                }
    
            }
    
        }
    
        private boolean isZero(String value){
            Pattern p = Pattern.compile(regEx);
            Matcher m = p.matcher(value);
            String trim = m.replaceAll("").trim();
    
            return trim.equals("0")?true:false;
        }
    
    
    
    }
    
    
    private List<List<String>> getBody(List<DsTerminalUploadExcel> list3,List<String> excelHeaders )throws Exception{
        Map<Integer,String> map=new HashMap<>();
        List<List<String>> lists=new ArrayList<>();
        Integer index=1;
        for (String excelHeader : excelHeaders) {
            map.put(index++,excelHeader);
        }
        int size = map.size();
        for (DsTerminalUploadExcel dsTerminalUploadExcel : list3) {
            List<String> data=new ArrayList<>();
        for (int i =0;i<size;i++){
            if (map.get(i+1).equals("image")){
                String value2=dsTerminalUploadExcel.getImagePaths()!=null?dsTerminalUploadExcel.getImagePaths().size()+"张)":"0张)";
                 value2="点击查看图片("+value2;
                data.add(value2);
                value2=null==dsTerminalUploadExcel.getStaffName()?
                        "/"+dsTerminalUploadExcel.getReportDate().substring(0,10)+"_"+dsTerminalUploadExcel.getId():
                        "/"+dsTerminalUploadExcel.getStaffName()+"_"+dsTerminalUploadExcel.getReportDate().substring(0,10)+"_"+dsTerminalUploadExcel.getId();
                value2="images/"+value2;
                data.add(value2);
            }else {
            String value=(String)getValue(dsTerminalUploadExcel,map.get(i+1));
            data.add(value);
            if (map.get(i+1).equals("fileName")){
                String value2=(String)getValue(dsTerminalUploadExcel,"filePath");
                data.add(value2);
            }
            }
        }
        lists.add(data);
        }
        return lists;
    }
    //反射调用get方法
    public static Object getValue(Object dto,String name) throws Exception {
        String s = name.substring(0, 1).toUpperCase();
        String substring = name.substring(1);
    
        Method method = dto.getClass().getMethod("get" + s + substring);
        return   method.invoke(dto);
    }
    
    
    //将数据生成字节数组
    private byte[] getFile(ByteArrayOutputStream baos,StringBuilder fileNewPath,List<DsTerminalUploadExcel> list3,
                          String staffCode) throws Exception {
        // String path = "D:\sss\"+staffCode+"_"+(new SimpleDateFormat("yyMMddHHmmss").format(new Date()))+"\";
         String path = "/data/file/"+staffCode+"_"+(new SimpleDateFormat("yyMMddHHmmss").format(new Date()))+"/";
        log.error("获取的路径:"+path);
        String fileName=""+System.currentTimeMillis();
        String  filePath=path+fileName;
        fileNewPath.append(path);
        File file = new File(filePath);
        if (!file.exists()){
            file.mkdirs();
        }
        FileOutputStream fileOutputStream=new FileOutputStream(filePath+"/"+System.currentTimeMillis()+ExcelTypeEnum.XLSX.getValue());
        fileOutputStream.write(baos.toByteArray());
        fileOutputStream.close();
    
            genImages(list3,filePath);
            log.error("filePath"+filePath);
    return setZip(filePath,path,fileName); } private void genImages(List<DsTerminalUploadExcel> list3,String filePath) throws Exception { File file = new File(filePath + "/images"); if (!file.exists()){ file.mkdirs(); } for (DsTerminalUploadExcel dsTerminalUploadExcel : list3) { List<String> imagePaths = dsTerminalUploadExcel.getImagePaths(); if (null==imagePaths||imagePaths.size()==0){ continue; } String imagepath=null==dsTerminalUploadExcel.getStaffName()? "/"+dsTerminalUploadExcel.getReportDate().substring(0,10)+"_"+dsTerminalUploadExcel.getId(): "/"+dsTerminalUploadExcel.getStaffName()+"_"+dsTerminalUploadExcel.getReportDate().substring(0,10)+"_"+dsTerminalUploadExcel.getId(); imagepath=file.getPath()+imagepath; File file1 = new File(imagepath); if (!file1.exists()) file1.mkdirs(); for (String imagePath : imagePaths) { String ext = imagePath.substring(imagePath.lastIndexOf("/") + 1); File file2 = new File(file1.getPath() + "/" + ext); FileOutputStream fileOutputStream = new FileOutputStream(file2); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); //发送HTTP请求并指定返回的数据为byte数组 RestTemplate restTemplate = new RestTemplate(); byte[] forObject = restTemplate.getForObject(imagePath, byte[].class); bufferedOutputStream.write(forObject); bufferedOutputStream.flush(); fileOutputStream.close(); bufferedOutputStream.close(); } } }



    private byte[] setZip(String allPath, String path, String fileName) throws Exception {
    String newzipPath = path + fileName + ".zip";
    File file = new File(newzipPath);
    FileOutputStream fileOutputStream = new FileOutputStream(file);
       //压缩工具类
    byte[] aByte = ZipUtils.getByte(allPath, fileOutputStream, true, file);
    fileOutputStream.close();
    return aByte;
    }
     
  • 相关阅读:
    java文件的读写程序代码
    C#多线程总结
    动态调用WebService接口的几种方式
    Net中Attribute特性的高级使用及自定义验证实现
    进程、线程、多线程
    C#设计模式之单例模式
    C# HttpClient 请求转发
    webapi Model Validation 模型验证
    加密解密方法
    手把手教Electron+vue的使用
  • 原文地址:https://www.cnblogs.com/shuixingshushuren/p/13582044.html
Copyright © 2020-2023  润新知