Java使用POI导出excel(上)——基本操作

旧街凉风 提交于 2020-03-11 16:53:49

  相关的介绍参考自:http://zc985552943.iteye.com/blog/1491546

一、概述

  1.概念

  受上文博文博主的启发,有必要先对excel的各个概念先做了解!

 //上述基本都是接口

//一个excel表格
        HSSFWorkbook wb = new HSSFWorkbook();
        //一个工作表格(sheet)
        HSSFSheet sheet = wb.createSheet("sheet1");
        //一行(row)
        HSSFRow row = sheet.createRow(0);
        //一个单元格(cell)
        HSSFCell cell = row.createCell(0);
        //单元格样式(cellStyle)
        HSSFCellStyle cellStyle = wb.createCellStyle();
        //单元格内容样式(dataFormat)
        HSSFDataFormat format = wb.createDataFormat();
View Code

  2.POI简介

      官网:http://poi.apache.org/

    官方API:http://poi.apache.org/apidocs/index.html

    (韩国的JExcel这里暂不介绍)

    是什么?(引用官网介绍)

    

    能干什么?

    这里我们介绍导出excel的功能操作

   怎么干?

    我们这里先介绍HSSF的使用。

    这里最主要的熟悉里面那一套接口

  需要环境:这里使用POI3.9的版本(这个版本更新比较快)

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>
View Code

  推荐版本单独管理的maven依赖写法:

<poi.version>3.9</poi.version>

 二、基本使用(HelloWorld)

  1.创建工作簿

 public static void main(String[] args) throws IOException {
        //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //使用工作簿的write()方法向文件输出工作簿
        FileOutputStream out = new FileOutputStream("E:\\1.xls");
        wb.write(out);
        //流的关闭
        out.close();
    }

 

  

   2.创建sheet页

 public static void main(String[] args) throws IOException {
        //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //创建两个sheet页
        wb.createSheet("sheet1");
        wb.createSheet("sheet2");
        //创建流并将wb输出
        FileOutputStream out = new FileOutputStream("E:\\2.xls");
        wb.write(out);
        //流的关闭
        out.close();
    }

 

  3.创建行和单元格

  excel中行的概念:(单元格即为行的每一个元素)

  

public static void main(String[] args) throws IOException {
        //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //创建sheet页(使用的是带参构造器)
        Sheet sheet = wb.createSheet("sheet01");
        //创建行(从0开始)
        Row row = sheet.createRow(0);
        //创建单元格(第一列)
        Cell cell = row.createCell(0);
        //给单元格赋值
        cell.setCellValue("测试单元格内容");
        //创建流并将wb输出
        FileOutputStream out = new FileOutputStream("E:\\3.xls");
        wb.write(out);
        //流的关闭
        out.close();
    }

  

  单元格创建其他值的示例

 public static void main(String[] args) throws IOException {
        //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //创建sheet页(使用的是带参构造器)
        Sheet sheet = wb.createSheet("sheet01");
        //创建行(从0开始)
        Row row = sheet.createRow(0);
        //创建单元格(第一列)
        Cell cell = row.createCell(0);
        //给单元格赋值
        cell.setCellValue("测试单元格内容");
        //测试其他的赋值方式
        row.createCell(1).setCellValue(1.1);    //第二列赋浮点值
        row.createCell(2).setCellValue(false);  //第三列赋值boolean型
        //创建流并将wb输出
        FileOutputStream out = new FileOutputStream("E:\\4.xls");
        wb.write(out);
        //流的关闭
        out.close();
    }

 

三、单元格数据格式

  1.时间样式单元格

 public static void main(String[] args) throws IOException {
        //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //创建sheet页(使用的是带参构造器)
        Sheet sheet = wb.createSheet("sheet01");
        //创建行(从0开始)
        Row row = sheet.createRow(0);
        //创建单元格(第一列)
        Cell cell = row.createCell(0);
        //给单元格赋值
        cell.setCellValue(new Date());
        //创建流并将wb输出
        FileOutputStream out = new FileOutputStream("E:\\1.xls");
        wb.write(out);
        //流的关闭
        out.close();
    }

  效果:

  //可以看到,是一个长整形

  调整为时间样式:

 public static void main(String[] args) throws IOException {
        //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
        Workbook wb = new HSSFWorkbook();
        //创建sheet页(使用的是带参构造器)
        Sheet sheet = wb.createSheet("sheet01");
        //创建行(从0开始)
        Row row = sheet.createRow(0);
        //创建单元格(第一列)
        Cell cell = row.createCell(0);
        //给单元格赋值
        cell.setCellValue(new Date());
        /*
         * ==========时间样式单元格==============
         */
        // CreationHelper 可以理解为一个工具类,由这个工具类可以获得 日期格式化的一个实例
        CreationHelper creationHelper = wb.getCreationHelper();
        //创建单元格样式类
        CellStyle cellStyle = wb.createCellStyle();
        //设置时间样式
        cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
        //给第一行第二列赋值
        Cell cell2 = row.createCell(1);
        cell2.setCellValue(new Date());
        cell2.setCellStyle(cellStyle);
        //创建流并将wb输出
        FileOutputStream out = new FileOutputStream("E:\\2.xls");
        wb.write(out);
        //流的关闭
        out.close();
    }

  

   2.处理不同类型内容:

public static void main(String[] args) throws IOException {
    Workbook wb = new HSSFWorkbook();
    Sheet sheet1 = wb.createSheet("三年级(1)班学生名单");
    Row row = sheet1.createRow(0);
    row.createCell(0).setCellValue(1);
    row.createCell(1).setCellValue("一个字符串");
    row.createCell(2).setCellValue(true);
    row.createCell(3).setCellValue(HSSFCell.CELL_TYPE_NUMERIC);
    row.createCell(4).setCellValue(false);
    FileOutputStream fos = new FileOutputStream(
            "c:\\POI使用FileOutputStream输出流生成的工作簿.xls");
    wb.write(fos);
    fos.close();
    // wb 是需要关闭的,否则编译器会有提示
    wb.close();
}

//突如其来的断点防不胜防,这里这个示例是借的网友的

  3.遍历内容

public static void main(String[] args) throws IOException {
       //通过输入流获取工作簿
       InputStream in = new FileInputStream("E:\\1.xls");
       //(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
       POIFSFileSystem fs = new POIFSFileSystem(in);
       HSSFWorkbook wb = new HSSFWorkbook(fs);
       HSSFSheet hssfSheet = wb.getSheetAt(0);  //获取第一个sheet页
      
       if(hssfSheet == null){   //sheet页不存在,不做处理
           return;
       }
       //遍历行
       for(int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++){
           HSSFRow hssfRow = hssfSheet.getRow(rowNum);
           if(hssfRow == null){ //空处理
               continue;
           }
           //遍历列
           for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++){
               HSSFCell hssfCell = hssfRow.getCell(cellNum);
               if(hssfCell == null){    //空处理
                   continue;
               }
               System.out.print(getCellValue(hssfCell)+"    ");
           }
           System.out.println();
       }
    }
    
    /**
     * 封装的类型转换处理静态方法
     */
    private static String getCellValue(HSSFCell hssfCell){
        if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
            return String.valueOf(hssfCell.getBooleanCellValue());
        } else if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
            return String.valueOf(hssfCell.getNumericCellValue());
        } else{
            return String.valueOf(hssfCell.getStringCellValue());
        }
    }

 网友的switch版本:

  private static String getCellDate(Cell cell) {
        String return_string = null;
        switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:
            return_string = cell.getStringCellValue();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:
            return_string = cell.getNumericCellValue() + "";
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            return_string = String.valueOf(cell.getBooleanCellValue());
        default:
            return_string = "";
            break;
        }
        return return_string;
    }
View Code

 

   

  

   //时间样式遍历待更新

  4.文本提取

public static void main(String[] args) throws IOException {
       //通过输入流获取工作簿
       InputStream in = new FileInputStream("E:\\1.xls");
       //(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
       POIFSFileSystem fs = new POIFSFileSystem(in);
       HSSFWorkbook wb = new HSSFWorkbook(fs);
       
       ExcelExtractor excelExtractor = new ExcelExtractor(wb);
       //抽取文本输出
       System.out.println(excelExtractor.getText());     in.close();
    }

 //这里使用的是实现类,导包如下:

import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

 

  

  //可以去掉sheet页名字

     ExcelExtractor excelExtractor = new ExcelExtractor(wb);
       excelExtractor.setIncludeSheetNames(false);
       //抽取文本输出
       System.out.println(excelExtractor.getText());

 四、单元格设置对齐、边框、合并等样式

  1.单元格对齐方式

 public static void main(String[] args) throws IOException {
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
        Row row = sheet1.createRow(2);  //创建第3行
        row.setHeightInPoints(30);  //设置行高(可参见API等 )
        //调用封装的方法,创建单元格     (样式均是常量)
        Cell cell1 = createCell(wb, row, (short)0, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_BOTTOM); //使用short足够
        cell1.setCellValue("操作Excel");
        Cell cell2= createCell(wb, row, (short)1, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_TOP); //使用short足够
        cell2.setCellValue("操作Excel");
        FileOutputStream fos = new FileOutputStream("E:\\5.xls");
        wb.write(fos);
        fos.close();
    }

 

  封装的私有方法:(请重视封装

 private static Cell createCell(Workbook wb,Row row,short column,short hailgn,short valign){
        Cell cell = row.createCell(column); //创建单元格
        cell.setCellValue(new HSSFRichTextString("富文本区域")); //字符串可以使用此方式
        //创建并设置样式
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(hailgn); //水平方向
        cellStyle.setVerticalAlignment(valign); //垂直方向
        //设置单元格样式
        cell.setCellStyle(cellStyle);
        return cell;
    }

   效果:

  其他样式请自行探索或根据文首文档查看。

  2.边框处理

public static void main(String[] args) throws IOException {
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
        Row row = sheet1.createRow(1);  //创建第2行
       
        Cell cell = row.createCell(1);  //创建第二列
        cell.setCellValue("666");
        //单元格样式
        CellStyle cellStyle = wb.createCellStyle();
        //同样,通过常量进行设置
        cellStyle.setBorderBottom(CellStyle.BORDER_THIN);   //底部边框样式
        //通过颜色索引设置底部颜色
        cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //底部边框颜色
       
        //同理,设置左边样式
        cellStyle.setBorderLeft(CellStyle.BORDER_THICK);    //左边边框样式
        cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());    //左边边框颜色
        
        //同理,设置右边样式
        cellStyle.setBorderRight(CellStyle.BORDER_DASHED);
        cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex());
        //最后,设置顶部样式
        cellStyle.setBorderTop(CellStyle.BORDER_THIN);
        cellStyle.setTopBorderColor(IndexedColors.BROWN.getIndex());
        
        //注入样式
        cell.setCellStyle(cellStyle);
        FileOutputStream fos = new FileOutputStream("E:\\6.xls");
        wb.write(fos);
        fos.close();
    }

  效果:

   3.单元格填充色和颜色操作

public static void main(String[] args) throws IOException {
        //创建工作簿和sheet页
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
       
        Row row = sheet1.createRow(1);  //创建第2行
        Cell cell = row.createCell(1);  //创建第2列
        cell.setCellValue("777");
        
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex());   //背景色
        cellStyle.setFillPattern(CellStyle.BIG_SPOTS);   //带点的效果
        
        //注入样式
        cell.setCellStyle(cellStyle);
        
        Cell cell2 = row.createCell(2);  //创建第2列
        cell2.setCellValue("777");
        
        CellStyle cellStyle2 = wb.createCellStyle();
        cellStyle2.setFillForegroundColor(IndexedColors.BLUE.getIndex());   //前景色
        cellStyle2.setFillPattern(CellStyle.SOLID_FOREGROUND);
        //注入样式
        cell2.setCellStyle(cellStyle2);
        FileOutputStream fos = new FileOutputStream("E:\\7.xls");
        wb.write(fos);
        fos.close();
    }

 

  单元格颜色样式背景色未正确显示,待更新:

  4.单元格合并

 public static void main(String[] args) throws IOException {
        //创建工作簿和sheet页
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
       
        Row row = sheet1.createRow(1);  //创建第2行
        Cell cell = row.createCell(1);  //创建第2列
        cell.setCellValue("单元格合并测试");
        
        //单元格合并是由sheet来控制的,cell是无法控制合并的(只能管自己的样式)
        //四个参数:起始结束行;起始结束列(注意都是从0开始)
        sheet1.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
       
        FileOutputStream fos = new FileOutputStream("E:\\8.xls");
        wb.write(fos);
        fos.close();
    }

  效果:

  进一步测试合并4个单元格

sheet1.addMergedRegion(new CellRangeAddress(1, 2, 1, 2));

  效果:

 五、操作excel的其他处理

  1.字体处理

 

 public static void main(String[] args) throws IOException {
        //创建工作簿和sheet页
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("sheet1");
       
        Row row = sheet1.createRow((short)1);  //创建第2行
       
        //创建字体处理类
        Font font = wb.createFont();
        //设置字体相关样式
        font.setFontHeightInPoints((short)24); //设置高度
        font.setFontName("Courier New"); //设置字体名字(官方demo的宽体字体)
        font.setItalic(true);   //设置是否斜体
        font.setStrikeout(true);    //一种中间带线的样式(类似删除线),见效果
        
        //创建cellStyle,font是style中的一个样式
        CellStyle cellStyle = wb.createCellStyle();
        cellStyle.setFont(font);
        
        Cell cell = row.createCell((short)1);
        cell.setCellValue("单元格字体测试");
        
        //注入样式
        cell.setCellStyle(cellStyle);
        FileOutputStream fos = new FileOutputStream("E:\\1.xls");
        wb.write(fos);
        fos.close();
    }

 

 

 

  2.读取和重写工作簿

 public static void main(String[] args) throws IOException {
        InputStream in = new FileInputStream("E:\\1.xls");
        //通过输入流,得到工作簿
        POIFSFileSystem fs = new POIFSFileSystem(in);
        Workbook wb = new HSSFWorkbook(fs);
        //通过下标获取sheet页
        Sheet sheet1 = wb.getSheetAt(0);
   
        Row row = sheet1.getRow(1); //获取第一行
        Cell cell = row.getCell(0); //获取第一个单元格
        if(cell == null){   //为 Null则新建一个
            cell = row.createCell(3);
        }
        cell.setCellType(Cell.CELL_TYPE_STRING);
        cell.setCellValue("测试读取重写");
        FileOutputStream fos = new FileOutputStream("E:\\1.xls");
        //重新写回原处
        wb.write(fos);
        fos.close();
    }

  //如报错,应该是excel文件被占用,退出文件占用即可

  效果:

  3.单元格使用换行

  如何在excel中换行呢?——使用 alt+enter

 

  

 public static void main(String[] args) throws IOException {
       //创建sheet页
       Workbook wb = new HSSFWorkbook();
       Sheet sheet1 = wb.createSheet("sheet1");
       
       //创建单元格
       Row row = sheet1.createRow(1);
       Cell cell = row.createCell(1);
       
       cell.setCellValue("即将换行 \n 换行成功");
       
       //通过样式设置允许换行
       CellStyle cellStyle = wb.createCellStyle();
       cellStyle.setWrapText(true); //允许换行
       
       cell.setCellStyle(cellStyle);
       
       //调整行高(2倍默认行高)
       row.setHeightInPoints(2*sheet1.getDefaultRowHeightInPoints());
       //调整宽度,详见API
       sheet1.autoSizeColumn(2);
       
       FileOutputStream fos = new FileOutputStream("E:\\2.xls");
       wb.write(fos);
       fos.close();
    }

  效果:

  4.创建用户自定义数据格式

 

public static void main(String[] args) throws IOException {
       //创建sheet页
       Workbook wb = new HSSFWorkbook();
       Sheet sheet1 = wb.createSheet("sheet1");
       
       //数据格式属于style里的,类似字体
       DataFormat format = wb.createDataFormat();
       
       //定义
       CellStyle cellStyle;
       Row row;
       Cell cell;
       short rowNum = 0;
       short cellNum = 0;
       
       //创建
       row = sheet1.createRow(rowNum++);
       cell = row.createCell(cellNum++);
       
       cell.setCellValue(10086.258);
      
       cellStyle = wb.createCellStyle();
       cellStyle.setDataFormat(format.getFormat("0.0"));    //设置数据格式
       
       //注入样式
       cell.setCellStyle(cellStyle);
       //=========================
      
       row = sheet1.createRow(rowNum++);
       cell = row.createCell(cellNum++);
       
       cell.setCellValue(3456789.258);
      
       cellStyle = wb.createCellStyle();
       cellStyle.setDataFormat(format.getFormat("#,##0.000"));    //设置数据格式
       //注入样式
       cell.setCellStyle(cellStyle);
       
       FileOutputStream fos = new FileOutputStream("E:\\3.xls");
       wb.write(fos);
       fos.close();
    }

  //定义与创建分离的写法(推荐)

  效果:

  其中,0.0为保留一位小数,自动四舍五入了

  第二个为3位3位按逗号分隔

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!