Excel的两种形式
目前世面上的Excel分为两个大的版本Excel2003和Excel2007及以上两个版本,两者之间的区别如下:
|
Excel 2003 |
Excel 2007 |
后缀 |
xls |
xlsx |
结构 |
二进制格式,其核心结构是复合文档类型的结构 |
XML类型结构 |
单sheet数据量 |
行:65535;列:256 |
行:1048576;列:16384 |
特点 |
存储容量有限 |
基于xml压缩,占用空间小操作效率高 |
Excel2003是一个特有的二进制格式,其核心结构是复合文档类型的结构,存储数据量较小;Excel2007 的核心结构是 XML 类型的结构,采用的是基于 XML 的压缩方式,使其占用的空间更小,操作效率更高
Java 常见excel操作工具
Java中常见的用来操作Excl的方式一般有2种:JXL和POI。
JXL只能对Excel进行操作,属于比较老的框架,它只支持到Excel 95-2000的版本。现在已经停止更新和维护。 POI是apache的项目,可对微软的Word,Excel,Ppt进行操作,包括office2003和2007,Excl2003和2007。poi现在 一直有更新。所以现在主流使用POI。
POI的概述
Apache POI是Apache软件基金会的开源项目,由Java编写的免费开源的跨平台的 Java API,Apache POI提供API
给Java语言操作Microsoft Office的功能。
POI的应用场景
- 数据报表生成
- 数据备份
- 数据批量上传
POI的入门操作
搭建环境
1、导包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
API说明
HSSF提供读写Microsoft Excel XLS格式档案的功能。 2003版本
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。2007版本
名称 |
说明 |
workbook |
Excel的文档对象,针对不同的Excel类型分为:HSSFWorkbook(2003)和XSSFWorkbool(2007) |
Sheet |
Excel的表单 |
Row |
Excel的行 |
Cell |
Excel的子单元格 |
Font |
Excel的字体 |
CellStyle |
单元格样式 |
POI的使用
创建Excel
public class PoiTest {
/**
* 创建excel:
* 1.创建工作簿
* 2.创建sheet
* 3.创建行对象
* 4.创建单元格
* 5.对单元格赋值
* 6.设置样式
* 7.下载
*/
@Test
public void test() throws Exception {
//1.创建一个工作簿
//Workbook wb = new HSSFWorkbook(); //处理excel2003版本 .xls
Workbook wb = new XSSFWorkbook();//处理excel2007及以上版本 .xlsx
//new SXSSFWorkbook();// 处理大数据量excel报表对象
//2.创建sheet
Sheet sheet = wb.createSheet("test");
//3.创建行对象
Row row = sheet.createRow(1);//接受参数 ,数组下标
//4.创建单元格
Cell cell = row.createCell(1);//数组下表
//5.设置单元格内容
cell.setCellValue("test");
//设置样式
/**
* 1.创建样式对象
* 2.通过样式对象指定样式
* 3.配置单元个样式
*/
CellStyle cellStyle = wb.createCellStyle();
//通过样式对象指定样式
cellStyle.setBorderTop(BorderStyle.THIN); //细线
cellStyle.setBorderBottom(BorderStyle.THIN); //细线
cellStyle.setBorderLeft(BorderStyle.THIN); //细线
cellStyle.setBorderRight(BorderStyle.THIN); //细线
//字体 对象
Font font = wb.createFont();
font.setFontName("华文行楷");
font.setFontHeightInPoints((short)26);//字号
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
//指定行高和列宽
sheet.setColumnWidth(1,20*256); //列宽 不准确!!!
row.setHeightInPoints(30);
//6.将excel保存到本地磁盘中
FileOutputStream fos = new FileOutputStream("D:\\poitest.xlsx");
wb.write(fos);
fos.close();
}
}
读取Excel
public class PoiTest02 {
@Test
public void test() throws Exception {
//1.根据excel文件加载工作簿
Workbook wb = new XSSFWorkbook("D:\\poitest.xlsx");
//2.读取第一个sheet
Sheet sheet = wb.getSheetAt(0);//数组下标
//3.循环sheet中的每一行
//sheet.getLastRowNum 获取最后一行的数组下标
for(int i=0;i<sheet.getLastRowNum()+1;i++) {
Row row = sheet.getRow(i);
//row.getLastCellNum() 获取最大行数
//4.读取行中的每一个单元格
String str = "";
for(int j=0;j<row.getLastCellNum();j++) {
Cell cell = row.getCell(j);
//5.获取单元格中的数据
if(cell != null) {
str += getCellValue(cell);
}
}
System.out.println(str);
}
}
public Object getCellValue(Cell cell) {
//获取单元格的类型
CellType type = cell.getCellType();
Object result = null;
switch (type) {
case STRING:{
result = cell.getStringCellValue();//获取string类型数据
break;
}
case NUMERIC:{
//判断
if(DateUtil.isCellDateFormatted(cell)) { //日期格式
result = cell.getDateCellValue();
}else{
//double类型
result = cell.getNumericCellValue(); //数字类型
}
break;
}
case BOOLEAN:{
result = cell.getBooleanCellValue();//获取boolean类型数据
break;
}
default:{
break;
}
}
return result;
}
}