zoukankan      html  css  js  c++  java
  • Java中导出Excel数据,封装Bean

    在Java中封装导出Excel数据的总体思路为:

    1.导出,根据查询得到的数据(一般我们页面上用的是查询条件带分页的),我们需要把查询条件带到后台重新查询,并且是查询全部数据,不带分页

    2.不能用ajax异步提交。应该用location.href=""的方式,把处理的流交给浏览器来处理,JS无法处理流计算。

    3.封装统一的Bean实体,主要输入导出的列名,excel名,数据集即可导出。

    用到的Maven地址:

             <!-- poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.13</version>
            </dependency>
    
    
                <dependency>
            	<groupId>jexcelapi</groupId>
            	<artifactId>jxl</artifactId>
            	<version>2.6</version>
            </dependency>
    

     ExcelBean:

    public class ExcelBean {
        
        private String name;
        
        private String sheetName;
        
        private ExcelTitle[] titles;
        
        private List<String[]> dataList;
        
        private boolean headBold = true;
        
        /**
         * 列宽 (像素)
         */
        private int columnWidth = 200;
        
        private int rowHeight;
        
        public ExcelBean(String name, String sheetName, ExcelTitle[] titles){
            this.name = name;
            this.sheetName = sheetName;
            this.titles = titles;
            this.dataList = new ArrayList<String[]>();
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getSheetName() {
            return sheetName;
        }

        public void setSheetName(String sheetName) {
            this.sheetName = sheetName;
        }

        public ExcelTitle[] getTitles() {
            return titles;
        }

        public void setTitles(ExcelTitle[] titles) {
            this.titles = titles;
        }

        public List<String[]> getDataList() {
            return dataList;
        }

        public void setDataList(List<String[]> dataList) {
            this.dataList = dataList;
        }
        
        public boolean isHeadBold() {
            return headBold;
        }

        public void setHeadBold(boolean headBold) {
            this.headBold = headBold;
        }

        public int getColumnWidth() {
            return columnWidth;
        }

        public void setColumnWidth(int columnWidth) {
            this.columnWidth = columnWidth;
        }

        public int getRowHeight() {
            return rowHeight;
        }

        public void setRowHeight(int rowHeight) {
            this.rowHeight = rowHeight;
        }

        public void add(String[] data){
            this.dataList.add(data);
        }
        

    }

     ExcelBox:

    /**
     * excel 块状区域
     * @author
     *
     */
    public class ExcelBox {
        private int x1;
        
        private int y1;
        
        private int x2;
        
        private int y2;
        
        public ExcelBox(int width, int height, int colWidth, int rowHeight, int padding){
            double ratio = 1;
            int innerWidth = colWidth - 2 * padding;
            int innerHeight = rowHeight - 2 * padding;
            if((double) width / height > (double) innerWidth/ innerHeight){
                if(width > innerWidth){
                    ratio = (double) innerWidth / width;
                }
            }
            else{
                if(height > innerHeight){
                    ratio = (double) innerHeight / height;
                }
            }
            
            int boxWidth = (int)(width * ratio);
            int boxHeight = (int)(height * ratio);
            x1 = (colWidth - boxWidth) / 2;
            y1 = (rowHeight - boxHeight) / 2;
            x2 = x1 + boxWidth;
            y2 = y1+ boxHeight;
        }

        public int getX1() {
            return x1;
        }

        public void setX1(int x1) {
            this.x1 = x1;
        }

        public int getY1() {
            return y1;
        }

        public void setY1(int y1) {
            this.y1 = y1;
        }

        public int getX2() {
            return x2;
        }

        public void setX2(int x2) {
            this.x2 = x2;
        }

        public int getY2() {
            return y2;
        }

        public void setY2(int y2) {
            this.y2 = y2;
        }
    }

     ExcelImage:

    /**
     * excel 图片
     * @
     *
     */
    public class ExcelImage {
        private int width;
        
        private int height;
        
        private byte[] byteArray;
        
        public ExcelImage(String imageUrl) throws IOException{
            BufferedImage bufferedImage = ImageIO.read(new URL(imageUrl));
            ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
            ImageIO.write(bufferedImage,"png", byteArrayOutputStream);
            width = bufferedImage.getWidth();
            height = bufferedImage.getHeight();
            byteArray = byteArrayOutputStream.toByteArray();
            byteArrayOutputStream.close();
        }
    
        public int getWidth() {
            return width;
        }
    
        public void setWidth(int width) {
            this.width = width;
        }
    
        public int getHeight() {
            return height;
        }
    
        public void setHeight(int height) {
            this.height = height;
        }
    
        public byte[] getByteArray() {
            return byteArray;
        }
    
        public void setByteArray(byte[] byteArray) {
            this.byteArray = byteArray;
        }
    }
    

     ExcelTitle:

    /**
     * Excel Title
     * @author 
     *
     */
    public class ExcelTitle {
    
        private String value;
        
        /**
         * 列宽(像素)
         */
        private int width;
        
        public static ExcelTitle generate(String value, int width){
            ExcelTitle title = new ExcelTitle();
            title.setValue(value);
            title.setWidth(width);
            return title;
        }
    
        public String getValue() {
            return value;
        }
    
        public void setValue(String value) {
            this.value = value;
        }
    
        public int getWidth() {
            return width;
        }
    
        public void setWidth(int width) {
            this.width = width;
        }
    }
    

     工具类 ExcelUtils:

    package com.goldensky.common.excelutil;

    import java.io.ByteArrayOutputStream;
    import java.io.OutputStream;
    import java.util.regex.Pattern;

    import javax.servlet.http.HttpServletResponse;

    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFPatriarch;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;

    public class excelExport {
        
        
        /*@SuppressWarnings("resource")
        public static void export( ExcelBean excelBean, HttpServletResponse response) throws Exception{
                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = wb.createSheet(excelBean.getSheetName());
                HSSFRow row = sheet.createRow(0);
                
                //设置样式
                HSSFCellStyle style = wb.createCellStyle();
                if(excelBean.isHeadBold()){
                    HSSFFont headfont = wb.createFont();
                    headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
                    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                    style.setFont(headfont);
                }
                
                HSSFCell cell;
                ExcelTitle[] titles = excelBean.getTitles();
                for(int i=0; i < titles.length; i++){
                    ExcelTitle title = titles[i];
                    cell= row.createCell(i);
                    cell.setCellValue(title.getValue());
                    cell.setCellStyle(style);
                    int columnWidth = title.getWidth() > 0 ? title.getWidth() : excelBean.getColumnWidth();
                    sheet.setColumnWidth(i, getColWidth(columnWidth));
                }
                
                int rowNumber = 1;
                int rowHeihgt = excelBean.getRowHeight();
                HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
                for(String[] data : excelBean.getDataList()){
                    row = sheet.createRow(rowNumber ++ );
                    if(rowHeihgt > 0){
                        row.setHeight((short) getRowHeight(rowHeihgt));
                    }
                    else{
                        rowHeihgt = 18;
                    }
                    for(int j=0; j<data.length; j ++){
                        String value = data[j];
                        cell = row.createCell(j);
                        
                        if(isUrl(value)){
                            if(isImage(value)){
                                int columnWidth = titles[j].getWidth() > 0 ? titles[j].getWidth() : excelBean.getColumnWidth();
                                ExcelImage excelImage = new ExcelImage(value);
                                ExcelBox excelBox = new ExcelBox(excelImage.getWidth(), excelImage.getHeight(), rowHeihgt, columnWidth, 10);
                                HSSFClientAnchor anchor = new HSSFClientAnchor();
                                int cw = getColWidth(columnWidth);
                                int rh = getRowHeight(rowHeihgt);
                                short col = (short)(j);
                                int rowNum = rowNumber-1;
                                anchor.setDx1(getAnchorX(excelBox.getX1(), cw));
                                anchor.setDy1(getAnchorY(excelBox.getY1(), rh));
                                anchor.setDx2(getAnchorX(excelBox.getX2(), cw));
                                anchor.setDy2(getAnchorY(excelBox.getY2(), rh));
                                anchor.setCol1(col);
                                anchor.setRow1(rowNum);
                                anchor.setCol2(col);
                                anchor.setRow2(rowNum);
                                
                                anchor.setAnchorType(0);
                                patriarch.createPicture(anchor , wb.addPicture(excelImage.getByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
                            }
                            else{
                                cell.setCellValue(value);
                                cell.setCellFormula("HYPERLINK("" + value + "","" + value + "")");
                                HSSFCellStyle linkStyle = wb.createCellStyle();
                                HSSFFont cellFont= wb.createFont();
                                cellFont.setUnderline((byte) 1);
                                cellFont.setColor(HSSFColor.BLUE.index);
                                linkStyle.setFont(cellFont);
                                linkStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
                                cell.setCellStyle(linkStyle);
                            }
                        }
                        else{
                            cell.setCellValue(value);
                            HSSFCellStyle cellStyle = wb.createCellStyle();
                            cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
                            cell.setCellStyle(cellStyle);
                        }
                    }
                }
                
                response.setContentType("application/octet-stream;charset=utf-8");
                response.setCharacterEncoding("utf-8");
                
                String filename = excelBean.getName();
                filename = new String(filename.replaceAll("\s|;", "").getBytes("gbk"), "ISO8859-1");
                response.setContentType("application/vnd.ms-excel");
                response.setHeader("Content-disposition", "attachment;filename=" + filename);
                OutputStream ouputStream = response.getOutputStream();   
                wb.write(ouputStream);
                ouputStream.flush();   
                ouputStream.close();  
            }*/
        
        
        @SuppressWarnings("resource")
        public static void export( ExcelBean excelBean, HttpServletResponse response) throws Exception{
            
                
                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = wb.createSheet(excelBean.getSheetName());
                HSSFRow row = sheet.createRow(0);
                
                //设置样式
                HSSFCellStyle style = wb.createCellStyle();
                if(excelBean.isHeadBold()){
                    HSSFFont headfont = wb.createFont();
                    headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
                    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                    style.setFont(headfont);
                }
                
                HSSFCell cell;
                ExcelTitle[] titles = excelBean.getTitles();
                for(int i=0; i < titles.length; i++){
                    ExcelTitle title = titles[i];
                    cell= row.createCell(i);
                    cell.setCellValue(title.getValue());
                    cell.setCellStyle(style);
                    int columnWidth = title.getWidth() > 0 ? title.getWidth() : excelBean.getColumnWidth();
                    sheet.setColumnWidth(i, getColWidth(columnWidth));
                }
                
                int rowNumber = 1;
                int rowHeihgt = excelBean.getRowHeight();
                HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
                for(String[] data : excelBean.getDataList()){
                    row = sheet.createRow(rowNumber ++ );
                    if(rowHeihgt > 0){
                        row.setHeight((short) getRowHeight(rowHeihgt));
                    }
                    else{
                        rowHeihgt = 18;
                    }
                    for(int j=0; j<data.length; j ++){
                        String value = data[j];
                        cell = row.createCell(j);
                        
                        if(isUrl(value)){
                            if(isImage(value)){
                                int columnWidth = titles[j].getWidth() > 0 ? titles[j].getWidth() : excelBean.getColumnWidth();
                                ExcelImage excelImage = new ExcelImage(value);
                                ExcelBox excelBox = new ExcelBox(excelImage.getWidth(), excelImage.getHeight(), rowHeihgt, columnWidth, 10);
                                HSSFClientAnchor anchor = new HSSFClientAnchor();
                                int cw = getColWidth(columnWidth);
                                int rh = getRowHeight(rowHeihgt);
                                short col = (short)(j);
                                int rowNum = rowNumber-1;
                                anchor.setDx1(getAnchorX(excelBox.getX1(), cw));
                                anchor.setDy1(getAnchorY(excelBox.getY1(), rh));
                                anchor.setDx2(getAnchorX(excelBox.getX2(), cw));
                                anchor.setDy2(getAnchorY(excelBox.getY2(), rh));
                                anchor.setCol1(col);
                                anchor.setRow1(rowNum);
                                anchor.setCol2(col);
                                anchor.setRow2(rowNum);
                                
                                anchor.setAnchorType(0);
                                patriarch.createPicture(anchor , wb.addPicture(excelImage.getByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
                            }
                            else{
                                cell.setCellValue(value);
                                cell.setCellFormula("HYPERLINK("" + value + "","" + value + "")");
                                HSSFCellStyle linkStyle = wb.createCellStyle();
                                HSSFFont cellFont= wb.createFont();
                                cellFont.setUnderline((byte) 1);
                                cellFont.setColor(HSSFColor.BLUE.index);
                                linkStyle.setFont(cellFont);
                                linkStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
                                cell.setCellStyle(linkStyle);
                            }
                        }
                        else{
                            cell.setCellValue(value);
                            HSSFCellStyle cellStyle = wb.createCellStyle();
                            cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
                            cell.setCellStyle(cellStyle);
                        }
                    }
                }
                
                response.setContentType("application/octet-stream;charset=utf-8");
                response.setCharacterEncoding("utf-8");
                
                String filename = excelBean.getName();
                filename = new String(filename.replaceAll("\s|;", "").getBytes("gbk"), "ISO8859-1");
                response.setContentType("application/vnd.ms-excel");
                response.setHeader("Content-disposition", "attachment;filename=" + filename);
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                wb.write(out);
                byte[] ret = out.toByteArray();
                out.flush();
                out.close();
                
                FileUpDown file = new FileUpDown();
                file.download(filename,
                        ret, response);
            }
            
            
            /**
             * 获取图片x方向长度坐标转换
             * @param px
             * @param colWidth
             * @return
             */
            public static  int getAnchorX(int px, int colWidth){  
                return (int) Math.round(( (double) 701 * 16000.0 / 301)*((double)1/colWidth)*px);  
            }  
            
            /**
             * 获取图片y方向长度坐标转换
             * @param px
             * @param rowHeight
             * @return
             */
            public static int getAnchorY(int px, int rowHeight){  
                return (int) Math.round(( (double) 144 * 8000 / 301)*((double)1/rowHeight)*px);  
            }  
              
            /**
             * 行高转换
             * @param px
             * @return
             */
            public static int getRowHeight( int px ){  
                return (int) Math.round(((double) 4480 / 300 ) * px);  
            }
            
            /**
             * 列宽转换
             * @param px
             * @return
             */
            public static int getColWidth( int px ){  
                return (int) Math.round(((double) 10971 / 300 ) * px);  
            }
            
            /**
             * 判断是否为链接地址
             */
            public static boolean isUrl(String string){
                Pattern pattern = Pattern.compile("^((http|https):\/\/([\w\-]+\.)+[\w\-]+(\/[\w\u4e00-\u9fa5\-\.\/?\@\%\!\&=\+\~\:\#\;\,]*)?)", Pattern.CASE_INSENSITIVE );
                return pattern.matcher(string).matches();
            }
            
            /**
             * 判断是否为图片
             */
            public static boolean isImage(String string){
                Pattern pattern = Pattern.compile("\S+\.(jpg|jpeg|png|gif|bmp)(\?\S+)?$", Pattern.CASE_INSENSITIVE );
                return isUrl(string) && pattern.matcher(string).matches();
            }


    }

     下载类,FileUpDown:

    package com.goldensky.common.excelutil;

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;

    public class FileUpDown {


        
        
        
        /**
         * 导出文件,注意:导出后缓存将被删除
         *
         * @param fileName 文件名
         * @param buffer 文件内容缓存
         * @param response HttpServletResponse对象
         * @return 如果出错返回错误信息
         */
        public static String download(String fileName, byte[] buffer, HttpServletResponse response)
        {
            String ret = "";
            javax.servlet.ServletOutputStream outputStream = null;
            try
            {
                
                if (buffer != null && buffer.length > 0)
                {
                    String strFileName = new String(fileName.getBytes("utf-8"), "utf-8");
                    
                    response.reset();
                    response.setContentType("application/x-download");
                    
                    response.setHeader("Content-Disposition", "attachment; filename="" + strFileName + """);
                    
                    int length = buffer.length;
                    
                    outputStream = response.getOutputStream();
                    outputStream.write(buffer, 0, length);
                    outputStream.flush();
                    
                    outputStream.close();
                    response.setStatus(HttpServletResponse.SC_OK);
                    response.flushBuffer();
                }
                
            }
            catch (Exception e)
            {
            }
            finally
            {
                buffer = null;
            }
            return ret;
        }
        
        
        /**
         * 下载数组内容到客户端一文件
         */
        public static void download(HttpServletResponse response, HttpServletRequest request, byte[] buffer,
            String strFileName)
        {
            try
            {
                
                // strFileName = new String( strFileName.getBytes("Big5"),
                // "ISO8859_1" ));
                strFileName = new String(strFileName.getBytes("gb2312"), "iso-8859-1");
                
                response.reset();
                response.setContentType("application/x-download");
                
                // if (request.getHeader("User-Agent").indexOf("MSIE 5.5") != -1) {
                // ... IE5.5不能加上 attachment;
                response.setHeader("Content-Disposition", "attachment; filename="" + strFileName + """);
                
                int length = buffer.length;
                
                ServletOutputStream outputStream = response.getOutputStream();
                outputStream.write(buffer, 0, length);
                
                outputStream.flush();
                outputStream.close();
                
                response.setStatus(HttpServletResponse.SC_OK);
                response.flushBuffer();
                
            }
            catch (Exception e)
            {
            }
        }
    }

     调用示例:

     前台:

      

      //导出Excel数据
        function  exportexcel()
        {
        	var drvalue=$("#drstatus").combobox('getValue');
        	location.href="${localCtx }/approvaloption/export.do?flowstatus="+drvalue+"&&roleid="+${sysUser.userrole.nRoleId}+"";
        }
    

     后台调用:

    @RequestMapping(value="export.do")
    	public  void exportExcel(String flowstatus,Long roleid,HttpServletResponse response)
    	{
    		Long status=(null!=flowstatus&&!"".equals(flowstatus))?Long.parseLong(flowstatus):null;
    		List<Flow> list=flowService.getList(roleid,status);
    		
    		
    		 ExcelTitle[] titles = {
    	               ExcelTitle.generate("流程名称", 60), 
    	               ExcelTitle.generate("流程描述", 100),
    	               ExcelTitle.generate("流程节点名称", 100),
    	               ExcelTitle.generate("审批人", 100),
    	               ExcelTitle.generate("通行证类型", 100),
    	               ExcelTitle.generate("号牌号码", 100),
    	               ExcelTitle.generate("车辆使用单位", 100),
    	               ExcelTitle.generate("业务类别", 100),
    	               ExcelTitle.generate("审批状态", 100),
    		 
    		 			};
    	       SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    	       String fileName = format.format(Calendar.getInstance().getTime())+"审核结果.xls"; 
    	       ExcelBean excelBean = new ExcelBean(fileName, "统计", titles);
    	       for(Flow fl : list){
    	          
    	    	   String flowname=fl.getFd().getFlowName();
    	    	   String flowdesc=fl.getFd().getFlowDesc();
    	    	   String nodeName=fl.getFn().getNodeNames();
    	    	   String spr=fl.getT().getRoleName();
    	    	   String txzlx=fl.getDic().getDmsm1();
    	    	   String hphm=fl.getTp().getHphm();
    	    	   String clsydw=fl.getTp().getClsydw();
    	    	   String ywlb=(fl.getTp().getYwlb()==1)?"业务申请":"延期";
    	    	   String splc=(fl.getApproveStatus()==1L)?"未审批":"已审批";
    	    	   excelBean.add(new String[]{flowname,flowdesc,nodeName,spr,txzlx,hphm,clsydw,ywlb,splc});
    	       }
    	       try {
    	    	   excelExport.export(excelBean, response);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    
       
    
  • 相关阅读:
    启动hadoop 2.6遇到的datanode启动不了
    .net开发遇到的一个问题
    there are 0 datanode.....
    更改HDFS权限
    VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案
    Hive学习
    linux下mysql安装
    (5.2)mysql高可用系列——测试环境部署
    【转】mysql索引的探究
    【3.1】【mysql基本实验】mysql复制(主从复制/异步复制/半同步复制,一主一从)
  • 原文地址:https://www.cnblogs.com/it888/p/5064636.html
Copyright © 2011-2022 走看看