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的应用场景

  1. 数据报表生成
  2. 数据备份
  3. 数据批量上传

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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

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();
	}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
读取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;
	}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.