excel上传(生成导表时间,总条数)

工具类


    /**
     * 
    * @Title: exportExcel
    * @Description: 导出Excel
    * @param response
    * @param fileName 导出Excel 名称
    * @param data  list集合
    * @param titleNames 表格列名 value 数组
    * @param collNames 工作表名称 value 数组
    * @return void 返回类型   
    * @throws
     */
    public static void exportExcel(
            HttpServletResponse response,
            String fileName,
            List<Object> data,
            String[] titleNames,
            String[] collNames){
        Map<String, List<Object>> data1 = new HashMap<String, List<Object>>();
        Map<String, String[]> titleNames1 = new HashMap<String, String[]>();
        Map<String, String[]> collNames1 = new HashMap<String, String[]>();
        data1.put(fileName, data);
        titleNames1.put(fileName, titleNames);
        collNames1.put(fileName, collNames);
        exportExcel(response, fileName, data1, titleNames1, collNames1);
    }
    
    /**
     * 
    * @Title: exportExcel
    * @Description: 导出Excel
    * @param response
    * @param fileName 导出Excel 名称
    * @param data 数据  key 工作表名称 value list集合
    * @param titleNames 表格列名  key 工作表名称 value 数组
    * @param collNames list集合实体名称  key 工作表名称 value 数组
    * @return void 返回类型   
    * @throws
     */
    public static void exportExcel(
            HttpServletResponse response,
            String fileName,
            Map<String, List<Object>> data,
            Map<String, String[]> titleNames,
            Map<String, String[]> collNames){
        OutputStream out = null;  
        try { 
            HSSFWorkbook workbook = new HSSFWorkbook();
            Set<String> keySet = data.keySet();
            Iterator<String> keys = keySet.iterator();
            while(keys.hasNext()){
                String key = keys.next();
                List<Object> arrayList = data.get(key);
                HSSFSheet sheet = workbook.createSheet(key);
                String[] titles = titleNames.get(key);
                int colNum = titles.length;
                int rowNO = 0;
                //1. titleCaption
                createExcelRow(workbook, sheet, rowNO, -1, colNum, fileName); // , 250, "bold", "center"
                //2.
                rowNO++;
                createExcelRow(workbook, sheet, rowNO, 200, colNum,
                "制 表 日 期: " + new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date()), 180, "normal", "right");
                //3.columnTitleHeader
                rowNO++;
                createColumnHeader(workbook,sheet, rowNO, 300, titles);
                //4.数据行     循环创建中间的单元格的各项的值
                rowNO++;
                String colls[] = collNames.get(key); 
                String[][] strings=new String[arrayList.size()][titles.length];
                for (int i=0;i<arrayList.size();i++) {
                    Object t = arrayList.get(i);
                    @SuppressWarnings("unchecked")
                    Class<Object> classT = (Class<Object>) arrayList.get(i).getClass();
                    for(int j=0;j<titles.length;j++){
                        System.out.println("get"+toUpperCaseFirstOne(colls[j]));
                        if(colls[j].contains(".")){
                            String str[] = colls[j].split(".");
                            String packageUrl = classT.getDeclaredField(str[0]).getType().getName();
                            Class<?> packageObj = Class.forName(packageUrl);
                            Object object = packageObj.newInstance();
                            Method method =  packageObj.getMethod("get"+toUpperCaseFirstOne(str[1]));
                            Object value = method.invoke(object, new Object[0]);
                            //if(!ObjectUtils.isEmpty(value))
                                strings[i][j]= value.toString();
//                            else
//                                strings[i][j]= "-";
                        }else{
                            Method method = classT.getMethod("get"+toUpperCaseFirstOne(colls[j]));
                            Object object = method.invoke(t, new Object[0]);
                            //if(!ObjectUtils.isEmpty(object))
                                strings[i][j]= object.toString();
//                            else
//                                strings[i][j]= "-";
                        }
                    }
                }
                sheet = createColumnData(workbook, sheet, rowNO,  strings, arrayList.size()+3);
                createSummaryRow(workbook, sheet, colNum, "行数合计:" + strings.length, 180, "normal", "right");
            }
            fileName = fileName+new SimpleDateFormat("yyyyMMdd").format(new Date());
            out = response.getOutputStream();  
            response.setContentType("application/ms-excel;charset=UTF-8");  
            response.setHeader("Content-disposition", "attachment;filename="+new String(fileName.getBytes("utf-8"), "ISO8859-1" )+".xls");
            workbook.write(out);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }  
        }      
    }
    
    //获取单元格的值  
    public static String getCellValue(Cell cell) {
        String value = "";
        //if(!ObjectUtils.isEmpty(cell)){
            // 以下是判断数据的类型
            switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_NUMERIC:
                    value = cell.getNumericCellValue() + "";
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        Date date = cell.getDateCellValue();
                        if (date != null) {
                            value = new SimpleDateFormat("yyyy-MM-dd").format(date);
                        } else {
                            value = "";
                        }
                    } else {
                        value = new DecimalFormat("0").format(cell.getNumericCellValue());
                    }
                    break;
                case HSSFCell.CELL_TYPE_STRING: // 字符串
                    value = cell.getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                    value = cell.getBooleanCellValue() + "";
                    break;
                case HSSFCell.CELL_TYPE_FORMULA: // 公式
                    value = cell.getCellFormula() + "";
                    break;
                case HSSFCell.CELL_TYPE_BLANK: // 空值
                    value = "";
                    break;
                case HSSFCell.CELL_TYPE_ERROR: // 故障
                    value = "";
                    break;
                default:
                    value = "";
                    break;
            }
        //}
        return value;
    }
    
    
    /**
     * 创建通用的Excel空白行信息
     *
     * @param workbook
     *            如果为空 则没有样式
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param rowHeight
     *            报表的单行行高
     * @param colNum
     *            报表的总列数 (合并)
     */
    public void createExcelRow(HSSFWorkbook workbook, HSSFSheet sheet, int rowNO, int rowHeight, int colNum) {
        createExcelRow(workbook, sheet, rowNO, -1, colNum, null, -1, null, null);
    }

    /**
     * 创建通用的Excel带标题行信息
     *
     * @param workbook
     *            如果为空 则没有样式
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param rowHeight
     *            报表的单行行高
     * @param colNum
     *            报表的总列数 (合并)
     * @param fontCaption
     *            报表行中显示的字符
     */
    public static void createExcelRow(HSSFWorkbook workbook, HSSFSheet sheet, int rowNO, int rowHeight, int colNum,
            String fontCaption) {
        createExcelRow(workbook, sheet, rowNO, -1, colNum, fontCaption, -1, null, null);
    }

    /**
     * 创建通用的Excel行信息
     *
     * @param workbook
     *            如果为空 则没有样式
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param rowHeight
     *            报表的单行行高
     * @param colNum
     *            报表的总列数 (合并)
     * @param fontCaption
     *            报表行中显示的字符
     * @param fontSize
     *            字体的大小 (字体大小 默认 200)
     * @param fontWeight
     *            报表表头显示的字符
     * @param align
     *            字体水平位置 (center中间 right右 left左)
     * @param colNum
     *            报表的列数
     */
    public static void createExcelRow(HSSFWorkbook workbook, HSSFSheet sheet, int rowNO, int rowHeight, int colNum,
            String fontCaption, int fontSize, String fontWeight, String align) {
        if (colNum < 0) {
            colNum = 100;
        }

        HSSFRow row = sheet.createRow(rowNO); // 创建第一行
        row.setHeight((short) (rowHeight < 1 ? 300 : rowHeight)); // 设置行高

        HSSFCell cell = row.createCell(0);// 设置第一行
        cell.setCellType(HSSFCell.ENCODING_UTF_16); // 定义单元格为字符串类型
        cell.setCellValue(new HSSFRichTextString(fontCaption));

        sheet.addMergedRegion(new Region(rowNO, (short) 0, rowNO, (short) (colNum - 1))); // 指定合并区域

        HSSFCellStyle cellStyle = createCellFontStyle(workbook, fontSize, fontWeight, align); // 设定样式
        if (cellStyle != null) {
            cell.setCellStyle(cellStyle);
        }
    }

    /**
     * 设置字体样式 (字体为宋体 ,上下居中对齐,可设置左右对齐,字体粗细,字体大小 )
     *
     * @param workbook
     *            如果为空 则没有样式
     * @param fontSize
     *            字体大小 默认 200
     * @param fontWeight
     *            字体粗细 ( 值为bold 为加粗)
     * @param align
     *            字体水平位置 (center中间 right右 left左)
     */
    public static HSSFCellStyle createCellFontStyle(HSSFWorkbook workbook, int fontSize, String fontWeight, String align) {
        if (workbook == null) {
            return null;
        }

        HSSFCellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
        if (align != null && align.equalsIgnoreCase("left")) {
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 指定单元格居中对齐
        }
        if (align != null && align.equalsIgnoreCase("right")) {
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT); // 指定单元格居中对齐
        }
        if (align != null && align.equalsIgnoreCase("center")) {
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定单元格居中对齐
        }

        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定单元格垂直居中对齐
        cellStyle.setWrapText(true);// 指定单元格自动换行

        // 单元格字体
        HSSFFont font = workbook.createFont();
        if (fontWeight != null && fontWeight.equalsIgnoreCase("normal")) {
            font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        } else {
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        }

        font.setFontName("宋体");
        font.setFontHeight((short) (fontSize < 1 ? 200 : fontSize));
        cellStyle.setFont(font);

        // 设置字体
        // HSSFFont font = workbook.createFont();
        // font.setFontHeightInPoints((short) 20); //字体高度
        // font.setColor(HSSFFont.COLOR_RED); //字体颜色
        // font.setFontName("黑体"); //字体
        // font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //宽度
        // font.setItalic(true); //是否使用斜体
        // font.setStrikeout(true); //是否使用划线
        // // 添加单元格注释
        // // 创建HSSFPatriarch对象,HSSFPatriarch是所有注释的容器.
        // HSSFPatriarch patr = sheet.createDrawingPatriarch();
        // // 定义注释的大小和位置,详见文档
        // HSSFComment comment = patr.createComment(new HSSFClientAnchor(0, 0,
        // 0, 0, (short)4, 2, (short) 6, 5));
        // // 设置注释内容
        // comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
        // // 设置注释作者. 当鼠标移动到单元格上是可以在状态栏中看到该内容.
        // comment.setAuthor("Xuys.");

        return cellStyle;
    }
    /**
     * 设置报表列头
     * 
     * @param workbook
     *
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param rowHeight
     *            报表的单行行高
     * @param columnHeader
     *            报表行中显示的字符
     */
    public  static  void createColumnHeader(HSSFWorkbook workbook,HSSFSheet sheet, int rowNO, int rowHeight, String[] columnHeader) {
        createColumnHeader(workbook,sheet, rowNO, rowHeight, columnHeader, -1, null, null);
    }

    /**
     * 设置报表列头
     *    
     * @param workbook
     *
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param rowHeight
     *            报表的单行行高
     * @param columnHeader
     *            报表行中显示的字符
     * @param fontSize
     *            字体的大小 (字体大小 默认 200)
     */
    public static void createColumnHeader(HSSFWorkbook workbook,HSSFSheet sheet, int rowNO, int rowHeight, String[] columnHeader, int fontSize) {
        createColumnHeader(workbook,sheet, rowNO, rowHeight, columnHeader, fontSize, null, null);
    }

    /**
     * 设置报表列头
     * 
     * @param workbook
     *
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param rowHeight
     *            报表的单行行高
     * @param columnHeader
     *            报表行中显示的字符
     * @param fontSize
     *            字体的大小 (字体大小 默认 200)
     * @param fontWeight
     *            报表表头显示的字符
     * @param align
     *            字体水平位置 (center中间 right右 left左)
     */
    public static void createColumnHeader(HSSFWorkbook workbook,HSSFSheet sheet, int rowNO, int rowHeight, String[] columnHeader, int fontSize,
            String fontWeight, String align) {
        if (columnHeader == null || columnHeader.length < 1) {
            return;
        }
        HSSFRow row = sheet.createRow(rowNO);
        row.setHeight((short) rowHeight);

        HSSFCellStyle cellStyle = createCellFontStyle(workbook, fontSize, fontWeight, align);
        if (cellStyle != null) {
            // 设置单元格背景色
            cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
            cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        }

        HSSFCell cell = null;
        for (int i = 0; i < columnHeader.length; i++) {
            sheet.setColumnWidth(i, 20 * 256); // 设置列宽,20个字符宽度。宽度参数为1/256,故乘以256
            cell = row.createCell(i);
            cell.setCellType(HSSFCell.ENCODING_UTF_16);
            if (cellStyle != null) {
                cell.setCellStyle(cellStyle);
            }
            cell.setCellValue(new HSSFRichTextString(columnHeader[i]));
        }
    }
    /**
     * 创建数据行
     * @param workbook
     *
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param columnData
     *            报表行中显示的数据
     * @param maxValue
     *            Excel显示的最大上限
     */
    public static HSSFSheet createColumnData(HSSFWorkbook workbook,HSSFSheet sheet, int rowNO, String[][] columnData, int maxValue) {
        maxValue = (maxValue < 1 || maxValue > 65535) ? 65535 : maxValue;
        int currRowNO = rowNO;
        for (int numNO = currRowNO; numNO < columnData.length + currRowNO; numNO++) {
            if (numNO % maxValue == 0) {
                sheet = workbook.createSheet();
                rowNO = 0;
            }
            createColumnDataDesc(workbook, sheet, numNO, rowNO, currRowNO, -1, columnData);
            rowNO++;
        }
        return sheet;
    }
    

    /**
     * 创建数据行
     *
     * @param sheet
     *            (创建sheet)
     * @param numNO
     *            序列号
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param currRowNO
     *            初始行号
     * @param rowHeight
     *            报表的单行行高
     * @param columnData
     *            报表行中显示的数据
     */
    private  static  void createColumnDataDesc(HSSFWorkbook workbook,HSSFSheet sheet, int numNO, int rowNO, int currRowNO, int rowHeight,
            String[][] columnData) {
        createColumnDataDesc(workbook,sheet, numNO, rowNO, currRowNO, rowHeight, columnData, -1, null, null);
    }

    /**
     * 创建数据行
     * 
     * @param workbook
     *
     * @param sheet
     *            (创建sheet)
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param rowHeight
     *            报表的单行行高
     * @param columnData
     *            报表行中显示的数据
     * @param fontSize
     *            字体大小 默认 200
     * @param fontWeight
     *            字体粗细 ( 值为bold 为加粗)
     * @param align
     *            字体水平位置 (center中间 right右 left左)
     * @param maxValue
     *            Excel显示的最大上限
     */
    public static  HSSFSheet createColumnData(HSSFWorkbook workbook,HSSFSheet sheet, int rowNO, int rowHeight, String[][] columnData, int fontSize,
            String fontWeight, String align, int maxValue) {
        maxValue = (maxValue < 1 || maxValue > 65535) ? 65535 : maxValue;
        int currRowNO = rowNO;
        for (int numNO = currRowNO; numNO < columnData.length + currRowNO; numNO++) {
            if (numNO % maxValue == 0) {
                sheet = workbook.createSheet();
                rowNO = 0;
            }
            createColumnDataDesc(workbook,sheet, numNO, rowNO, currRowNO, rowHeight, columnData, fontSize, fontWeight, align);
            rowNO++;
        }
        return sheet;
    }

    /**
     * 创建数据行
     *
     * @param workbook
     *
     * @param sheet
     *            (创建sheet)
     * @param numNO
     *            序列号
     * @param rowNO
     *            报表的单行行号(创建第几行)
     * @param currRowNO
     *            初始行号
     * @param rowHeight
     *            报表的单行行高
     * @param columnData
     *            报表行中显示的数据
     * @param fontSize
     *            字体的大小 (字体大小 默认 200)
     * @param fontWeight
     *            报表表头显示的字符
     * @param align
     *            字体水平位置 (center中间 right右 left左)
     */
    @SuppressWarnings("unused")
    private static void createColumnDataDesc(HSSFWorkbook workbook,HSSFSheet sheet, int numNO, int rowNO, int currRowNO, int rowHeight,
            String[][] columnData, int fontSize, String fontWeight, String align) {
        if (columnData == null || columnData.length < 1) {
            // return ;
        }
        HSSFRow row = sheet.createRow(rowNO);
        row.setHeight((short) (rowHeight < 1 ? 300 : rowHeight)); // 设置行高

        HSSFCellStyle cellStyle = null;// createCellFontStyle(workbook,
                                        // fontSize, fontWeight, align);
        if (cellStyle != null) {
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 指定单元格居中对齐
        } else {
            cellStyle = workbook.createCellStyle();
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION); // 指定单元格居中对齐
        }
        HSSFCell cell = null;
        for (int i = 0; i < columnData[numNO - currRowNO].length; i++) {
            sheet.setColumnWidth(i, 20 * 256); // 设置列宽,20个字符宽度。宽度参数为1/256,故乘以256
            cell = row.createCell(i);
            cell.setCellType(HSSFCell.ENCODING_UTF_16);
            if (cellStyle != null) {
                cell.setCellStyle(cellStyle);
            }
            cell.setCellValue(new HSSFRichTextString(columnData[numNO - currRowNO][i]));
        }
    }
    
    /**
     * 创建通用的Excel最后一行的信息 (创建合计行 (最后一行))
     *
     * @param workbook
     *            如果为空 则没有样式
     * @param sheet
     * @param colNum
     *            报表的总列数 (合并)
     * @param fontCaption
     *            报表行中显示的字符
     * @param fontSize
     *            字体的大小 (字体大小 默认 200)
     * @param fontWeight
     *            报表表头显示的字符
     * @param align
     *            字体水平位置 (center中间 right右 left左)
     * @param colNum
     *            报表的列数 (需要合并到的列索引)
     */
    public static void createSummaryRow(HSSFWorkbook workbook, HSSFSheet sheet, int colNum, String fontCaption, int fontSize,
            String fontWeight, String align) {

        HSSFCellStyle cellStyle = createCellFontStyle(workbook, fontSize, fontWeight, align);

        HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));
        HSSFCell sumCell = lastRow.createCell(0);

        sumCell.setCellValue(new HSSFRichTextString(fontCaption));
        if (cellStyle != null) {
            sumCell.setCellStyle(cellStyle);
        }
        sheet.addMergedRegion(
                new Region(sheet.getLastRowNum(), (short) 0, sheet.getLastRowNum(), (short) (colNum - 1)));// 指定合并区域
    }
    
    //首字母转小写
    public static String toLowerCaseFirstOne(String s){
      if(Character.isLowerCase(s.charAt(0)))
        return s;
      else
        return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
    }


    //首字母转大写
    public static String toUpperCaseFirstOne(String s){
      if(Character.isUpperCase(s.charAt(0)))
        return s;
      else
        return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
    }

action调用

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值