zoukankan      html  css  js  c++  java
  • Java使用POI导出Excel工具类

    自行导入poi3.9的jar包

    工具类:

    package com.cpic.caf.template.home.util;
    import java.io.BufferedOutputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.text.SimpleDateFormat;
    import java.util.Collection;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.regex.Matcher;
    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.HSSFComment;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFPatriarch;
    import org.apache.poi.hssf.usermodel.HSSFRichTextString;
    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;
    
    /**
     * 
     * @author librag
     * @version v1.0
     * @param <T>
     *  应用泛型,代表任意一个符合javabean风格的类
     *  注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
     *  byte[]表jpg格式的图片数据
     */
    public class ExportExcel<T>{
    	
    	public static final String Map = "Map";
    	public static final String List = "List";
    	
    	private  int List_Size = 0;
    	
    /*	
    	public ExportExcel(int List_Size) {
    		this.List_Size = List_Size;
    	}
    	
    	
    	public ExportExcel() {
    		
    	}*/
    	
    	/**
         * @param title
         *            表格标题名
         * @param headers
         *            表格属性列名数组
         * @param dataset 允许的类型(实体类,List<List<Object>>,List<Map<String,Object>>)
         *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
         *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
         * @param out
         *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
         * @param pattern
         *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
        
    	Controller示例
    	
    	
    			//引用浏览器引擎下载
    			//使用本工具类创建对象
    	 		ExportExcel<对象> ex = new ExportExcel<对象>();
    	        
    	        //创建列
    	        String[] headers =
    	        { "主键", "从业者ID", "案例是作品集还是婚礼案例", "案例类型", "标题","案例地址","描述","置顶","删除状态","访问量","收藏量"};
    	        
    	        //创建值列
    	    	List<对象> dataset = Service.方法名();
    	    	
    	    	//调用工具类对象
                ex.exportExcel(headers,dataset,response);
               
                //提示
                System.out.println("excel导出成功!");
                
                
        Controller示例2
    	
    	
    	
    			//直接下载到本地磁盘
    			//使用本工具类创建对象
    	 		ExportExcel<Map<String, Object>> ex = new ExportExcel<对象>();
    	        
    	        //创建列
    	        String[] headers =
    	        { "主键", "从业者ID", "案例是作品集还是婚礼案例", "案例类型", "标题","案例地址","描述","置顶","删除状态","访问量","收藏量"};
    	        
    	         //创建值列
    	    	List<Map<String, Object>> dataset = Service.方法名();
    	    	
    	    	//调用工具类对象
                ex.exportExcel(headers,dataset,"E:\文件夹名\文件夹名");
               
                //提示
                System.out.println("excel导出成功!");
            
            
            
            
         */
    	
    	
    	
    	/**
    	 * 方法重载同时指向一个unchecked
    	 * @param dataset Value列
    	 * @param response 必须
    	 * @param path  (当传入指定path时 方法会使用IO流下载到指定地址(文件夹) || 反之 会引用浏览器的下载引擎)
    	 */
        public void exportExcel(Collection<T> dataset,String path){
            exportExcel("EXCEL文档", null, dataset, "yyyy-MM-dd",path);
        }
        public void exportExcel(String[] headers, Collection<T> dataset,String path) {
            exportExcel("EXCEL文档", headers, dataset, "yyyy-MM-dd",path);
        }
        public void exportExcel(String[] headers, Collection<T> dataset, String pattern,String path){
            exportExcel("EXCEL文档", headers, dataset, pattern,path);
        }
        public void exportExcel(Collection<T> dataset,HttpServletResponse response){
            exportExcel("EXCEL文档", null, dataset, "yyyy-MM-dd",response);
        }
        public void exportExcel(String[] headers, Collection<T> dataset,HttpServletResponse response) {
            exportExcel("EXCEL文档", headers, dataset, "yyyy-MM-dd",response);
        }
        public void exportExcel(String[] headers, Collection<T> dataset, String pattern,HttpServletResponse response){
            exportExcel("EXCEL文档", headers, dataset, pattern,response);
        }
        
        public void exportExcel(String[] headers, List<List<Object>> dataset,HttpServletResponse response) {
            exportExcel("EXCEL文档", headers, dataset, "yyyy-MM-dd",response);
        }
        
        public void MapExportExcel(String[] headers, List<Map<String, Object>> dataset,HttpServletResponse response) {
            exportExcel("EXCEL文档", headers, dataset, "yyyy-MM-dd",response,"Map");
        }
        
    
        /**
         * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
         * 
         * @param title 表格标题名
         * @param headers 表格属性列名数组
         * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
         * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
         * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
         */
        @SuppressWarnings("unchecked")
        public void exportExcel(String title, String[] headers,Collection<T> dataset, String pattern,String path){
        	
        	
            // 声明一个工作薄
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 生成一个表格
            HSSFSheet sheet = workbook.createSheet(title);
            // 设置表格默认列宽度为15个字节
            sheet.setDefaultColumnWidth((short) 15);
            // 生成一个样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置这些样式
            style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
            style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 生成一个字体
            HSSFFont font = workbook.createFont();
            font.setColor(HSSFColor.VIOLET.index);
            font.setFontHeightInPoints((short) 12);
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 把字体应用到当前的样式
            style.setFont(font);
            // 生成并设置另一个样式
            HSSFCellStyle style2 = workbook.createCellStyle();
            style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
            style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            // 生成另一个字体
            HSSFFont font2 = workbook.createFont();
            font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            // 把字体应用到当前的样式
            style2.setFont(font2);
    
            // 声明一个画图的顶级管理器
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
            // 定义注释的大小和位置,详见文档
            HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
                    0, 0, 0, (short) 4, 2, (short) 6, 5));
            // 设置注释内容
            comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
            // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
            comment.setAuthor("leno");
    
            // 产生表格标题行
            HSSFRow row = sheet.createRow(0);
            for (short i = 0; i < headers.length; i++)
            {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                cell.setCellValue(text);
            }
            
            
            try
            {
            
    
    	        // 遍历集合数据,产生数据行
    	        Iterator<T> it = dataset.iterator();
    	        int index = 0;
    	        while (it.hasNext())
    	        {
    	            index++;
    	            row = sheet.createRow(index);
    	            T t = (T) it.next();
    	            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
    	            Field[] fields = t.getClass().getDeclaredFields();
    	            for (short i = 0; i < fields.length; i++)
    	            {
    	                HSSFCell cell = row.createCell(i);
    	                cell.setCellStyle(style2);
    	                Field field = fields[i];
    	                String fieldName = field.getName();
    	                String getMethodName = "get"
    	                        + fieldName.substring(0, 1).toUpperCase()
    	                        + fieldName.substring(1);
    	              
    	                    Class tCls = t.getClass();
    	                    Method getMethod = tCls.getMethod(getMethodName,
    	                            new Class[]
    	                            {});
    	                    Object value = getMethod.invoke(t, new Object[]
    	                    {});
    	                    // 判断值的类型后进行强制类型转换
    	                    String textValue = null;
    	               /*      if (value instanceof Integer) {
    	                     int intValue = (Integer) value;
    	                     cell.setCellValue(intValue);
    	                     } else if (value instanceof Float) {
    	                     float fValue = (Float) value;
    	                     textValue = new HSSFRichTextString(
    	                     String.valueOf(fValue));
    	                     cell.setCellValue(textValue);
    	                     } else if (value instanceof Double) {
    	                     double dValue = (Double) value;
    	                     textValue = new HSSFRichTextString(
    	                     String.valueOf(dValue));
    	                     cell.setCellValue(textValue);
    	                     } else if (value instanceof Long) {
    	                     long longValue = (Long) value;
    	                     cell.setCellValue(longValue);
    	                     }*/
    	                    if (value instanceof Boolean)
    	                    {
    	                        boolean bValue = (Boolean) value;
    	                        textValue = "男";
    	                        if (!bValue)
    	                        {
    	                            textValue = "女";
    	                        }
    	                    }
    	                    else if (value instanceof Date)
    	                    {
    	                        Date date = (Date) value;
    	                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    	                        textValue = sdf.format(date);
    	                    }
    	                    else if (value instanceof byte[])
    	                    {
    	                        // 有图片时,设置行高为60px;
    	                        row.setHeightInPoints(60);
    	                        // 设置图片所在列宽度为80px,注意这里单位的一个换算
    	                        sheet.setColumnWidth(i, (short) (35.7 * 80));
    	                        // sheet.autoSizeColumn(i);
    	                        byte[] bsValue = (byte[]) value;
    	                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
    	                                1023, 255, (short) 6, index, (short) 6, index);
    	                        anchor.setAnchorType(2);
    	                        patriarch.createPicture(anchor, workbook.addPicture(
    	                                bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
    	                    }
    	                    else
    	                    {
    	                        // 其它数据类型都当作字符串简单处理
    	                        textValue = value.toString();
    	                    }
    	                    // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
    	                    if (textValue != null)
    	                    {
    	                        Pattern p = Pattern.compile("^//d+(//.//d+)?$");
    	                        Matcher matcher = p.matcher(textValue);
    	                        if (matcher.matches())
    	                        {
    	                            // 是数字当作double处理
    	                            cell.setCellValue(Double.parseDouble(textValue));
    	                        }
    	                        else
    	                        {
    	                            HSSFRichTextString richString = new HSSFRichTextString(
    	                                    textValue);
    	                            HSSFFont font3 = workbook.createFont();
    	                            font3.setColor(HSSFColor.BLUE.index);
    	                            richString.applyFont(font3);
    	                            cell.setCellValue(richString);
    	                        }
    	                    }
    	               
    	            }
    	        }
            
            }catch (SecurityException e){
                e.printStackTrace();
            }catch (NoSuchMethodException e){
                e.printStackTrace();
            }catch (IllegalArgumentException e){
                e.printStackTrace();
            }catch (IllegalAccessException e){
                e.printStackTrace();
            }catch (InvocationTargetException e){
                e.printStackTrace();
            }finally{
                // 清理资源
            }
            
            //生成文件流
            IOExcle(workbook,path);
        	
        }
        
        
        
        
        /**
         * (网络传输)
         * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
         * @param title 表格标题名
         * @param headers 表格属性列名数组
         * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
         * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
         * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
         */
        @SuppressWarnings("unchecked")
        public void exportExcel(String title, String[] headers,Collection<T> dataset, String pattern,HttpServletResponse response){
        	
        	response.reset(); // 清除buffer缓存
            // 指定下载的文件名
            response.setHeader("Content-Disposition", "attachment;filename=contacts" + getDateTimeName() + ".xls");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
        	
            // 声明一个工作薄
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 生成一个表格
            HSSFSheet sheet = workbook.createSheet(title);
            // 设置表格默认列宽度为15个字节
            sheet.setDefaultColumnWidth((short) 15);
            // 生成一个样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置这些样式
            style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
            style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 生成一个字体
            HSSFFont font = workbook.createFont();
            font.setColor(HSSFColor.VIOLET.index);
            font.setFontHeightInPoints((short) 12);
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 把字体应用到当前的样式
            style.setFont(font);
            // 生成并设置另一个样式
            HSSFCellStyle style2 = workbook.createCellStyle();
            style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
            style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            // 生成另一个字体
            HSSFFont font2 = workbook.createFont();
            font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            // 把字体应用到当前的样式
            style2.setFont(font2);
    
            // 声明一个画图的顶级管理器
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
            // 定义注释的大小和位置,详见文档
            HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
                    0, 0, 0, (short) 4, 2, (short) 6, 5));
            // 设置注释内容
            comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
            // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
            comment.setAuthor("leno");
    
            
            // 产生表格标题行
            HSSFRow row = sheet.createRow(0);
            for (short i = 0; i < headers.length; i++)
            {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                cell.setCellValue(text);
            }
    
            
            try
            {
    	        // 遍历集合数据,产生数据行
    	        Iterator<T> it = dataset.iterator();
    	        int index = 0;
    	        
    	        while (it.hasNext()){
    	        	
    	            index++;
    	            row = sheet.createRow(index);
    	            T t = (T) it.next();
    	            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
    	            Field[] fields = t.getClass().getDeclaredFields();
    	            for (short i = 0; i < fields.length; i++)
    	            {
    	                HSSFCell cell = row.createCell(i);
    	                cell.setCellStyle(style2);
    	                Field field = fields[i];
    	                String fieldName = field.getName();
    	                String getMethodName = "get"
    	                        + fieldName.substring(0, 1).toUpperCase()
    	                        + fieldName.substring(1);
    	               
    	                    Class tCls = t.getClass();
    	                    Method getMethod = tCls.getMethod(getMethodName,
    	                            new Class[]
    	                            {});
    	                    Object value = getMethod.invoke(t, new Object[]
    	                    {});
    	                    // 判断值的类型后进行强制类型转换
    	                    String textValue = null;
    	
    	                    if (value instanceof Boolean)
    	                    {
    	                        boolean bValue = (Boolean) value;
    	                        textValue = "男";
    	                        if (!bValue)
    	                        {
    	                            textValue = "女";
    	                        }
    	                    }
    	                    else if (value instanceof Date)
    	                    {
    	                        Date date = (Date) value;
    	                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    	                        textValue = sdf.format(date);
    	                    }
    	                    else if (value instanceof byte[])
    	                    {
    	                        // 有图片时,设置行高为60px;
    	                        row.setHeightInPoints(60);
    	                        // 设置图片所在列宽度为80px,注意这里单位的一个换算
    	                        sheet.setColumnWidth(i, (short) (35.7 * 80));
    	                        // sheet.autoSizeColumn(i);
    	                        byte[] bsValue = (byte[]) value;
    	                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
    	                                1023, 255, (short) 6, index, (short) 6, index);
    	                        anchor.setAnchorType(2);
    	                        patriarch.createPicture(anchor, workbook.addPicture(
    	                                bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
    	                    }
    	                    else
    	                    {
    	                        // 其它数据类型都当作字符串简单处理
    	                        textValue = value.toString();
    	                    }
    	                    // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
    	                    if (textValue != null)
    	                    {
    	                        Pattern p = Pattern.compile("^//d+(//.//d+)?$");
    	                        Matcher matcher = p.matcher(textValue);
    	                        if (matcher.matches())
    	                        {
    	                            // 是数字当作double处理
    	                            cell.setCellValue(Double.parseDouble(textValue));
    	                        }
    	                        else
    	                        {
    	                            HSSFRichTextString richString = new HSSFRichTextString(
    	                                    textValue);
    	                            HSSFFont font3 = workbook.createFont();
    	                            font3.setColor(HSSFColor.BLUE.index);
    	                            richString.applyFont(font3);
    	                            cell.setCellValue(richString);
    	                        }
    	                    }
    	               
    	            }
    	            
    	            
    	        }//while
            
            
            }catch (SecurityException e){
                e.printStackTrace();
            }catch (NoSuchMethodException e){
                e.printStackTrace();
            }catch(IllegalArgumentException e) {
                e.printStackTrace();
            }catch (IllegalAccessException e){
                e.printStackTrace();
            }catch (InvocationTargetException e){
                e.printStackTrace();
            }finally{
                // 清理资源
            }
            
            
            
            //生成文件流
            HTTPExcle(workbook,response);
           
        }
        
        
        
        
        
        
        
    
        /**
         * (网络传输)集合
         * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
         * @param title 表格标题名
         * @param headers 表格属性列名数组
         * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
         * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
         * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
         */
        @SuppressWarnings("unchecked")
        public void exportExcel(String title, String[] headers,List<List<Object>> dataset, String pattern,HttpServletResponse response){
        	
        	response.reset(); // 清除buffer缓存
            // 指定下载的文件名
            response.setHeader("Content-Disposition", "attachment;filename=contacts" + getDateTimeName() + ".xls");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
        	
            // 声明一个工作薄
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 生成一个表格
            HSSFSheet sheet = workbook.createSheet(title);
            // 设置表格默认列宽度为15个字节
            sheet.setDefaultColumnWidth((short) 15);
            // 生成一个样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置这些样式
            style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
            style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 生成一个字体
            HSSFFont font = workbook.createFont();
            font.setColor(HSSFColor.VIOLET.index);
            font.setFontHeightInPoints((short) 12);
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 把字体应用到当前的样式
            style.setFont(font);
            // 生成并设置另一个样式
            HSSFCellStyle style2 = workbook.createCellStyle();
            style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
            style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            // 生成另一个字体
            HSSFFont font2 = workbook.createFont();
            font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            // 把字体应用到当前的样式
            style2.setFont(font2);
    
            // 声明一个画图的顶级管理器
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
            // 定义注释的大小和位置,详见文档
            HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
                    0, 0, 0, (short) 4, 2, (short) 6, 5));
            // 设置注释内容
            comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
            // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
            comment.setAuthor("leno");
    
            
            // 产生表格标题行
            HSSFRow row = sheet.createRow(0);
            for (short i = 0; i < headers.length; i++)
            {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                cell.setCellValue(text);
            }
    
            
            
            try {
        	  
    	    	for (int i = 0; i < dataset.size(); i++) {
    	    		//创建外层集合行
    	    		HSSFRow createRow = sheet.createRow(i+1);
    	    		for (int j = 0; j < dataset.get(i).size(); j++) {
    	    			createRow.createCell(j).setCellValue(dataset.get(i).get(j).toString());;
    				}
    			}
    	    	
            }catch (Exception e){
                e.printStackTrace();
            }finally{
                // 清理资源
            }
            
            
            
            //生成文件流
            HTTPExcle(workbook,response);
           
        }
        
        
        
        
        /**
         * (网络传输)集合Map
         * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
         * @param title 表格标题名
         * @param headers 表格属性列名数组
         * @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
         * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
         * @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
         */
        @SuppressWarnings("unchecked")
        public void exportExcel(String title, String[] headers,List<Map<String, Object>> dataset, String pattern,HttpServletResponse response,String name){
        	
        	response.reset(); // 清除buffer缓存
            // 指定下载的文件名
            response.setHeader("Content-Disposition", "attachment;filename=contacts" + getDateTimeName() + ".xls");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", 0);
        	
            // 声明一个工作薄
            HSSFWorkbook workbook = new HSSFWorkbook();
            // 生成一个表格
            HSSFSheet sheet = workbook.createSheet(title);
            // 设置表格默认列宽度为15个字节
            sheet.setDefaultColumnWidth((short) 15);
            // 生成一个样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置这些样式
            style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
            style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 生成一个字体
            HSSFFont font = workbook.createFont();
            font.setColor(HSSFColor.VIOLET.index);
            font.setFontHeightInPoints((short) 12);
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            // 把字体应用到当前的样式
            style.setFont(font);
            // 生成并设置另一个样式
            HSSFCellStyle style2 = workbook.createCellStyle();
            style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
            style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
            style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            // 生成另一个字体
            HSSFFont font2 = workbook.createFont();
            font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            // 把字体应用到当前的样式
            style2.setFont(font2);
    
            // 声明一个画图的顶级管理器
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
            // 定义注释的大小和位置,详见文档
            HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
                    0, 0, 0, (short) 4, 2, (short) 6, 5));
            // 设置注释内容
            comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
            // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
            comment.setAuthor("leno");
    
            
            // 产生表格标题行
            HSSFRow row = sheet.createRow(0);
            for (short i = 0; i < headers.length; i++)
            {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                cell.setCellValue(text);
            }
    
            
            
            try {
            	dataset = nullToEmpty(dataset);
    	    	for (int i = 0; i < dataset.size(); i++) {
    	    		//创建外层集合行
    	    		HSSFRow createRow = sheet.createRow((i+1));
    	    		 //第一種  
    	            Set<String> set = dataset.get(i).keySet(); //取出所有的key值
    	            Iterator<String> it = set.iterator();
    	            
    	            int j = 0;
    	            while(it.hasNext()) {
    	            /*	String str = null;
    	            	if(it.next()!=null&&dataset.get(i)!=null&&dataset.get(i).get(it.next())!=null) {
    	            		System.out.println("----------------------------");
    	            		System.out.println(it.next());
    	            		System.out.println(dataset.get(i).get(it.next()));
    	            		str = dataset.get(i).get(it.next()).toString();
    	            		
    	            		
    	            	}*/
    	            	Object value = dataset.get(i).get(it.next());
    	            	String textValue = null;
    	            	if (value instanceof Boolean){
                            boolean bValue = (Boolean) value;
                            textValue = "男";
                            if (!bValue)
                            {
                                textValue = "女";
                            }
                        }else if (value instanceof Date){
                            Date date = (Date) value;
                            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                            textValue = sdf.format(date);
                        }else if (value instanceof byte[]){
                            // 有图片时,设置行高为60px;
                            row.setHeightInPoints(60);
                            // 设置图片所在列宽度为80px,注意这里单位的一个换算
                            sheet.setColumnWidth(i, (short) (35.7 * 80));
                            // sheet.autoSizeColumn(i);
                            byte[] bsValue = (byte[]) value;
                            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
                                    1023, 255, (short) 6, (i+1), (short) 6, (i+1));
                            anchor.setAnchorType(2);
                            patriarch.createPicture(anchor, workbook.addPicture(
                                    bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
                        }else{
                            // 其它数据类型都当作字符串简单处理
                            textValue = value.toString();
                        }
    	            	
    	            	
    	            	/*if(str!=null) {
    	            		
    	            	}else {
    	            		createRow.createCell(j).setCellValue("");//取出元素
    	            	}
    	            	*/
    	            	
    	            	 // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
                        if (textValue != null)
                        {
                            Pattern p = Pattern.compile("^//d+(//.//d+)?$");
                            Matcher matcher = p.matcher(textValue);
                            if (matcher.matches())
                            {
                                // 是数字当作double处理
                                createRow.createCell(j).setCellValue(Double.parseDouble(textValue));//取出元素
                            }
                            else
                            {
                                HSSFRichTextString richString = new HSSFRichTextString(
                                        textValue);
                                HSSFFont font3 = workbook.createFont();
                                font3.setColor(HSSFColor.BLACK.index);
                                richString.applyFont(font3);
                                createRow.createCell(j).setCellValue(richString);
                            }
                        }
    	            	
    	            	
    	            	
    	            	j++;
    	            }//判断是否有下一个
    			}
    	    	
            }catch (Exception e){
                e.printStackTrace();
            }finally{
                // 清理资源
            }
            
            
            
            //生成文件流
            HTTPExcle(workbook,response);
           
        }
        
        
        
        
        /************************************************************(工具方法)***************************************************************/
        
        
        
        public static void IOExcle(HSSFWorkbook workbook,String path) {
        	
        	OutputStream out = null;
    		try {
    			out = new FileOutputStream(path.replaceAll("\\", "/")+getDateTimeName()+".xls");
    			 workbook.write(out);
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			 try {
    				out.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		};
        	
        }
        
        public static void HTTPExcle(HSSFWorkbook workbook,HttpServletResponse response) {
        	
        	 OutputStream output;
             try {
                 output = response.getOutputStream();
                 BufferedOutputStream bufferedOutPut = new BufferedOutputStream(output);
                 bufferedOutPut.flush();
                 workbook.write(bufferedOutPut);
                 bufferedOutPut.close();
             } catch (Exception e) {
                 e.printStackTrace();
             }
        	
        }
      
        
        
        public static String  getDateTimeName() {
        	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        	String format = sdf.format(new Date());
        	return format;
        }
    
    
        /** 
        * <p>方法名:nullToEmpty</p>
        * <p>功能描述:map的value如果是null处理成空字符串</p>
        */
        public static List<Map<String, Object>> nullToEmpty(List<Map<String, Object>> list) {
    	    if(list !=null && !list.isEmpty()) {
    		    for(Map<String, Object> map : list) {
    			    Set<String> set = map.keySet();
    				    if(set != null && !set.isEmpty()) {
    					    for(String key : set) {
    						    if(map.get(key) == null) {
    						    	map.put(key, "");
    						    }
    					    }
    				    }
    			    }
    		    }
    	    return list;
        }
        
        
    }
    

    使用

    package com.cpic.caf.template.home.controller;
    
    import java.io.BufferedOutputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.math.BigInteger;
    import java.net.URLDecoder;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.cpic.caf.template.home.business.ProtocolAppoint;
    import com.cpic.caf.template.home.entity.OrderEO;
    import com.cpic.caf.template.home.entity.ProtocolParam;
    import com.cpic.caf.template.home.service.OrderService;
    import com.cpic.caf.template.home.util.CommonFunction;
    import com.cpic.caf.template.home.util.ExportExcel;
    import com.cpic.caf.template.home.util.HomeSQLUtil;
    import com.cpic.caf.template.home.util.OrderDSQLUtil;
    import com.cpic.caf.workers.hall.entity.WorkUserEO;
    import com.cpic.caf.workers.hall.entity.WorkersCaseuserEO;
    import com.cpic.caf.workers.hall.service.OmnipotentSqlService;
    import com.cpic.caf.workers.hall.service.WorkersCaseuserService;
    
    /**
     * 订单
     *
     * Title: 喜事码头 Description: 例子 Copyright: Copyright (c) 2018
     * Company:河南意莱享网络科技有限公司
     * 
     * @author changshenghui
     * @version 1.1
     * @Date 2018年6月12日
     */
    @Controller
    public class OrderController {
    
    	Logger logger = LoggerFactory.getLogger(OrderController.class);
    
    	@Autowired
    	OrderService orderService;
    
    	@Autowired
    	private	OmnipotentSqlService omnipotent;
    	
    	@Autowired
    	private WorkersCaseuserService WorkUserEO;
    	
    	
    	
    	
    	
    	/**
    	 * 获得订单信息列表(导出)
    	 * 
    	 * @param model
    	 * @param request
    	 * @param pageRequest
    	 * @return
    	 */
    	@RequestMapping(value = "/getEclise", method = RequestMethod.GET, produces = "application/json")
    	@ResponseBody
    	public void getOrderInfoList(Model model,HttpServletRequest request,HttpSession session,HttpServletResponse response) {
    			
    	        ExportExcel<Map<String, Object>> ex = new ExportExcel<Map<String, Object>>();
    	        
    	        //创建列
    	        String[] headers =
    	        { "主键", "从业者ID", "案例是作品集还是婚礼案例", "案例类型", "标题","案例地址","描述","置顶","删除状态","访问量","收藏量",
    	        "排序","剩余可上传数","婚礼发生时间","创建时间","修改时间"};
    	        
    	        //创建值列
    	    	List<Map<String, Object>> dataset = omnipotent.findsqlByParam("SELECT * FROM  xsmt.ylx_workers_wuorder");
    	    	
                ex.MapExportExcel(headers,dataset,response);
               
                System.out.println("excel导出成功!");
                
             
    		
    	
    	}
    	
    	
    	
    	
    	
    	
    	/**
    	 * 获得订单信息列表
    	 * 
    	 * @param model
    	 * @param request
    	 * @param pageRequest
    	 * @return
    	 */
    	@RequestMapping(value = "/getOrderInfoList", method = RequestMethod.GET, produces = "application/json")
    	@ResponseBody
    	public Map<String, Object> getOrderInfoList(Model model,
    												HttpServletRequest request,
    												HttpSession session,
    												@RequestParam(value="PageIndex",required=false)Integer PageIndex,
    												@RequestParam(value="paramIndex",required=false)Integer paramIndex,
    												@RequestParam(value="start",required=false)Integer start,
    												@RequestParam(value="NO",required=false)String NO,
    												@RequestParam(value="DateParam",required=false)String DateParam,
    												@RequestParam(value="BIZ",required=false)String BIZ
    												) {
    		try {
    			WorkUserEO attribute =(WorkUserEO) session.getAttribute("worker");//获取登录对象
    			Integer WU_id = 1;
    			String NO_ = "";
    			String SQL = null;
    			String SQLCount = null;
    			
    			if(attribute == null) {
    				System.out.println("- 登录对象为空 -");
    			}else {
    				WU_id = attribute.getId();
    			}
    			if(NO!=null) {
    				NO_ = NO;
    			}
    			logger.info("================================="+DateParam+"= 订单查询CYZid:"+WU_id+"  into  getOrderInfoList  ==========================================");
    			Map<String, Object> map = new HashMap<String, Object>();
    			
    			switch (paramIndex) {
    			case 1:
    				//查询全部订单
    				SQL = OrderDSQLUtil.getOrderListByParams(PageIndex,WU_id,null,null,null,null,NO_,DateParam,BIZ);
    				SQLCount = OrderDSQLUtil.getOrderListByCount(PageIndex,WU_id,null,null,null,null,NO_,DateParam,BIZ);
    				System.out.println("查询全部订单:"+SQL);
    				break;
    			case 2:
    				//查询已支付
    				SQL = OrderDSQLUtil.getOrderListByParams(PageIndex,WU_id,1,null,null,null,NO_,DateParam,BIZ);
    				SQLCount = OrderDSQLUtil.getOrderListByCount(PageIndex,WU_id,1,null,null,null,NO_,DateParam,BIZ);
    				System.out.println("查询已支付:"+SQL);
    				break;
    			case 3:
    				//查询待处理
    				SQL = OrderDSQLUtil.getOrderListByParams(PageIndex,WU_id,null,5,null,null,NO_,DateParam,BIZ);
    				SQLCount = OrderDSQLUtil.getOrderListByCount(PageIndex,WU_id,null,5,null,null,NO_,DateParam,BIZ);
    				System.out.println("查询待处理:"+SQL);
    				break;
    			case 4:
    				//查询待已付款
    				SQL = OrderDSQLUtil.getOrderListByParams(PageIndex,WU_id,null,null,1,null,NO_,DateParam,BIZ);
    				SQLCount = OrderDSQLUtil.getOrderListByCount(PageIndex,WU_id,null,null,1,null,NO_,DateParam,BIZ);
    				System.out.println("查询待已付款:"+SQL);
    				break;
    			case 5:
    				//查询已完成
    				SQL = OrderDSQLUtil.getOrderListByParams(PageIndex,WU_id,null,6,null,null,NO_,DateParam,BIZ);
    				SQLCount = OrderDSQLUtil.getOrderListByCount(PageIndex,WU_id,null,6,null,null,NO_,DateParam,BIZ);
    				System.out.println("查询已完成:"+SQL);
    				break;
    			case 6:
    				//查询已取消
    				SQL = OrderDSQLUtil.getOrderListByParams(PageIndex,WU_id,null,null,null,1,NO_,DateParam,BIZ);
    				SQLCount = OrderDSQLUtil.getOrderListByCount(PageIndex,WU_id,null,null,null,1,NO_,DateParam,BIZ);
    				System.out.println("查询已取消:"+SQL);
    				break;
    			default:
    				//查询全部订单
    				SQL = OrderDSQLUtil.getOrderListByParams(PageIndex,WU_id,null,null,null,null,NO_,DateParam,BIZ);
    				SQLCount = OrderDSQLUtil.getOrderListByCount(PageIndex,WU_id,null,null,null,null,NO_,DateParam,BIZ);
    				System.out.println("查询全部订单:"+SQL);
    				break;
    			}
    			
    			// 查询数据
    			List<Map<String, Object>> findsqlByParam = omnipotent.findsqlByParam(SQL);
    			if(start !=null){
    				// 总条数
    				List<Map<String, Object>> findsqlByCount = omnipotent.findsqlByParam(SQLCount);
    				map.put("totalCount", findsqlByCount.get(0).get("count"));
    			}
    			map.put("resultList", findsqlByParam);
    			return map;
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    		
    	}
    
    	
    	
    	/**
    	 * 增加订单信息
    	 * 
    	 * @param model
    	 * @param request
    	 * @param pageRequest
    	 * @return
    	 */
    	@RequestMapping(value = "/jsonAddOrderInfo", method = RequestMethod.POST)
    	@ResponseBody
    	public ProtocolParam addOrderInfo(Model model, HttpServletRequest request,
    			@RequestParam Map<String, Object> pageRequest) {
    		logger.info("======================================== JsonAddOrderInfo==================================");
    		// 获得要添加的字段
    		try {
    			String no = URLDecoder.decode((String) pageRequest.get("no"),
    					"utf-8");// 订单编号
    			String cust_name = URLDecoder.decode(
    					(String) pageRequest.get("custname"), "utf-8");// 客户姓名
    			// 创建实体对象
    			OrderEO order = new OrderEO();
    			// 订单编号
    			if (no != null && !"".equals(no)) {
    				order.setNo(CommonFunction.getRandomOrderNo());
    			}
    			// 客户名称
    			if (cust_name != null && !"".equals(cust_name)) {
    				order.setCust_name(cust_name);
    			}
    			// 生成流水号
    			order.setTrade_no(CommonFunction.GetNewOrderNo(no));
    			// 服务名称
    			order.setService_name("中式");
    			order.setCreation_time(new Date());
    			// 调用方法
    			String str = HomeSQLUtil.homeOrderAddSQL(order);
    			int count = orderService.add(str);
    			// orderService.addOrderInfo(order);
    			if (count > 0) {
    				return ProtocolAppoint.succeed("新增成功", null, null);
    			}
    			return null;
    		} catch (UnsupportedEncodingException e) {
    			return ProtocolAppoint.error("新增失败", null, null);
    		}
    	}
    
    	/**
    	 * 删除
    	 * 
    	 * @param pageRequest
    	 * @return
    	 */
    	@RequestMapping(value = "/JsonDelOrderInfo", method = RequestMethod.POST)
    	@ResponseBody
    	public ProtocolParam delOrderInfo(
    			@RequestParam Map<String, Object> pageRequest) {
    		logger.info("=============================== JsonDelOrderInfo ===============================");
    		try {
    			int id = Integer.parseInt(URLDecoder.decode(
    					(String) pageRequest.get("id"), "utf-8"));
    			String sql = HomeSQLUtil.homeDelOrderInfo(id);
    			int count = orderService.delete(sql);
    			if (count > 0) {
    				return ProtocolAppoint.merry(200, "成功", null, null);
    			}
    			return null;
    		} catch (Exception e) {
    			return ProtocolAppoint.error("失败", null, null);
    		}
    	}
    	
    	@RequestMapping(value="/ModifyOrderInfo",method=RequestMethod.POST)
    	@ResponseBody
    	public ProtocolParam modifyOrderInfo(@RequestParam Map<String, Object> pageRequest){
    		logger.info("============================= ModifyOrderInfo =========================================");
    		try {
    			int id=Integer.parseInt(URLDecoder.decode(
    					(String) pageRequest.get("id"), "utf-8"));
    			OrderEO order=new OrderEO();
    			order.setNo("NO201806201543");
    			order.setCust_name("青青");
    			order.setId(BigInteger.valueOf(id));
    			String sql=HomeSQLUtil.homeModifyOrderInfo(order);
    			int count =orderService.update(sql);
    			if(count>0){
    				return ProtocolAppoint.merry(200, "成功", null, null);
    			}
    			return null;
    		} catch (Exception e) {
    			return ProtocolAppoint.error("失败", null, null);
    		}
    	}
    }
    
    
  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/chengxiaolong/p/10206339.html
Copyright © 2011-2022 走看看