当前位置: 首页 > news >正文

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

  相关的介绍参考自: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位按逗号分隔

 

转载于:https://www.cnblogs.com/jiangbei/p/7306849.html

相关文章:

  • Redis之Hash类型操作
  • 转进制
  • Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件
  • jQuery遍历之prev()方法
  • 文本显示为单行,超过部分隐藏并使用省略号
  • codeforces 837B
  • 【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要讲故事啦~~...
  • 2017ACM暑期多校联合训练 - Team 6 1001 HDU 6096 String (字符串处理 字典树)...
  • python三级菜单
  • jquery ajax添加元素事件无效,each,on函数参考
  • js 判断确切判断Array和Object
  • s7day1学习记录
  • Eclipse配置文件描述
  • C#6.0VISUALSTUDIO 2015 C#入门经典 第7版pdf
  • Navicat Premium连接各种数据库
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Centos6.8 使用rpm安装mysql5.7
  • Elasticsearch 参考指南(升级前重新索引)
  • go语言学习初探(一)
  • HTTP中GET与POST的区别 99%的错误认识
  • react 代码优化(一) ——事件处理
  • Vue2 SSR 的优化之旅
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 前端之React实战:创建跨平台的项目架构
  • 听说你叫Java(二)–Servlet请求
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #Lua:Lua调用C++生成的DLL库
  • #Spring-boot高级
  • #stm32整理(一)flash读写
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (七)理解angular中的module和injector,即依赖注入
  • (十六)串口UART
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)shell调试方法
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • []Telit UC864E 拨号上网
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C++]拼图游戏
  • [ComfyUI进阶教程] animatediff视频提示词书写要点