POI的 HSSFWorkbook 操作

时间:2020-7-30 作者:admin


POI的 HSSFWorkbook 操作(Web应用)

一、介绍

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

二、环境配置

1、maven环境

本案例是在SpringBoot环境下完成的,maven配置如下。

      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> 
    </parent>
    
    	<dependencies>
    	 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--Excel解析-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        </dependencies>
2、Jakarta POI HSSF API组件
常用组件:

HSSFWorkbook                      excel的文档对象

HSSFSheet                         excel的表单

HSSFRow                           excel的行

HSSFCell                          excel的格子单元

HSSFFont                          excel字体

HSSFDataFormat                    日期格式

HSSFHeader                        sheet头

HSSFFooter                        sheet尾(只有打印的时候才能看到效果)

样式:

HSSFCellStyle                       cell样式

辅助操作包括:

HSSFDateUtil                        日期

HSSFPrintSetup                      打印

HSSFErrorConstants                  错误信息表
3、基本操作步骤

一个Excel的文件的组成,一个Excel文件对应一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

基本操作步骤:

1、用HSSFWorkbook打开或者创建“Excel文件对象”

2、用HSSFWorkbook对象返回或者创建Sheet对象

3、用Sheet对象返回行对象,用行对象得到Cell对象

4、对Cell对象读写。

这里举出一个下载Excel文件的简单例子(这里直接写到Controller层)

@RequestMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) {
        //创建HSSFWorkbook对象
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建HSSFSheet对象
        HSSFSheet sheet = wb.createSheet("sheet0");
        //创建HSSFRow对象
        HSSFRow row = sheet.createRow(0);
        //创建HSSFCell对象
        HSSFCell cell = row.createCell(0);
        //设置单元格的值
        cell.setCellValue("单元格");
        //发送到客户端的响应的内容类型
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        try {
            OutputStream os = response.getOutputStream();
            //下载中文文件名的做法
//            String fileName = URLEncoder.encode("下载Excel", "UTF-8");
//            response.setHeader("Content-disposition","attachment;filename="+fileName+".xls");
            response.setHeader("Content-disposition", "attachment;filename=test.xls");
            wb.write(os);
            os.flush();
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

HSSF读取文件还是使用这几个对象,只是将相应的creatXXX方法变成了getXXX方法即可。

response.setContentType()解析

application/vnd.ms-excel —————- 响应的类型为excel文件

charset=utf-8 —————- 设置字符编码

详情了解请看这篇文章 response.setContentType()的作用及参数

response.setHeader()解析

Content-disposition 告诉浏览器这个文件的名字和类型

详情了解请看这篇文章 response.setHeader()的用法

三、主要方法

在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。

1、设置单元格行高,列宽,最终高度由字体的大小决定
        HSSFSheet sheet = wb.createSheet("sheet0");
        //设置默认行高  代表两个字符的高度
        sheet.setDefaultRowHeight((short)(2*256));
        //设置默认列宽
        sheet.setDefaultColumnWidth(22);
		//设置指定列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一
		sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);
2、设置单元格样式
//创建HSSFCellStyle
HSSFCellStyle cellStyle = wb.createCellStyle();
//设置单元格纵向居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置单元格横向居中
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

/* 设置单元格的填充方式,以及前景颜色和背景颜色
 
  三点注意:
 
  1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
 
  2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
 
  3.前景颜色不是字体颜色。
  
  4.颜色参考
  https://blog.csdn.net/qq_38025219/article/details/82760471
 */
 //设置填充方式(填充图案)
 cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);

 //设置前景色 一般情况设置前景
 cellStyle.setFillForegroundColor(HSSFColor.RED.index);
 //可以搭配 cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);

 //设置背景颜色
 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"));

颜色参考链接

四、读取用户上传的Excel文件简单案例

​ 实现将已存在的Excel文件中的数据导入到系统中的基本步骤同导出十分的类似,关键在于要了解要导入Excel文件的结构,比如数据有哪些列、读取数据起始位置(有效数据从第几行几列开始)等。在实际项目中由于这些数据(Excel文件)往往来自于日常办公人员或其他系统平台产生的业务数据,因此这些Excel文件的数据格式要有统一的要求,并提供访问接口(指访问途径),这样在所需数据的系统中就可通过提供这个访问接口调用方法,从而获得数据。

1、上传Excel文件内容

POI的 HSSFWorkbook 操作

2、前端form表单提交代码

注意enctype属性

    <form action="/submitExcel" method="post" enctype="multipart/form-data" >
        <input type="file" name="file" placeholder="选择文件">
        <input type="submit" placeholder="提交">
    </form>
3、读取Excel文件代码
 	@RequestMapping("/submitExcel")
    @ResponseBody
    public  String submitExcel(@RequestParam(value = "file",required = false) MultipartFile file){

        Workbook workbook = null;
        try {
            //根据指定的文件输入流导入Excel
           workbook = WorkbookFactory.create(file.getInputStream());
        }catch (Exception e){
            e.printStackTrace();
        }
        //获取Excel的第一个表单
        Sheet sheet = workbook.getSheetAt(0);
        int startNum = 1;
        //获取最后一行
        int endNum =  sheet.getLastRowNum();
        for (int i = startNum; i <= endNum ; i++) {
            Row r = sheet.getRow(i);
            System.out.println(r.getCell(0).getStringCellValue()+
                    "=="+r.getCell(1).getNumericCellValue()+
                    "=="+r.getCell(2).getNumericCellValue());
        }
        return "success";
    }

此博文借鉴于 HSSFWorkbook 模版使用
本文仅供个人学习交流使用,记录做过的案例。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。