Jakarta poi导出excel文件

  1. 简述

    excel导出功能是java常用的功能之一,主要应用于导出数据列表,报表以及特定格式模板等。

    目前常用的Excel的技术有两种Jakarta POIJava Excel

    Jakarta POI是Apache软件基金会的开放源码函式库,它提供API给java程序对microsoft格式档案实现读和写功能。

    5种功能:

    HSSF-读写Microsoft Excel文档功能(应用最广)

    HWPF-读写Microsoft Word文档功能

    HSLF-读写Microsoft PowerPoint文档功能

    HDGF-读写Microsoft Visio文档功能

    XSSF-读写Microsoft EXCEL XML文档功能

  2. HSSF使用
    2.1 引入依赖
      使用HSSF,需要引入apache依赖。若已存在,可忽略。
    1 <dependency>
    2 
    3        <groupId>org.apache.poi</groupId>
    4 
    5        <artifactId>poi</artifactId>
    6 
    7        <version>3.15</version>
    8 
    9 </dependency>


    2.2 HSSF API 组件
      HSSF提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象:

    2.3 生成excel例子
      一个excel文件  →→→    一个workbook(HSSFWorkbook);
      一个workbook  →→→    多个sheet(HSSFSheet);
      一个sheet         →→→    多个row(HSSFRow);
      一个row            →→→    多个cell(HSSFCell);

     1 //创建HSSFWorkbook对象
     2 HSSFWorkbook wb = new HSSFWorkbook();
     3 //创建HSSFSheet对象
     4 HSSFSheet sheet = wb.createSheet("sheet0");
     5 //创建HSSFRow对象
     6 HSSFRow row = sheet.createRow(0);
     7 //创建HSSFCell对象
     8 HSSFCell cell=row.createCell(0);
     9 //设置单元格的值
    10 cell.setCellValue("单元格中的中文");
    11 //输出Excel文件
    12 FileOutputStream output=new FileOutputStream("d:\\workbook.xls");
    13 wkb.write(output);
    14 output.flush();
  3. excel导出案例

    使用HSSF导出简易excel表格。
     1 package com.ytd.ebos.base.db.security;
     2 
     3 import java.io.File;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.OutputStream;
     7 import java.util.ArrayList;
     8 import java.util.HashMap;
     9 import java.util.List;
    10 import java.util.Map;
    11 import java.util.Map.Entry;
    12 
    13 import org.apache.poi.hssf.usermodel.HSSFCell;
    14 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    15 import org.apache.poi.hssf.usermodel.HSSFFont;
    16 import org.apache.poi.hssf.usermodel.HSSFRow;
    17 import org.apache.poi.hssf.usermodel.HSSFSheet;
    18 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    19 import org.apache.poi.hssf.util.HSSFColor;
    20 
    21 public class ExportExceltest {
    22 
    23     public static void main(String[] args) throws IOException {
    24         // 创建输出流
    25         OutputStream out=new FileOutputStream(new File("d://a.xls"));
    26         // 模拟数据
    27         List<Map<String,String>> data=new ArrayList<>();
    28         Map<String,String> map=new HashMap<>();
    29         map.put("姓名", "小文");
    30         map.put("颜值", "帅气");
    31         map.put("财富值", "8");
    32         data.add(map);
    33         Map<String,String> map1=new HashMap<>();
    34         map1.put("姓名", "小静");
    35         map1.put("颜值", "貌美");
    36         map1.put("财富值", "7");
    37         data.add(map1);
    38         // 创建工作表
    39         HSSFWorkbook workbook=new HSSFWorkbook();
    40         exportexcelutil(workbook,0,"花名单",data);
    41         // 写入文件
    42         workbook.write(out);
    43         out.close();
    44     }
    45     /**
    46      * 导出excel工具方法
    47      * @param workbook 工作簿
    48      * @param sheetnum sheet序号
    49      * @param sheetname sheet名称
    50      * @param data 数据
    51      */
    52     public static void exportexcelutil(HSSFWorkbook workbook,int sheetnum,String sheetname,List<Map<String,String>> data){
    53         //创建sheet
    54         HSSFSheet Sheet = workbook.createSheet();
    55         //设置sheet名称
    56         workbook.setSheetName(sheetnum, sheetname);
    57         //设置表格应用样式
    58         HSSFCellStyle style=workbook.createCellStyle();
    59         style.setFillForegroundColor(HSSFColor.GOLD.index);
    60         HSSFFont font=workbook.createFont();
    61         font.setFontName("思源宋体");
    62         font.setColor(HSSFColor.RED.index);
    63         style.setFont(font);
    64         //创建标题行
    65         HSSFRow Row = Sheet.createRow(0);
    66         List<String> head=new ArrayList<>();
    67         for (Entry<String, String> map : data.get(0).entrySet()) {
    68             head.add(map.getKey());
    69         }
    70         for (int i = 0; i < head.size(); i++) {
    71             HSSFCell Cell = Row.createCell(i);
    72             Cell.setCellStyle(style); //应用样式
    73             Cell.setCellValue(head.get(i));
    74         }
    75         // 写入数据
    76         for (int i = 0; i < data.size(); i++) {
    77             Row = Sheet.createRow(i+1);
    78             int k=0;
    79             for (Entry<String, String> map : data.get(i).entrySet()) {
    80                 HSSFCell Cell = Row.createCell(k);
    81                 Cell.setCellValue(map.getValue());
    82                 k++;
    83             }
    84         }
    85     }
    86 
    87 }

    导出excel文件如下:

  4. excel导出工具类
      1 import java.io.ByteArrayOutputStream;
      2 import java.io.IOException;
      3 import java.lang.reflect.Field;
      4 import java.util.List;
      5 import java.util.logging.Level;
      6 import java.util.logging.Logger;
      7 import org.apache.poi.hssf.usermodel.HSSFCell;
      8 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
      9 import org.apache.poi.hssf.usermodel.HSSFFont;
     10 import org.apache.poi.hssf.usermodel.HSSFRow;
     11 import org.apache.poi.hssf.usermodel.HSSFSheet;
     12 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     13 import org.apache.poi.ss.usermodel.VerticalAlignment;
     14 import org.apache.poi.ss.util.CellRangeAddress;
     15 
     16 /**
     17  * 
     18  * @描述 Excel 导出通用工具类
     19  */
     20 public class ExcelUtil {
     21 
     22     public static byte[] export(String sheetTitle, String[] title, List<Object> list) {
     23 
     24         HSSFWorkbook wb = new HSSFWorkbook();//创建excel表
     25         HSSFSheet sheet = wb.createSheet(sheetTitle);
     26         sheet.setDefaultColumnWidth(20);//设置默认行宽
     27 
     28         //表头样式(加粗,水平居中,垂直居中)
     29         HSSFCellStyle cellStyle = wb.createCellStyle();
     30         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
     31         cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
     32         //设置边框样式
     33         cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
     34         cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
     35         cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
     36         cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
     37 
     38         HSSFFont fontStyle = wb.createFont();
     39         fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
     40 
     41         cellStyle.setFont(fontStyle);
     42 
     43         //标题样式(加粗,垂直居中)
     44         HSSFCellStyle cellStyle2 = wb.createCellStyle();
     45         cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
     46         cellStyle2.setFont(fontStyle);
     47 
     48         //设置边框样式
     49         cellStyle2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
     50         cellStyle2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
     51         cellStyle2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
     52         cellStyle2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
     53 
     54         //字段样式(垂直居中)
     55         HSSFCellStyle cellStyle3 = wb.createCellStyle();
     56         cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
     57 
     58         //设置边框样式
     59         cellStyle3.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
     60         cellStyle3.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
     61         cellStyle3.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
     62         cellStyle3.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
     63 
     64         //创建表头
     65         HSSFRow row = sheet.createRow(0);
     66         row.setHeightInPoints(20);//行高
     67         
     68         HSSFCell cell = row.createCell(0);
     69         cell.setCellValue(sheetTitle);
     70         cell.setCellStyle(cellStyle);
     71 
     72         sheet.addMergedRegion(new CellRangeAddress(0,0,0,(title.length-1)));
     73         
     74         //创建标题
     75         HSSFRow rowTitle = sheet.createRow(1);
     76         rowTitle.setHeightInPoints(20);
     77 
     78         HSSFCell hc;
     79         for (int i = 0; i < title.length; i++) {
     80             hc = rowTitle.createCell(i);
     81             hc.setCellValue(title[i]);
     82             hc.setCellStyle(cellStyle2);
     83         }
     84 
     85         byte result[] = null;
     86 
     87         ByteArrayOutputStream out = null;
     88         
     89         try {
     90             //创建表格数据
     91             Field[] fields;
     92             int i = 2;
     93 
     94             for (Object obj : list) {
     95                 fields = obj.getClass().getDeclaredFields();
     96 
     97                 HSSFRow rowBody = sheet.createRow(i);
     98                 rowBody.setHeightInPoints(20);
     99 
    100                 int j = 0;
    101                 for (Field f : fields) {
    102 
    103                     f.setAccessible(true);
    104 
    105                     Object va = f.get(obj);
    106                     if (null == va) {
    107                         va = "";
    108                     }
    109 
    110                     hc = rowBody.createCell(j);
    111                     hc.setCellValue(va.toString());
    112                     hc.setCellStyle(cellStyle3);
    113                     
    114                     j++;
    115                 }
    116 
    117                 i++;
    118             }
    119 
    120             out = new ByteArrayOutputStream();
    121             wb.write(out);
    122             result =  out.toByteArray();
    123         } catch (Exception ex) {
    124             Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
    125         } finally{
    126             try {
    127                 if(null != out){
    128                     out.close();
    129                 }
    130             } catch (IOException ex) {
    131                 Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
    132             } finally{
    133                 try {
    134                     wb.close();
    135                 } catch (IOException ex) {
    136                     Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, ex);
    137                 }
    138             }
    139         }
    140 
    141         return result;
    142     }
    143 }
    View Code

     

  5. 常用操作

    ●合并单元格

    sheet.addMergedRegion(newCellRangeAddress(0, 0, 0, 6)); //起始行,结束行,起始列,终止列(6表示第七列)
    ●单元格居中
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    ●设置自适应列宽
    sheet.autoSizeColumn(0);

  6. 分析
      在使用java做系统功能设计时,有许多数据列表需要添加excel导出功能。该功能使用的技术简单至极,无非引用一个外部API,按照步骤调用相关方法即可,因此许多人不屑于去研究该技术,百度一搜索相关博客满屏都是,随便拷贝一个即可。甚至大部分公司都已封装该功能,使用时按约定调用,节省大量时间。

      然而越简单的技术,实用性却越高,延展性也更强。excel导出也可往细处继续划分,按模板导出,导出花哨样式,导出公式等;只有真正去理解该技术时,才不会被复杂苛刻的需求难倒,万变不离其宗,掌握核心技术。

      入行1年8个月,这是我的第一篇博客,说来惭愧。曾在脑海中写了数十篇博客,并且还使用自己搭建的网站,但到真正写的时候才感觉行动跟不上思维。万事开头难,加油做好每一步,立个flag,今年末完成10篇技术博客。
posted @ 2020-11-16 14:06  小康kavin  阅读(381)  评论(0编辑  收藏  举报