Java实战—POI操作Excel文档、读取、写入、合并单元格
一、POI项目简介
POI全称 Poor Obfuscation Implementation,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本。
二、POI操作Excel文档
(一)准备开发环境
所需要的相关依赖包:
<!-- POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-excelant</artifactId><version>3.16</version></dependency> <!-- Junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
(二)用POI操作03版EXCEL文档
在POI包中有如下几个主要对象和excel的几个对象对应:
HSSFWorkbook | Excel 工作簿workbook |
---|---|
HSSFSheet | Excel 工作表 sheet |
HSSFRow | Excel 行 |
HSSFCell | Excel 单元格 |
利用以上几个对象,我们简单创建一个Excel工作表,往里面的C1单元格写入和读出“Hello World”:
1、写入excel:
@Testpublic void testExcelWrite() throws IOException{//1、新建工作簿HSSFWorkbook workbook=new HSSFWorkbook();//2、创建工作表HSSFSheet sheet=workbook.createSheet("工作表1");//3、创建行HSSFRow row=sheet.createRow(0);//4、创建单元格HSSFCell cell=row.createCell(2);//5、单元格写入内容cell.setCellValue("你好JAVA");//6、保存工作簿File file=new File("d:\\hello.xls");workbook.write(file);System.out.println("创建Excel成功");}
2、读取excel:
/*** 读取Excel演示* @throws IOException */@Testpublic void readExcelTest() throws IOException{FileInputStream input=new FileInputStream("d:\\hello.xls");HSSFWorkbook workbook=new HSSFWorkbook(input);HSSFSheet sheet=workbook.getSheet("工作表1");HSSFRow row=sheet.getRow(0);HSSFCell cell=row.getCell(2);System.out.println("读取单元格内容:"+cell.getStringCellValue());}
(三)用POI操作07版EXCEL文档
POI 也能对07以后的excel版本进行读写,读写方法和读写03版是一样的,只是对象名称变了;原来各对象的开头字母H变为X,操作方式不变。
1、 Excel 的工作簿对应POI的XSSFWorkbook对象;
2、 Excel 的工作表对应POI的XSSFSheet对象;
3、 Excel 的行对应POI的XSSFRow对象;
4、 Excel 的单元格对应POI的XSSFCell对象。
1、写入xlsx:
/*** 写入2007格式的Excel* @throws IOException*/@Testpublic void testExcel2007Write() throws IOException{//1、创建工作簿XSSFWorkbook workbook=new XSSFWorkbook();//2、新建工作表XSSFSheet sheet=workbook.createSheet("新建工作表1");//3、新增行XSSFRow row=sheet.createRow(0);//4、新建单元格XSSFCell cell=row.createCell(2);//5、给单元格填充数据cell.setCellValue("hello world");//6、保存工作簿FileOutputStream fileout=new FileOutputStream("d:\\hello2.xlsx");workbook.write(fileout);System.out.println("创建2007格式的Excel成功");}
2、读取xlsx:
/*** 读取2007格式的Excel* @throws IOException */@Testpublic void TestExcel2007Read() throws IOException{//1、创建FileInputStreamFileInputStream filein=new FileInputStream("d:\\hello2.xlsx");//2、基于流来创建Excel工作簿XSSFWorkbook workbook=new XSSFWorkbook(filein);//3、从工作簿来读取工作表XSSFSheet sheet=workbook.getSheet("新建工作表1");//4、从工作表读取行XSSFRow row=sheet.getRow(0);//5、从行中读取单元格XSSFCell cell=row.getCell(2);//6、从单元格获取内容System.out.println(cell.getStringCellValue());}
(四)用POI统一读取03、07版EXCEL文档
从api文档中我们了解到:
HSSFWorkbook 和 XSSFWorkbook 都实现了Workbook接口;
HSSFSheet 和 XSSFSheet 实现了Sheet接口;
HSSFRow 和 XSSFRow 实现了Row接口;
HSSFCell 和 XSSFCell 实现了Cell接口;
因为这两类处理对象共同实现了对应的同一接口,届时将大大方便和简化了同时处理不同格式的excel文件的编码工作。如;在处理03和07版本的excel文件时利用统一的接口就可以做到分析两个版本的excel数据。
POI同时读入03和07版本的excel。
方法一:判断文件的名称后调用对应版本的读入方法。
方法二:根据WorkbookFactory来读入文件并统一处理。
@Testpublic void AllExcelRead() throws IOException, EncryptedDocumentException, InvalidFormatException{//1、指定要读取EXCEL文档名称String filename="d:\\hello2.xlsx";//filename="d:\\hello.xls";//2、创建输入流FileInputStream input=new FileInputStream(filename);//3、通过工作簿工厂类来创建工作簿对象Workbook workbook=WorkbookFactory.create(input);//4、获取工作表Sheet sheet=workbook.getSheet("新建工作表1");//5、获取行Row row=sheet.getRow(0);//6、获取单元格Cell cell=row.getCell(2);//7、读取单元格内容System.out.println(cell.getStringCellValue());}
(五)遍历读取一个Excel文件
/*** 遍历一个Excel* * @throws IOException* @throws InvalidFormatException* @throws EncryptedDocumentException*/@Testpublic void ExcelReadIteart() throws EncryptedDocumentException, InvalidFormatException, IOException {// 1、指定要读取EXCEL文档名称String filename = "d:\\test.xlsx";// filename="d:\\hello.xls";// 2、创建输入流FileInputStream input = new FileInputStream(filename);// 3、通过工作簿工厂类来创建工作簿对象Workbook workbook = WorkbookFactory.create(input);//4、遍历工作簿下面的所有工作表int sheetnum=workbook.getNumberOfSheets();for(int i=0;i<sheetnum;i++){//获取到单个工作表Sheet sheet=workbook.getSheetAt(i);//获取工作表下的所有行数int rownum=sheet.getPhysicalNumberOfRows();//获取第一行的单元格个数for(int j=0;j<rownum;j++){//获取到每一行Row row=sheet.getRow(j);int cellnum=row.getPhysicalNumberOfCells();//获取每一行下的全部单元格for(int x=0;x<cellnum;x++){Cell cell=row.getCell(x);//判断单元格类型,获取对应数据if(cell.getCellTypeEnum()==CellType.STRING){System.out.print(cell.getStringCellValue()+"\t");}else if(cell.getCellTypeEnum()==CellType.NUMERIC){System.out.print(cell.getNumericCellValue()+"\t");}else if(cell.getCellTypeEnum()==CellType.BOOLEAN){System.out.print(cell.getBooleanCellValue()+"\t");}else if(cell.getCellTypeEnum()==CellType.BLANK){System.out.print("null"+"\t");}else{System.out.print(cell.getDateCellValue()+"\t");}}System.out.println("");}}}
单元格类型 | 描述 |
---|---|
CELL_TYPE_BLANK | 代表空白单元格 |
CELL_TYPE_BOOLEAN | 代表布尔单元(true或false) |
CELL_TYPE_ERROR | 表示在单元的误差值 |
CELL_TYPE_FORMULA | 表示一个单元格公式的结果 |
CELL_TYPE_NUMERIC | 表示对一个单元的数字数据 |
CELL_TYPE_STRING | 表示对一个单元串(文本) |
(六)POI合并EXCEL单元格
合并单元格
在POI中有一个CellRangeAddress对象,中文直译是 单元格范围地址,主要用于在单元格的合并上,这个对象的构造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4个参数,分别表示(起始行号,终止行号, 起始列号,终止列号), 设置这个对象中要合并的单元格范围后,工作表对象sheet调用方法addMergedRegion(CellRangeAddress region) ,将上述设置的CellRangeAddress对象作为参数传入即可合并单元格。
public void mergedRegion() throws IOException{//新建工作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook();//新建工作表XSSFSheet sheet = xssfWorkbook.createSheet("工作表1");//指定合并开始行、合并结束行 合并开始列、合并结束列CellRangeAddress rangeAddress = new CellRangeAddress(1, 2, 1, 3);//添加要合并地址到表格sheet.addMergedRegion(rangeAddress);//创建行,指定起始行号,从0开始XSSFRow row = sheet.createRow(1);//创建单元格,指定起始列号,从0开始XSSFCell cell = row.createCell(1);//设置单元格内容cell.setCellValue("我是合并后的单元格");//创建样式对象CellStyle style = xssfWorkbook.createCellStyle();//设置样式对齐方式:水平\垂直居中style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);//设定填充单色style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设定背景颜色style.setFillForegroundColor(IndexedColors.RED.getIndex());//为指定单元格设定样式cell.setCellStyle(style);FileOutputStream fileOutputStream = new FileOutputStream("d:\\hello-3.xlsx");xssfWorkbook.write(fileOutputStream);fileOutputStream.close();}
【注意:上图中合并单元格后,单元格的名称是第一个单元格;即上面中合并了第二到第三行的第二列到第五列,合并后的单元格叫B2,而其它被合并的单元格已经无效了,不能对无效单元格设置值。如果进行了设置将不显示。】
点击查看
Java实战—POI 与SpringMVC框架(SSM框架)整合实现Excel导入导出
Java实战—POI操作Excel文档、读取、写入、合并单元格相关推荐
- 支持将数据导出到Excel文档的时候设置单元格格式的.NET控件Spire.DataExport
Spire.DataExport for .NET是e-iceblue公司推出的一款数据导出类.NET控件.作为一款专业的数据导出控件,Spire.DataExport for .NET可以帮助开发人 ...
- java 读取excel 图片_利用Java+POI 读写Excel文档向Excel中插入图片
一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...
- Java 通过POI 操作excel表格:读取、写入
Java操作excel表格是很常见的,在下面的例子中我将展示使用Java如何对excel进行读取和写入操作.(我是在ssm中实现的) 一.导入依赖 (如果是在普通Java项目中需要导入相应jar包) ...
- Office Open XML学习(1)-创建excel文档,并向单元格中插入字符串
做企业级应用,跟office打交道是少不了的.这里的Office不仅仅局限于微软的Office,还有第三方的Open Office之类..Net传统的Office操作方法(比如OleDB,OWC之类) ...
- jacob 模板生成word文档 表格(合并单元格以及各种表格样式)、图片
一.将 jacob-1.18-M2-x64.dll 文件 放在jdk bin目录下 二.项目中导入jacob.jar 包 三.设置好模板内容 四.测试代码 /*** 主方法测试* @param arg ...
- Python 使用docx库操作word文档中的表格单元格内容
1.导入库 from docx import Document 2.加载word文档对象 doc = Document(path) 3.定位表格 # 获取所有表格对象 tables = doc.tab ...
- Java web--利用java操作excel文档
在web应用程序的开发中,如果需要将Excel文档中的信息导入数据库或将数据库的信息导出到Excel文档中,需要应用程序访问Excel文件.目前,操作Excel文档的java组件主要有Jxl和POI两 ...
- java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例
之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了.于是乎我在学会用Java在后 ...
- java用poi导出word,Java使用POI导出Word文档的操作教程,poiword
Java使用POI导出Word文档的操作教程,poiword 一.主要pom依赖 org.apache.poi poi-ooxml 3.16 二.需要导出word模板 三.相关导出代码 package ...
最新文章
- 将socket设置为非阻塞(non-blocking) - 艾子的日志 - 网易博客
- pandas 排序 给excel_懂Excel轻松入门Python数据分析包pandas(二十五):循环序列分组...
- 低代码发展专访系列之一:低代码平台产品的使用者都是谁?
- mysql 用户管理表_mysql用户管理
- windows php5.3升级,Windows10系统将PHPNOW升级PHP版本为5.3.5
- 怎样看pytorch源码最有效?
- 从零基础入门Tensorflow2.0 ----一、2. 实战回归模型
- linux下socket调试,linux下socket调试
- 外接显示器,多屏幕显示,出现鼠标移动缓慢,卡顿
- processing demo
- 电脑朋友圈,PC玩朋友圈,真的来了
- comsol移动网格_COMSOL动网格调试
- IP138 IP地址查询 php实例
- AWS Account
- react Hook useContext()
- 清华大学(深圳)吕帅课题组招收计算机领域博士后
- 【104】ntvdm.exe占内存极大的问题
- 前端开发实习笔试题(简答题)
- [总结]CDQ分治整体二分
- 服务器负载不高 响应慢_一篇读懂分布式架构下的负载均衡