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);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值