JAVA之POI导出Excel

POI:Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。

现在用的比较多的都是用POI技术来导出或者导入Excel,最近工作需要使用导出Excel文件,所以学习了一下,总结一下POI导出Excel的使用。
在项目pom.xml中添加坐标

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>

Jakarta POI HSSF API 组件

HSSF用于操作Excel的组件对象,常用对象:

  1. 常用组件:
    • HSSFWorkBook -----excel的文档对象
    • HSSFSheet -----excel表单
    • HSSFRow -----excel的行
    • HSSFCell -----excel的格子单元(列)
    • HSSFFont -----excel的字体
    • HSFFDataFormat -----日期格式
    • HSSFHeader ------sheet头
    • HSSFFooter -----sheet尾
  2. 样式:
    • HSSFCellStype -----cell的样式

基本操作步骤

首先一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成,那么使用顺序:

  1. 用HSSFWorkbook创建一个Excel文件对象
  2. 用HSSFWorkbook对象创建一个Sheet对象
  3. 用Sheet对象创建行对象(row),用行对象得到cell对象(列)
  4. 对cell对象进行读或写操作。
  5. 将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面

代码演示:

public class ExportExcelUtil {

    /**
    *@Author:hyg
    *@Description:导出excel
    *@Date:15:06 2020/8/12
    *@param: sheetName sheet名称
     *@param: title 标题
     *@param: values 内容
     *@param: wb HSSFWorkbook对象
    *@return:
    */
    public static HSSFWorkbook getHSSFWorkbook(String sheetName,String[] title,String[][] values,HSSFWorkbook wb){
        //第一步,创建一个HSSFWorkbook,对应一个Excel文件
        if (wb==null){
            wb=new HSSFWorkbook();
        }
        //第二步 在workbook中添加一个sheet,对应Excel文件中得sheet
        HSSFSheet sheet=wb.createSheet(sheetName);

        //第三步,在sheet中添加表头第0 行

        HSSFRow row=sheet.createRow(0);

        //第四步,创建单元格,设置表头居中
        HSSFCellStyle stype=wb.createCellStyle();
        stype.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        //生命列对象
        HSSFCell cell=null;

        //创建标题
        for (int i=0;i<title.length;i++){
            cell=row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(stype);
        }
        //创建内容
        for (int i=0;i<values.length;i++){
            row=sheet.createRow(i+1);
            for (int j=0;j<values[i].length;j++){
                //将内容赋值到列中
                row.createCell(j).setCellValue(values[i][j]);
            }
        }
        return wb;

    }
    public static void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            fileName = new String(fileName.getBytes(), "UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName, "UTF-8"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void exportExcel( HttpServletResponse response,String sheetName, String filename,String[] title,String[][] content) {
        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
        try {
            // 响应到客户端
            ExcelUtil.setResponseHeader(response, filename);
            OutputStream os = response.getOutputStream();
            wb.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

工具类做好后,在业务层进行数据的处理。

service层
List<YggzgwListVO> list=workPostApplyShMapper.selectWorkPostApplyList(query,dw,type,xnxq);
        String[] title=new String[]{"岗位名称","设岗导师","所需人数","年级","应聘条件及其要求","学期工作量","计酬标准","学期津贴总额","备注"};
        int point=list.size();
        String filename = "工作岗位汇总.xls";
        String sheetName = "sheet";
        String[][] content = new String[point+1][title.length];
        int num = 0;
        for (YggzgwListVO yggzgwListVO:list){
            content[num][0]=yggzgwListVO.getGwmc();
            content[num][1]=yggzgwListVO.getDsxm();
            content[num][2]=String.valueOf(yggzgwListVO.getRs()) ;
            content[num][3]=yggzgwListVO.getNj();
            content[num][4]=yggzgwListVO.getTj();
            content[num][5]=yggzgwListVO.getXqgzl();
            content[num][6]=String.valueOf(yggzgwListVO.getJcbz());
            content[num][7]=yggzgwListVO.getXqjtz().toString();
            content[num][8]=yggzgwListVO.getBz();
            num++;
        }
        //导出
        ExcelUtil.exportExcel(response,sheetName,filename,title,content);

样式的设置

1. 单元格合并
使用HSSFSheet的addMergedRegion()方法

public int addMergedRegion(CellRangeAddress region)

参数CellRangeAddress 表示合并的区域,构造方法:

CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)

参数依次表示:起始行,截至行,起始列,截至列。
2. 单元格样式

  • 设置单元格的行高、列宽

HSSFSheet sheet=wb.createSheet();

sheet.setDefaultRowHeightInPoints(10);//设置缺省列高sheet.setDefaultColumnWidth(20);//设置缺省列宽
//设置指定列的列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之
sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);

3. 单元格样式
首先创建:HSSFCellStyle

HSSFCellStyle cellStyle=wkb.createCellStyle()

操作:

cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中

设置单元格的填充方式,以及前景颜色和背景颜色
提示:

  • 如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;

  • 如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;

  • 前景颜色不是字体颜色。

//填充方式
cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
//设置前景色
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
//设置背景颜色
cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);

// 设置单元格底部的边框及其样式和颜色
// 这里仅设置了底边边框,左边框、右边框和顶边框同理可设,关于参数自己可以尝试
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);

//设置日期型数据的显示样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));

重要的一步

将样式应用于单元格,注意有些样式只对单元格起作用

cell.setCellStyle(cellStyle);
row.setRowStyle(cellStyle);

设置字体样式

  1. 创建HSSFFont对象,需要先创建HSSFWorkbook对象

HSSFFont fontStyle = wb.createFont();

字体的各种样式

//设置字体样式
fontStyle.setFontName("宋体");
//设置字体高度
fontStyle.setFontHeightInPoints((short)20);
//设置字体颜色
font.setColor(HSSFColor.BLUE.index);
//设置粗体
fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置斜体
font.setItalic(true);
//设置下划线
font.setUnderline(HSSFFont.U_SINGLE);

一样,设置号样式需要手动将它应用到单元格
因为字体也是单元格格式的一部分,所以从属于HSSFCellStyle,需要将它赋值到HSSFCellStyle的对象里。

// 将字体对象赋值给单元格样式对象
cellStyle.setFont(font);
// 将单元格样式应用于单元格
cell.setCellStyle(cellStyle);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345