首页 > 代码库 > 导出Excel表格

导出Excel表格

/**
     * 导出验证用户的操作日志的表格
     *
     * @throws Exception
     */
    public static void exportWeChatUserLogs(String searchCriteria) {
        // 根据需求生成excel表格
        HSSFWorkbook wb = createHSSFWorkbook(searchCriteria);
        // 第六步,将文件存到指定位置

        // 设置对话框的风格
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 选择目录
        JFileChooser chooser = new JFileChooser();

        Date dt = new Date();// 如果不需要格式,可直接用dt,dt就是当前系统时间
        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssS");// 设置显示格式
        String nowTime = "";
        nowTime = df.format(dt);
        // 设置默认的保存文件的文件名:当前时间.xls格式
        chooser.setSelectedFile(new File(nowTime + ".xls"));
        // 设置保存对话框的各种样式属性
        chooser.setDialogTitle(Messages.get("save_file"));
        chooser.setApproveButtonText(Messages.get("save"));
        chooser.setApproveButtonToolTipText(Messages.get("save"));
        chooser.setFocusable(true);
        chooser.setToolTipText(Messages.get("save_file"));
        chooser.setDragEnabled(true);// 设置 dragEnabled 属性,要在此组件上启用自动拖动处理(drag 和
                                        // drop 的第一部分),此属性必须为 true
        chooser.setFileFilter(new FileNameExtensionFilter("Excel", new String[] { ".xls"}));

        int result = chooser.showOpenDialog(null);
        switch (result) {
        case JFileChooser.APPROVE_OPTION:
            // 这一种方法是把用户输入的作为保存的文件名
            String filePath = chooser.getCurrentDirectory() + File.separator + chooser.getSelectedFile().getName() + ".xls";
            try {
                // 输出文件流
                FileOutputStream fout = new FileOutputStream(filePath);
                wb.write(fout);
                fout.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 关闭对话框,跳转到微信用户操作日志展示的页面
            weChatUserStatisticalLogs(0, searchCriteria);
            break;
        case JFileChooser.CANCEL_OPTION:
            // 选择取消按钮,直接跳到微信用户操作日志展示的页面
            weChatUserStatisticalLogs(0, searchCriteria);
        case JFileChooser.ERROR_OPTION:
            // 出错时,直接跳到微信用户操作日志展示的页面
            weChatUserStatisticalLogs(0, searchCriteria);
            break;
        default:
            break;
        }

    }

    /**
     * 返回生成的excel表格HSSFWorkbook对象
     *
     * @param searchCriteria
     * @return
     */
    public static HSSFWorkbook createHSSFWorkbook(String searchCriteria) {
        // 第一步,创建一个webbook,对应一个Excel文件
        HSSFWorkbook wb = new HSSFWorkbook();
        // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(Messages.get("wechatuser_log_statistical_table"));
        // 创建单元格样式
        HSSFCellStyle cellStyle = wb.createCellStyle();

        // 指定单元格居中对齐
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        // 指定单元格垂直居中对齐
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        // 指定当单元格内容显示不下时自动换行
        cellStyle.setWrapText(true);

        // 第四步,创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

        // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short:所有用户的日志的合计
        HSSFRow rowAllCount = sheet.createRow((int) 0);
        // 第一行的第一列
        HSSFCell cell = rowAllCount.createCell(0);
        cell.setCellValue(new HSSFRichTextString(Messages.get("total_statistical_num")));
        cell.setCellStyle(style);
        // 第一行的第二列
        cell = rowAllCount.createCell(1);
        cell.setCellValue(new HSSFRichTextString(Messages.get("addtask_num_all")));
        cell.setCellStyle(style);
        // 第一行的第三列
        cell = rowAllCount.createCell(2);
        cell.setCellValue(new HSSFRichTextString(Messages.get("transtask_num_all")));
        cell.setCellStyle(style);
        // 第一行的第四列
        cell = rowAllCount.createCell(3);
        cell.setCellValue(new HSSFRichTextString(Messages.get("submit_num_all")));
        cell.setCellStyle(style);
        // 第一行的第五列
        cell = rowAllCount.createCell(4);
        cell.setCellValue(new HSSFRichTextString(Messages.get("reject_num_all")));
        cell.setCellStyle(style);

        // 第二行:各类型的所有统计数
        HSSFRow rowAllCountNum = sheet.createRow((int) 1);
        Map<String, Long> countMap = WeChatUserStatisticalBean.countSatisticNum();
        rowAllCountNum.createCell(0).setCellValue(new HSSFRichTextString(Messages.get("statistical_string")));// 第二行第一列
        rowAllCountNum.createCell(1).setCellValue(countMap.get("addTaskAllNum"));// 第二行第一列
        rowAllCountNum.createCell(2).setCellValue(countMap.get("transTaskAllNum"));// 第二行第二列
        rowAllCountNum.createCell(3).setCellValue(countMap.get("submitAllNum"));// 第二行第三列
        rowAllCountNum.createCell(4).setCellValue(countMap.get("rejectAllNum"));// 第二行第三列

        // 第三行:各类型合计的统计数
        HSSFRow rowType = sheet.createRow((int) 2);
        cell = rowType.createCell(0);

        // 判断导出的是哪种类查询条件的统计数据
        if (!"".equals(searchCriteria) && searchCriteria != null && "approvalType".equals(searchCriteria)) {
            // 导出的是根据审批类型进行查询的统计数据
            cell.setCellValue(new HSSFRichTextString(Messages.get("all_approval_type")));// 第三行第一列
        } else {
            // 导出的是根据用户名查询的统计数据
            cell.setCellValue(new HSSFRichTextString(Messages.get("username")));// 第三行第一列
        }

        cell = rowType.createCell(1);

        cell.setCellValue(new HSSFRichTextString(Messages.get("addtask_num")));// 第三行第二列
        cell.setCellStyle(style);
        cell = rowType.createCell(2);
        cell.setCellValue(new HSSFRichTextString(Messages.get("transtask_num")));// 第三行第三列
        cell.setCellStyle(style);
        cell = rowType.createCell(3);
        cell.setCellValue(new HSSFRichTextString(Messages.get("submit_num")));// 第三行第四列
        cell.setCellStyle(style);
        cell = rowType.createCell(4);
        cell.setCellValue(new HSSFRichTextString(Messages.get("reject_num")));// 第三行第五列
        cell.setCellStyle(style);

        // 第五步,写入实体数据 实际应用中这些数据从数据库得到,

        // 根据条件查询的所有WeChatUserStatisticalBean对象的集合
        List<WeChatUserStatisticalBean> weChatUserStatisticalBeans = new ArrayList<WeChatUserStatisticalBean>();
        // 判断是哪种搜索条件下的excel表格的生成
        if (!"".equals(searchCriteria) && searchCriteria != null && "approvalType".equals(searchCriteria)) {
            // 导出的是根据审批类型进行查询的统计数据
            weChatUserStatisticalBeans = WeChatUserStatisticalBean.getWeChatUserApprovalTypeStatistic(searchCriteria);
        } else {
            // 导出的是根据用户名查询的统计数据
            // 查询所有的微信操作日志的不同名的操作者
            String sqlStr = Const.SQL_LOG_OPERATORS;
            Query query = Log.em().createNativeQuery(sqlStr);
            List<String> operators = query.getResultList();
            for (String operator : operators) {
                // 根据操作者查询日志统计对象WeChatUserStatisticalBean
                WeChatUserStatisticalBean weChatUserStatisticalBean = WeChatUserStatisticalBean.initWeChatUserStatisticalBean(operator);
                // 将对象存入集合中
                weChatUserStatisticalBeans.add(weChatUserStatisticalBean);
            }
        }
        for (int i = 0; i < weChatUserStatisticalBeans.size(); i++) {
            // 第四步,创建单元格,并设置值
            HSSFRow rowNum = sheet.createRow((int) 2 + i + 1);
            rowNum.createCell(0).setCellValue(weChatUserStatisticalBeans.get(i).realname);
            rowNum.createCell(1).setCellValue(weChatUserStatisticalBeans.get(i).addTaskNum);
            rowNum.createCell(2).setCellValue(weChatUserStatisticalBeans.get(i).transTaskNum);
            rowNum.createCell(3).setCellValue(weChatUserStatisticalBeans.get(i).submitNum);
            rowNum.createCell(4).setCellValue(weChatUserStatisticalBeans.get(i).rejectNum);
        }
        return wb;
    }

导出Excel表格