利用apach-poi进行excel多表格导出

首先,介绍一下apach-poi:

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

结构:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
这里我就介绍一下,我主要说HSSF导出excel,因为遇到最多的还是数据导出,特别是非关系数据,进行excel导出特别麻烦,而我们在实际情况下,并不只是单表导出,可能需要对多表进行统计后,在进行导出,这个时候poi的优点就现出来了,当然还有很多像poi这样的插件,建议使用poi,

在这里我需要导入poi所需jar包:

poi-3.10.1-20140818.jar
poi-excelant-3.10.1-20140818.jar
poi-ooxml-3.10.1-20140818.jar
poi-ooxml-schemas-3.10.1-20140818.jar

Export.java范例:

/**
    * 数据导出
    * @param title
    *            表格标题名
    * @param headers
    *            表格属性列名数组
    * @param dataset
    *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
    *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
    * @param pattern
    *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
    */
   public static void exportExcel(HSSFWorkbook workbook, String fileName, int status, String[] headers, 
                                  List<String> rheaders, List<Map<String, Object>> dataset, String pattern) {
      // 生成一个表格
      HSSFSheet sheet = workbook.createSheet(fileName+System.currentTimeMillis());
      // 设置表格默认列宽度为15个字节
      sheet.setDefaultColumnWidth(15);
      // 生成一个样式
      HSSFCellStyle styleTitle = workbook.createCellStyle();
      // 设置这些样式
      styleTitle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
      styleTitle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
      styleTitle.setBorderRight(HSSFCellStyle.BORDER_THIN);
      styleTitle.setBorderTop(HSSFCellStyle.BORDER_THIN);
      styleTitle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      // 生成一个字体
      HSSFFont font = workbook.createFont();
      font.setFontHeightInPoints((short) 12);
      font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
      // 把字体应用到当前的样式
      styleTitle.setFont(font);
     
      
   // 生成一个样式
      //产生表格标题行
      HSSFRow row = sheet.createRow(0);
      for (int i = 0; i < rheaders.size(); i++) {
         HSSFCell cell = row.createCell(i);
         cell.setCellStyle(styleTitle);
         HSSFRichTextString text = new HSSFRichTextString(rheaders.get(i));
         cell.setCellValue(text);
      }
 
      HSSFCellStyle style = workbook.createCellStyle();
      // 设置这些样式
      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);
      //遍历集合数据,产生数据行
      Iterator<Map<String, Object>> it = dataset.iterator();
      int index = 0;
      TreeMap<String, String> tt = InvokeConstant.getInvokeTitle(status);
      while (it.hasNext()) {
         index++;
         row = sheet.createRow(index);
         Map<String, Object> t = it.next();
         for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(style);
            try {
            Object value = t.get(tt.get(headers[i]));
            if(value == null){
            value = "--";
            }
           
            HSSFRichTextString richString = new HSSFRichTextString();
            HSSFFont font3 = workbook.createFont();
            richString.applyFont(font3);
            cell.setCellValue(value.toString());
            } catch (SecurityException e) {
                e.printStackTrace();
            }catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
         }
 
      }
   }

HSSFWorkbook以传参的形式,为了创建多个sheet,在实际情况下,可能单个请求要求导出多个结果集,不能返回多个输出流,这个时候我想的办法就是,excel多sheet的形式导出多个结果集,在遍历结果集之前创建HSSFWorkbook对象,上面实例就是每次创建一个sheet。我们将数据塞完之后,就可以使用workBook.write(out),浏览器直接接收输出流,这个时候我们就完成了excel导出。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章