• POI操作Excel


    1、POI操作Excel

    1.1 Excel简介

    一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,

    这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,

    再从BA到BZ再26列以此类推。行则使用数字表示,例如;A3 表示第三行第一列,E5表示第五行第五列。

     

    1.2 POI工具包

    JAVA中操作Excel的有两种比较主流的工具包:JXL和POI

    jxl 只能操作Excel 95、97、2000也即以.xls为后缀的excel

    而poi可以操作Excel 95及以后的版本,即可操作后缀为.xls和.xlsx两种格式的excel

    JXL的官网为:http://www.andykhan.com/jexcelapi  

    POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过

    JAVA操作Microsoft office 套件工具的读写功能。

    官网:http://poi.apache.org ,POI支持office的所有版本,并且在接下来的演示中需要

    从前端页面导入用户上传的版本不确定的excel文件,所以选择POI来讲解。

    在官网,下载POI : 

    在官网中下载jar包以及源码包: 

    下载完后,打开“poi-bin-3.10.1-20140818”获取操作excel需要的jar包,并将这些jar包复制到项目中。

    对于只操作2003 及以前版本的excel,只需要poi-3.10.1-20140818.jar ,

    如果需要同时对2007及以后版本进行操作则需要复制poi-ooxml-3.10.1-20140818.jar、

    poi-ooxml-schemas-3.10.1-20140818.jar以及复制在ooxml-lib目录下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar。

     

    1.3 POI Hello World

    在POI包中有如下几个主要对象和excel的几个对象对应

    HSSFWorkbook

    Excel 工作簿workbook

    HSSFSheet

    Excel 工作表 sheet

    HSSFRow

    Excel 行

    HSSFCell

    Excel 单元格

    创建一个Excel工作表,往里面的C1单元格写入和读出“Hello World”

    @Test

    public void testWrite03Excel() throws Exception {

    //1、创建工作簿

    HSSFWorkbook workbook = new HSSFWorkbook();

    //2、创建工作表

    HSSFSheet sheet = workbook.createSheet("hello world");

    //3、创建行:创建第三行

    HSSFRow row = sheet.createRow(2);

    //4、创建单元格:创建第三行第三列

    HSSFCell cell = row.createCell(2);

    cell.setCellValue("hello world");

    //创建输出流,输出到硬盘

    FileOutputStream outputScream

    = new FileOutputStream("e://test.xlsx");

    workbook.write(outputScream);

    workbook.close();

    outputScream.close();

    }

    再利用上述几个对象将“Hello World”读取出来

    @Test

    public void testRead03Excel() throws Exception {

    //创建读取文件流

    FileInputStream inputStream  = new FileInputStream("e://test.xls");

    //1、读取工作簿

    HSSFWorkbook workbook = new HSSFWorkbook(inputStream);

    //2、读取工作表:读取第一张工作表

    HSSFSheet sheet = workbook.getSheetAt(0);

    //3、读取行:读取第三行

    HSSFRow row = sheet.getRow(2);

    //4、创建单元格:读取第三行第三列

    HSSFCell cell = row.getCell(2);

    String value = cell.getStringCellValue();

    System.out.println("第三行第三列的值:" + value);

    workbook.close();

    inputStream.close();

    }

    1.4 POI与Excel

    通过上门的例子我们知道如下信息:

    1、 Excel 的工作簿对应POI的HSSFWorkbook对象;

    2、 Excel 的工作表对应POI的HSSFSheet对象;

    3、 Excel 的行对应POI的HSSFRow对象;

    4、 Excel 的单元格对应POI的HSSFCell对象。

     

    POI 也能对07以后的excel版本进行读写,读写方法和读写03版是一样的,只是对象名称变了;

    原来各对象的开头字母H变为X,操作方式不变。

    1、 Excel 的工作簿对应POI的XSSFWorkbook对象;

    2、 Excel 的工作表对应POI的XSSFSheet对象;

    3、 Excel 的行对应POI的XSSFRow对象;

    4、 Excel 的单元格对应POI的XSSFCell对象。

    @Test

    public void testWrite07Excel() throws Exception {

    //1、创建工作簿

    XSSFWorkbook workbook = new XSSFWorkbook();

    //2、创建工作表

    XSSFSheet sheet = workbook.createSheet("hello world");

    //3、创建行;创建第3行

    XSSFRow row = sheet.createRow(2);

    //4、创建单元格;创建第3行第3列

    XSSFCell cell = row.createCell(2);

    cell.setCellValue("Hello World");

    FileOutputStream outputStream

    = new FileOutputStream("e:\test.xlsx");

    workbook.write(outputStream);

    workbook.close();

    outputStream.close();

    }

    @Test

    public void testRead07Excel() throws Exception {

    FileInputStream inputStream

    = new FileInputStream("e:\test.xlsx");

    //1、读取工作簿

    XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

    //2、读取第一个工作表

    XSSFSheet sheet = workbook.getSheetAt(0);

    //3、读取行;读取第3行

    XSSFRow row = sheet.getRow(2);

    //4、读取单元格;读取第3行第3列

    XSSFCell cell = row.getCell(2);

    System.out.println("第3行第3列单元格的内容为:" 

    + cell.getStringCellValue());

    workbook.close();

    inputStream.close();

    }

    在“poi-bin-3.10.1-20140818poi-3.10.1docsapidocs”目录中,点击“index.html”查看POI api文档,

    我们可以查询POI中所有这些对象的属性和方法。

    从api文档中我们了解到

    HSSFWorkbook 和 XSSFWorkbook 都实现了Workbook接口;

    HSSFSheet 和 XSSFSheet 实现了Sheet接口;

    HSSFRow 和 XSSFRow 实现了Row接口;

    HSSFCell 和 XSSFCell 实现了Cell接口;

    因为这两类处理对象共同实现了对应的同一接口,届时将大大方便和简化了同时处理不同格式的excel文件的编码工作。

    如;在处理03和07版本的excel文件时利用统一的接口就可以做到分析两个版本的excel数据。

    POI同时读入03和07版本的excel。

    方法一:判断文件的名称后调用对应版本的读入方法。

    方法二:根据不同版本用Workbook接口来读入文件并统一处理。

    @Test

    public void testRead03And07Excel() throws Exception {

    String fileName = "F:\itcast\测试.xls";

    //判断是否excel文档

    if(fileName.matches("^.+\.(?i)((xls)|(xlsx))$")){

    boolean is03Excel = fileName.matches("^.+\.(?i)(xls)$");

    FileInputStream inputStream = new FileInputStream(fileName);

     

    //1、读取工作簿

    Workbook workbook = is03Excel ?new HSSFWorkbook(inputStream):new XSSFWorkbook(inputStream);

    //2、读取第一个工作表

    Sheet sheet = workbook.getSheetAt(0);

    //3、读取行;读取第3行

    Row row = sheet.getRow(2);

    //4、读取单元格;读取第3行第3列

    Cell cell = row.getCell(2);

    System.out.println("第3行第3列单元格的内容为:"

     +  cell.getStringCellValue());

     

    workbook.close();

    inputStream.close();

    }

    }

     

    1.5 格式化Excel

    在POI中可以利用格式化对象来格式化excel文档;也即设置excel内容的样式。

    POI中主要的格式化对象常用的有合并单元格、设置单元格字体、边框,背景颜色等。

    合并单元格

    在POI中有一个CellRangeAddress对象,中文直译是 单元格范围地址,主要用于在单元格的合并上,这个对象的构造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4个参数,分别表示(起始行号,终止行号, 起始列号,终止列号), 设置这个对象中要合并的单元格范围后,工作

    表对象sheet调用方法

    addMergedRegion(CellRangeAddress region) ,将上述设置的CellRangeAddress对象作为参数传入即可合并单元格。

    【注意:上图中合并单元格后,单元格的名称是第一个单元格;即上面中合并了第二行的第二列到第五列,合并后的单元格叫B2,而其它被合并的单元格已经无效了,不能对无效单元格设置值。如果进行了设置将不显示。】

    设置单元格样式

    首先要设置单元格样式则要先初始化POI中的单元格样式对象HSSFCellStyle,然后在样式对象中设置不同的样式(内容位置、字体、背景、颜色、边框等)。单元格样式是由工作簿workbook创建的,一个工作簿可以创建多个样式。

    1、设置单元格内容位置;设置水平位置 setAlignment(short align) ,设置垂直位置setVerticalAlignment(short align) 

    2、 设置单元格字体;POI中的字体对象为HSSFFont,字体是由工作簿创建,可以用于多个单元格上。

    3、设置单元格背景色。

    @Test

    public void testExcelStyle() throws Exception {

    //1、创建工作簿

    HSSFWorkbook workbook = new HSSFWorkbook();

    //1.1、创建合并单元格对象;合并第3行的第3列到第5列

    @SuppressWarnings("deprecation")

    CellRangeAddress cellRangeAddress = new CellRangeAddress(2, 2, 2, 4);

    //起始行号,结束行号,起始列号,结束列号

    //1.2、创建单元格样式

    HSSFCellStyle style = workbook.createCellStyle();

    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中

    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

    //1.3、创建字体

    HSSFFont font = workbook.createFont();

    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗字体

    font.setFontHeightInPoints((short) 16);//设置字体大小

    //加载字体

    style.setFont(font);

    //单元格背景

    //设置背景填充模式

    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    //设置填充背景色

    style.setFillBackgroundColor(HSSFColor.YELLOW.index);

    //设置填充前景色

    style.setFillForegroundColor(HSSFColor.RED.index);

    //2、创建工作表

    HSSFSheet sheet = workbook.createSheet("Hello World");//指定工作表名

    //2.1、加载合并单元格对象

    sheet.addMergedRegion(cellRangeAddress);

    //3、创建行;创建第3行

    HSSFRow row = sheet.createRow(2);

    //4、创建单元格;创建第3行第3列

    HSSFCell cell = row.createCell(2);

    //加载样式

    cell.setCellStyle(style);

    cell.setCellValue("Hello World!");

    //输出到硬盘

    FileOutputStream outputStream =

    new FileOutputStream("e:\test.xls");

    //把excel输出到具体的地址

    workbook.write(outputStream);

    workbook.close();

    outputStream.close();

    }

     

     

  • 相关阅读:
    MySQL Online DDL导致全局锁表案例分析
    .NET Core教程--给API加一个服务端缓存啦
    任务队列和异步接口的正确打开方式(.NET Core版本)
    .NET Core中使用RabbitMQ正确方式
    .NET Core单元测试之搞死开发的覆盖率统计(coverlet + ReportGenerator )
    没有执行过rm -rf /*的开发不是好运维
    dotnet core在Task中使用依赖注入的Service/EFContext
    可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking
    dpdk中QSBR具体实现
    C语言二级指针底层实现
  • 原文地址:https://www.cnblogs.com/ysdrzp/p/8869356.html
Copyright © 2020-2023  润新知