POI

简介

百度百科

  • Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

基本功能

  • HSSF - 提供读写Microsoft Excel格式档案的功能。
  • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
  • HWPF - 提供读写Microsoft Word格式档案的功能。
  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
  • HDGF - 提供读写Microsoft Visio格式档案的功能。

如何下载

  1. POM方式

    <!-- poi主体 -->
    <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
    </dependency>
    <!-- poi对ooxml格式的支持 -->
    <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
    </dependency>
    
  2. jar包方式

    通过对pom文件进行分析poi依赖以下几个包,可自行下载导入

    以poi 4.1.2为例

    org.apache.poi:poi:4.1.2
    org.apache.poi:poi-ooxml:4.1.2
    org.apache.poi:poi-ooxml-schemas:4.1.2
    org.apache.xmlbeans:xmlbeans:3.1.0
    com.github.virtuald:curvesapi:1.06
    com.zaxxer:SparseBitSet:1.2
    commons-codec:commons-codec:1.13
    org.apache.commons:commons-collections4:4.4
    org.apache.commons:commons-math3:3.6.1
    org.apache.commons:commons-compress:1.19
    
  3. 我这里下载好了,打包了一份,可以自行下载

    • 正常文件名的为jar包

    • 以javadoc结尾的为javadoc文档

    • 以sources结尾的为源代码

    • 文档和源代码可以自行选择要不要导入

操作Excel

写文件

  1. 简单写一个文件步骤

    @Test
    public void testWrite() throws Exception {//设置文件路径String PATH = "D:\\";//1、创建一个工作簿//如果是要2007版本之前的是new HSSFWorkbook();文件名以xls结尾//如果是要2007版本之后的是new XSSFWorkbook();文件名以xlsx结尾Workbook workbook = new XSSFWorkbook();//2、创建一个工作表,参数可以填表的名字,不填就是默认名字SheetSheet sheet = workbook.createSheet();//3、创建一个行Row row = sheet.createRow(0);//4、创建一个单元格Cell cell = row.createCell(0);//5、为单元格赋值cell.setCellValue("1");//创建一个文件流,excel2007之前是xls结尾文件名,之后是xlsx结尾FileOutputStream fileOutputStream = new FileOutputStream(PATH + "testWrite.xlsx");//以文件流的新式输出workbook.write(fileOutputStream);//流使用完要关闭fileOutputStream.close();
    }
    

    运行后输出结果

  2. 从数据库读数据并输出

    创建一个实体类

    public class Student {int id;String name;String sex;Date birth;//省略构造器,getter,setter,toString等方法
    }
    

    写一个初始化该实体类的方法,应该是要从数据库中读取,为了方便,就直接赋值了

    public  List<Student> initStudentList(){List<Student> studentList=new ArrayList<>();studentList.add(new Student(11111111,"naclo1","男",new Date()));studentList.add(new Student(33333333,"naclo3","女",new Date()));studentList.add(new Student(44444444,"naclo4","男",new Date()));studentList.add(new Student(55555555,"naclo5","女",new Date()));studentList.add(new Student(66666666,"naclo6","男",new Date()));return studentList;
    }
    

    创建表格

    @Test
    public void testWriteStudentList() throws Exception {//设置文件路径String PATH = "D:\\";//获取学生列表,应该是从数据库中读取List<Student> studentList=this.initStudentList();//创建工作簿Workbook workbook = new XSSFWorkbook();//创建工作表Sheet sheet = workbook.createSheet("学生表");//3、设置表头,默认下标从0开始//可以对表头设置格式,请看下文Row row = sheet.createRow(0);row.createCell(0).setCellValue("学号");row.createCell(1).setCellValue("姓名");row.createCell(2).setCellValue("性别");row.createCell(3).setCellValue("生日");//循环为表赋值for (int rowNum = 1; rowNum <= studentList.size(); rowNum++) {//列表下标是从0开始,而循环是从1开始,所以下标要减一Student student = studentList.get(rowNum - 1);row = sheet.createRow(rowNum);//为正常的表格数据赋值row.createCell(0).setCellValue(student.getId());row.createCell(1).setCellValue(student.getName());row.createCell(2).setCellValue(student.getSex());//设置日期会是默认以数字形式输出,所以要对日期进行格式化,请看下文row.createCell(3).setCellValue(student.getBirth());}//输出学生表到目录FileOutputStream fileOutputStream = new FileOutputStream(PATH + "StudentList.xlsx");workbook.write(fileOutputStream);fileOutputStream.close();
    }
    

    运行后输出结果

  3. 设置日期会是默认以数字新式输出,所以要对日期进行格式化

    //创建一个单元格
    Cell cell = row.createCell(3);
    //为单元格赋值,为日期类型
    cell.setCellValue(student.getBirth());
    //把单元格设置为日期格式
    CreationHelper createHelper = workbook.getCreationHelper();
    CellStyle cellStyle = workbook.createCellStyle();
    //把单元格设置为日期格式
    cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd"));
    //单元格应用格式
    cell.setCellStyle(cellStyle);
    

    运行后输出结果

  4. 设置数字会是默认以字符串形式输出,所以要对格式进行修改,否则不好应用一些公式

    整数

    Cell cell = row.createCell(0);
    cell.setCellValue(student.getId());
    CellStyle cellStyle = workbook.createCellStyle();
    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0"));
    cell.setCellStyle(cellStyle);
    

    小数

    Cell cell = row.createCell(0);
    cell.setCellValue(student.getId());
    HSSFCellStyle cellStyle = workbook.createCellStyle();
    cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
    cell.setCellStyle(cellStyle);
    
  5. 为表头设置样式

    //给第一行表头设置字体格式
    Row row = sheet.getRow(0);
    for (int cellNum = 0; cellNum <4; cellNum++) {//创建格式CellStyle cellStyle = workbook.createCellStyle();//创建字体Font font = workbook.createFont();//设置字体font.setFontName("宋体");//字体设置为加粗font.setBold(true);//设置字体颜色,颜色是枚举类,可以点进HSSFColor自行查看font.setColor(HSSFColor.HSSFColorPredefined.RED.getIndex());//设置字体大小font.setFontHeightInPoints((short)20);//选择需要用到的字体格式cellStyle.setFont(font);//为单元格设置格式row.getCell(cellNum).setCellStyle(cellStyle);
    }
    
  6. 设置自适应列宽

    //设置自适应列宽
    sheet.autoSizeColumn(3);
    

读文件

  1. 简单读一个文件步骤,以前面输出的testWrite.xlsx文件为例

    @Test
    public void testRead() throws Exception {//1、获取文件流FileInputStream inputStream = new FileInputStream(PATH + "testWrite.xlsx");//2、获得工作簿Workbook workbook = new XSSFWorkbook(inputStream);//3、获得工作表Sheet sheet = workbook.getSheetAt(0);//4、获得行Row row = sheet.getRow(0);//5、获得单元格Cell cell = row.getCell(0);//获取表的值String stringCellValue = cell.getStringCellValue();System.out.println("stringCellValue = " + stringCellValue);//流使用完要关闭inputStream.close();
    }
    

    输出结果

  2. 从读数据并进行持久化,以前面输出的StudentList.xlsx文件为例

    写一个持久化方法,这里就简单的输出

    public void saveStudent(Student student){System.out.println("student = " + student);
    }
    

    读取文件

    @Test
    public void testStudentList() throws Exception {//获取文件流FileInputStream inputStream = new FileInputStream(PATH + "StudentList.xlsx");//获得工作簿Workbook workbook = new XSSFWorkbook(inputStream);//获得工作表Sheet sheet = workbook.getSheetAt(0);//获取行数int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();//循环获取行,因为第一行是表头,所以跳过,下标从2开始for (int i = 1; i < physicalNumberOfRows; i++) {//获得行Row row = sheet.getRow(i);//注意,表格上的数据类型不同,获取数值的方法不同//获取数字类型的数据,返回值是double,这里强转为intint cell0 = (int)row.getCell(0).getNumericCellValue();//获取字符串类型的数据String cell1 = row.getCell(1).getStringCellValue();//获取字符串类型的数据String cell2 = row.getCell(2).getStringCellValue();//获取日期类型的数据Date cell3 = row.getCell(3).getDateCellValue();//对数据进行持久化操作saveStudent(new Student(cell0,cell1,cell2,cell3));}//流使用完要关闭inputStream.close();
    }
    

    运行后输出结果

POI读写excel简单教程相关推荐

  1. Perl读写Excel简单操作

    Perl读写Excel简单操作 使用模块 Spreadsheet::ParseExcel Spreadsheet::WriteExcel 读Excel #!/usr/bin/perl -wuse st ...

  2. java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  3. jxl读写excel, poi读写excel,word, 读取Excel数据到MySQL

    这篇blog是介绍: 1. java中的poi技术读取Excel数据,然后保存到MySQL数据中. 2. jxl读写excel 你也可以在 : java的poi技术读取和导入Excel 了解到写入Ex ...

  4. 使用poi读写excel文件

    使用poi读写excel文件 Posted on 2011 年 03 月 16 日 by 苍之涛 今天一个同学需要处理一个excel文件,于是我便在网上搜了一下方法,顺便自己研究一下.刚刚参考网上资料 ...

  5. python pandas读取excel-Python使用Pandas读写EXCEL文件教程

    欢迎,来自IP地址为:211.103.135.163 的朋友 教程开始之前,我们需要首先了解一下什么是Excel,这有助于理解之后教程中的内容. 什么是Excel Excel  是微软出品的和款办公软 ...

  6. POI读写Excel演练

    前言 最近, 看了别人的博客, 说一个开发人员写了10年代码, 还不知道怎么去实现一个java处理excel文件的简单操作, WTFK! 我严重怀疑他在说我, 很明显我也不会, 所以你有福了, 和我一 ...

  7. Python使用Pandas读写EXCEL文件教程

    https://www.daehub.com/archives/9463.html 教程 开始之前,我们需要首先了解一下什么是Excel,这有助于理解之后教程中的内容. 什么是Excel Excel  ...

  8. python 读excel pandas_Python使用Pandas读写EXCEL文件教程

    欢迎,来自IP地址为:140.250.89.180 的朋友 教程开始之前,我们需要首先了解一下什么是Excel,这有助于理解之后教程中的内容. 什么是Excel Excel  是微软出品的和款办公软件 ...

  9. java读写excel文件poi_Java利用POI读写Excel文件工具类

    本文实例为大家分享了Java读写Excel文件工具类的具体代码,供大家参考,具体内容如下 package com.test.app.utils; import java.io.File; import ...

最新文章

  1. 组策略 从入门到精通 (七) 组策略的继承
  2. 后台返回不带http的图片路径前台怎么拼接_Shortcuts 教程:一键搞定公众号图片排版...
  3. jquery.chosen.js下拉选择框美化插件项目实例
  4. 微软加入了面向Java的Cloud Foundry
  5. 客户端相关知识学习(五)之什么是webView
  6. call和apply和bind的区别
  7. 人脸识别算法不可置疑?真相需要多重验证!
  8. Google 历年笔试面试30题
  9. nodejs的启动方式
  10. VS2010与QT的集成开发环境
  11. 2016年中国国际信息通信展览会在北京开幕
  12. python递归创建目录_Python学习第172课——Linux中一次性创建多层目录以及递归列出所有子目录...
  13. 中国银行业协会首席信息官高峰:银行函证区块链服务平台具备六大优势
  14. 马云获评《外交政策》全球十大思想者 影响全球经济变革
  15. roundcube mysql_Roundcube Webmail 安装配置
  16. PS(Photoshop)常用快捷键使用大全
  17. UE 简单存档读档功能
  18. 笔记本电脑电流声(滋啦滋啦声)解决方案
  19. lib与dll的关系(详解静态链接库和动态链接库)
  20. 5G+智能边缘,究竟会带来怎样的商业价值?

热门文章

  1. 8个常见的相亲交友源码前端防御性编程方案
  2. 分享未注册淘宝热卖域名
  3. 豌豆射手-第13届蓝桥杯Scratch选拔赛真题精选
  4. 如何下载展览路街道卫星地图高清版大图
  5. 成功解决 ValueError: Shape of passed values is (2, 3), indices imply (4, 3)
  6. OpenCV的三维重建实现方案
  7. Ubuntu12.04安装磊科NW336无线网卡
  8. DLL动态链接库生成及其動態调用(二)
  9. ScriptManager.RegisterStartupScript用法详解
  10. 全球及中国前置汽车中冷器行业需求趋势分析及发展规划研究报告2021-2027年版