zoukankan      html  css  js  c++  java
  • util之ExportExcelUtil (excel导出工具类 poi 4.0.1)

     简洁版

    package com.xxx.xxx.platform.util;
    
    import java.io.OutputStream;
    import javax.servlet.http.HttpServletRequest;
    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.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    
    /**
     * excel导出工具类 poi 4.0.1
     */
    public class ExportExcelUtil {
    
        /**
         * @param request
         * @param response
         * @param wb
         * @param fileName 自定义导出的文件取名(导出后文件名叫什么)
         * @throws Exception
         *   调用后浏览器自动生成excel
         */
        public static void exportExcel(HttpServletRequest request, HttpServletResponse response, HSSFWorkbook wb, String fileName) throws Exception {
    
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("GB2312"), "8859_1"));
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
            OutputStream out = response.getOutputStream();
            wb.write(out);
            out.flush();
            out.close();
        }
    
        /**
         *
         * @param title 标题
         * 
         * @param headers 表头 
         * 使用方法: String[] headers = {"序号","单位","机组","容量","开始","结束","工期","类型","发电类型"}; 
         *  
         * @param values 表中元素
         * 使用方法:
         *      String[][] values = new String[query.size()][headers.length];
         *   for (int i = 0; i < query.size(); i++) {
         *       Jzjxjh e = query.get(i);
         *       values[i][0]=e.getXh()+"";
         *       values[i][1]=e.getDw();
         *       values[i][2]=e.getJz();
         *       values[i][3]=e.getRl()+"";
         *       values[i][4]=sdf.format(e.getKs());
         *   }
         * 
         * @param columnWidth 每一列的宽度
         * 使用方法:  转入null 或者     int[] columnWidth={18,18,18,18,20,20,18,18,18};
         * 
         * @return 返回 HSSFWorkbook  wb
         */
        public static HSSFWorkbook getHSSFWorkbook(String title, String headers[], String[][] values,Integer[] columnWidth) throws Exception {
    
            // 创建一个HSSFWorkbook,对应一个Excel文件
            HSSFWorkbook wb = new HSSFWorkbook();
    
            // 在workbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet(title);
            
            // 创建标题合并行
            sheet.addMergedRegion(new CellRangeAddress(0, (short) 0, 0, (short) headers.length - 1));
    
            HSSFCellStyle style = getTitleStyle(wb);
            // 设置标题字体
            Font titleFont = getTitleFont(wb);
            //设置粗体
    //        titleFont.setBold(true);
            style.setFont(titleFont);
    
            // 设置表内容样式
            // 创建单元格,并设置值表头 设置表头居中
            HSSFCellStyle style1 = getContextStyle(wb);
    
            // 产生标题行
            HSSFRow hssfRow = sheet.createRow(0);
            HSSFCell cell = hssfRow.createCell(0);
            cell.setCellValue(title);
            cell.setCellStyle(style);
    
    
            
            // 产生表头
            HSSFCellStyle hssfCellStyle = getHeadStyle(wb);
            HSSFRow row1 = sheet.createRow(1);
            for (int i = 0; i < headers.length; i++) {
                HSSFCell hssfCell = row1.createCell(i);
                hssfCell.setCellValue(headers[i]);
                hssfCell.setCellStyle(hssfCellStyle);
            }
            //自适应列宽度(实际效果并不理想)
    //        sheet.autoSizeColumn(1);
    
            //设置表头宽度
            if(columnWidth!=null&&columnWidth.length>0){
                for(int i =0;i<columnWidth.length;i++){
                      sheet.setColumnWidth(i, columnWidth[i]*256);
                }
            }
            
            // 创建内容
            for (int i = 0; i < values.length; i++) {
                row1 = sheet.createRow(i + 2);
                for (int j = 0; j < values[i].length; j++) {
                    // 将内容按顺序赋给对应列对象
                    HSSFCell hssfCell = row1.createCell(j);
                    hssfCell.setCellValue(values[i][j]);
                    hssfCell.setCellStyle(style1);
                }
            }
            return wb;
        }
    
        /**
         * @param wb
         * @return 设置表内容样式 创建单元格,并设置值表头 设置表头居中
         */
        private static HSSFCellStyle getContextStyle(HSSFWorkbook wb) throws Exception {
            HSSFCellStyle style1 = wb.createCellStyle();
            style1.setBorderBottom(BorderStyle.THIN);
            style1.setBorderLeft(BorderStyle.THIN);
            style1.setBorderRight(BorderStyle.THIN);
            style1.setBorderTop(BorderStyle.THIN);
            return style1;
        }
    
        /**
         * @param wb
         * @return 设置标题字体
         */
        private static Font getTitleFont(HSSFWorkbook wb) throws Exception {
            Font titleFont = wb.createFont();
            titleFont.setFontHeightInPoints((short) 14);
            return titleFont;
        }
    
        /**
         * @param wb
         * @return 设置标题样式
         */
        private static HSSFCellStyle getTitleStyle(HSSFWorkbook wb) throws Exception {
            // 设置标题样式
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER); // 设置居中样式
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            return style;
        }
    
        /**
         * @param wb
         * @return 设置值表头样式 设置表头居中
         */
        private static HSSFCellStyle getHeadStyle(HSSFWorkbook wb) throws Exception {
            // 设置值表头样式 设置表头居中
            HSSFCellStyle hssfCellStyle = wb.createCellStyle();
            hssfCellStyle.setAlignment(HorizontalAlignment.CENTER); // 设置居中样式
            hssfCellStyle.setBorderBottom(BorderStyle.THIN);
            hssfCellStyle.setBorderLeft(BorderStyle.THIN);
            hssfCellStyle.setBorderRight(BorderStyle.THIN);
            hssfCellStyle.setBorderTop(BorderStyle.THIN);
            return hssfCellStyle;
        }
    
    }
    View Code

    优化精进版

    package com.xxx.xxx.platform.util;
    
    import java.io.OutputStream;
    import javax.servlet.http.HttpServletRequest;
    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.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    
    /**
     * excel导出工具类 poi 4.0.1
     */
    public class ExpTest {
    
        /**
         * @param request
         * @param response
         * @param wb
         * @param fileName 自定义导出的文件取名(导出后文件名叫什么)
         * @throws Exception
         *   调用后浏览器自动生成excel
         */
        public static void exportExcel(HttpServletRequest request, HttpServletResponse response, HSSFWorkbook wb, String fileName) throws Exception {
    
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("GB2312"), "8859_1"));
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
            OutputStream out = response.getOutputStream();
            wb.write(out);
            out.flush();
            out.close();
        }
    
        /**
         * @param wb (转入的HSSFWorkbook 如果为空则自动创建)
         * @param needForTitle 是否需要标题 (即第一行是否需要合并作为标题,如果不需要输入false,输入null默认为需要)
         * @param title 标题 (第一行合并的单元格的内容)
         * @param headers 表头  (每一列字段中文说明)
         * 使用方法: 
         * String[] headers = {"序号","单位","机组","容量","开始","结束","工期","类型","发电类型"}; 
         *  
         * @param values 表中元素    ( 二维数组,第一维表示记录数即每一行,第二维表示列 也是java实体类的属性值)
         * 使用方法:
         * (实例化操作可以直接get赋值如下,也可以通过java反射机制)
         *      String[][] values = new String[query.size()][headers.length];
         *   for (int i = 0; i < query.size(); i++) {
         *       Jzjxjh e = query.get(i);
         *       values[i][0]=e.getXh()+"";
         *       values[i][1]=e.getDw();
         *       values[i][2]=e.getJz();
         *       values[i][3]=e.getRl()+"";
         *       values[i][4]=sdf.format(e.getKs());
         *   }
         * 
         * @param columnWidth 每一列的宽度
         * 使用方法:  转入null 或者     int[] columnWidth={18,18,18,18,20,20,18,18,18};
         * 
         * @return 返回 HSSFWorkbook  wb
         */
        public static HSSFWorkbook getHSSFWorkbook(HSSFWorkbook wb,Boolean needForTitle,String title, String headers[], String[][] values,Integer[] columnWidth) throws Exception {
    
            //默认行操作从第一行开始
            int curRow = 0;
            
            if(wb==null){
                // 创建一个HSSFWorkbook,对应一个Excel文件
                 wb = new HSSFWorkbook();
            }
    
            // 在workbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet(title);
            
            if(needForTitle==true||needForTitle==null){
                curRow = createTitle(wb,sheet,curRow,title,headers);
            }
    
            curRow = createHeader(wb, sheet, curRow, headers, columnWidth);
            
            curRow = createContent(wb, sheet, curRow, values);
            
            return wb;
        }
    
        /**
         * @param wb
         * @param sheet
         * @param curRow
         * @param values
         * @return 产生表数据
         * @throws Exception
         */
        private static int createContent(HSSFWorkbook wb, HSSFSheet sheet, int curRow, String[][] values) throws Exception {
            // 创建单元格,内容样式 
            HSSFCellStyle contentStyle = getContextStyle(wb);
    
            // 创建内容
            for (int i = 0; i < values.length; i++) {
                HSSFRow contentRow = sheet.createRow(curRow++);
                for (int j = 0; j < values[i].length; j++) {
                    // 将内容按顺序赋给对应列对象
                    HSSFCell hssfCell = contentRow.createCell(j);
                    hssfCell.setCellValue(values[i][j]);
                    hssfCell.setCellStyle(contentStyle);
                }
            }
            return curRow;
        }
    
        /**
         * @param wb
         * @param sheet
         * @param curRow
         * @param headers
         * @param columnWidth
         * @return 产生表头
         * @throws Exception
         */
        private static int createHeader(HSSFWorkbook wb, HSSFSheet sheet, int curRow, String[] headers, Integer[] columnWidth) throws Exception {
            // 产生表头
            HSSFCellStyle headerStyle = getHeadStyle(wb);
            HSSFRow headerRow = sheet.createRow(curRow++);
            for (int i = 0; i < headers.length; i++) {
                HSSFCell hssfCell = headerRow.createCell(i);
                hssfCell.setCellValue(headers[i]);
                hssfCell.setCellStyle(headerStyle);
            }
            //自适应列宽度(实际效果并不理想)
    //        sheet.autoSizeColumn(1);
    
            //设置表头宽度
            if(columnWidth!=null&&columnWidth.length>0){
                for(int i =0;i<columnWidth.length;i++){
                      sheet.setColumnWidth(i, columnWidth[i]*256);
                }
            }
            return curRow;
        }
    
        /**
         * @param wb
         * @param title
         * @param headers
         * @param curRow
         * @param sheet
         * @return 创建标题行 后 行数据会+1并返回 行数
         * @throws Exception
         */
        private static int createTitle(HSSFWorkbook wb, HSSFSheet sheet, int curRow, String title, String[] headers) throws Exception {
            // 创建标题合并行
            sheet.addMergedRegion(new CellRangeAddress(0, (short) 0, 0, (short) headers.length - 1));
            HSSFCellStyle style = getTitleStyle(wb);
            // 设置标题字体
            Font titleFont = getTitleFont(wb);
            //设置粗体
            // titleFont.setBold(true);
            style.setFont(titleFont);
            
            // 产生标题行
            HSSFRow hssfRow = sheet.createRow(curRow++);
            HSSFCell cell = hssfRow.createCell(0);
            cell.setCellValue(title);
            cell.setCellStyle(style);
            return curRow;
        }
    
        /**
         * @param wb
         * @return 设置表内容样式 创建单元格,并设置值表头 设置表头居中
         */
        private static HSSFCellStyle getContextStyle(HSSFWorkbook wb) throws Exception {
            HSSFCellStyle style1 = wb.createCellStyle();
            style1.setBorderBottom(BorderStyle.THIN);
            style1.setBorderLeft(BorderStyle.THIN);
            style1.setBorderRight(BorderStyle.THIN);
            style1.setBorderTop(BorderStyle.THIN);
            return style1;
        }
    
        /**
         * @param wb
         * @return 设置标题字体
         */
        private static Font getTitleFont(HSSFWorkbook wb) throws Exception {
            Font titleFont = wb.createFont();
            titleFont.setFontHeightInPoints((short) 14);
            return titleFont;
        }
    
        /**
         * @param wb
         * @return 设置标题样式
         */
        private static HSSFCellStyle getTitleStyle(HSSFWorkbook wb) throws Exception {
            // 设置标题样式
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER); // 设置居中样式
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            return style;
        }
    
        /**
         * @param wb
         * @return 设置值表头样式 设置表头居中
         */
        private static HSSFCellStyle getHeadStyle(HSSFWorkbook wb) throws Exception {
            // 设置值表头样式 设置表头居中
            HSSFCellStyle hssfCellStyle = wb.createCellStyle();
            hssfCellStyle.setAlignment(HorizontalAlignment.CENTER); // 设置居中样式
            hssfCellStyle.setBorderBottom(BorderStyle.THIN);
            hssfCellStyle.setBorderLeft(BorderStyle.THIN);
            hssfCellStyle.setBorderRight(BorderStyle.THIN);
            hssfCellStyle.setBorderTop(BorderStyle.THIN);
            return hssfCellStyle;
        }
    
    }
    View Code

    添加一个方法,可以传入cell返回一个string类型值

    //获取单元格各类型值,返回字符串类型
        public static String getCellValueByCell(Cell cell) {
            //判断是否为null或空串
            if (cell == null || cell.toString().trim().equals("")) {
                return "";
            }
            String cellValue = "";
            CellType cellTypeEnum = cell.getCellTypeEnum();
            switch (cellTypeEnum) {
                case NUMERIC: // 数字
                    short format = cell.getCellStyle().getDataFormat();
                    if (DateUtil.isCellDateFormatted(cell)) {
                        SimpleDateFormat sdf;
                        //System.out.println("cell.getCellStyle().getDataFormat()="+cell.getCellStyle().getDataFormat());
                        if (format == 20 || format == 32) {
                            sdf = new SimpleDateFormat("HH:mm");
                        } else if (format == 14 || format == 31 || format == 57 || format == 58) {
                            // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
                            sdf = new SimpleDateFormat("yyyy-MM-dd");
                            double value = cell.getNumericCellValue();
                            Date date = org.apache.poi.ss.usermodel.DateUtil
                                    .getJavaDate(value);
                            cellValue = sdf.format(date);
                        } else {// 日期
                            sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        }
                        try {
                            cellValue = sdf.format(cell.getDateCellValue());// 日期
                        } catch (Exception e) {
                            try {
                                throw new Exception("exception on get date data !".concat(e.toString()));
                            } catch (Exception e1) {
                                e1.printStackTrace();
                            }
                        } finally {
                            sdf = null;
                        }
                    } else {
                        BigDecimal bd = BigDecimal.valueOf(cell.getNumericCellValue());
                        cellValue = bd.toPlainString();// 数值 这种用BigDecimal包装再获取plainString,可以防止获取到科学计数值
                    }
                    break;
                case STRING: // 字符串
                    cellValue = cell.getStringCellValue();
                    break;
                case BOOLEAN: // Boolean
                    cellValue = cell.getBooleanCellValue() + "";
                    break;
                case FORMULA: // 公式
                    cellValue = cell.getCellFormula();
                    break;
                case BLANK: // 空值
                    cellValue = "";
                    break;
                case ERROR: // 故障
                    cellValue = "ERROR VALUE";
                    break;
                default:
                    cellValue = "UNKNOW VALUE";
                    break;
            }
            return cellValue;
        }
    传入cell返回string
  • 相关阅读:
    HDU 3008 DP
    XCode 7 高速切换代码窗体和文档窗体
    软工视频(37~46)-软件管理
    js 实现对ajax请求面向对象的封装
    sgu101Domino
    如何查看Eclipse的数字版的版本(转)
    Java的历史和大事记
    Eclipse使用前准备(转)
    启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!
    如何快速配好java环境变量和查看电脑上安装JDK的版本位数
  • 原文地址:https://www.cnblogs.com/rdchen/p/13998978.html
Copyright © 2011-2022 走看看