前言
再次回到我们的用户模块上,我们发现还有两个功能没有完成:
对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的。但是呢,在Java中操作excel是相对常用的,因此也有组件供我们使用
JAVA中操作Excel的有两种比较主流的工具包
- JXL
- POI
这次我们主要学习的是POI操作excel。
JXL有一个缺陷,只能操作03或以前版本的excel,而POI可以操作97-07版本的。
POI基础
面向对象看excel
首先,要用Java来操作excel的话,肯定用对象来指定excel相关的内容的。我们来看看excel由什么组成:
POI是这样看的:
- 整个excel称作为工作薄
- 工作薄下可以创建很多张表,称作为工作表
- 工作表有非常多的行
- 行又可细分单元格【指定行的列就可以定位到工作表任意的位置了】
给我们一顿分析以后,我们发现它们之间是有从属关系的:
- 工作表从属于工作薄
- 行从属于工作表
- 单元格从属于行
操作Excel步骤
导入POI开发包:
- poi-ooxml-3.10.1-20140818.jar,
- poi-ooxml-schemas-3.10.1-20140818.jar,
- 以及复制在ooxml-lib目录下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar【dom4j一般在项目导入的时候已经存在了】。
- poi-ooxml-3.11-20141221.jar
/**
* 使用POI1无非操作Excel无非就4个步骤:
*
* 创建/读取工作薄
* 创建/读取工作表
* 创建/读取行
* 创建/读取单元格
*
*
* */
创建Excel并写入数据
@Test
public void testWrite() throws IOException {
//创建工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = workbook.createSheet("我是新的工作表");
//创建行,坐标从0开始,我创建的是第三行
HSSFRow row = sheet.createRow(2);
//创建单元格,坐标也是从0开始,于是就是第三行第三列
HSSFCell cell = row.createCell(2);
//往单元格写数据
cell.setCellValue("helloWorld");
//把工作薄写到硬盘中
FileOutputStream outputStream = new FileOutputStream("C:\\工作薄.xls");
workbook.write(outputStream);
//关闭流
workbook.close();
outputStream.close();
}
读取Excel的数据
@Test
public void testRead() throws IOException {
//获取输入流,读取Excel数据
FileInputStream inputStream = new FileInputStream("C:\\工作薄.xls");
//创建工作薄
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
//得到工作表
HSSFSheet sheet = workbook.getSheetAt(0);
//得到行
HSSFRow row = sheet.getRow(2);
//得到单元格
HSSFCell cell = row.getCell(2);
//得到单元格的数据
String cellValue = cell.getStringCellValue();
System.out.println(cellValue);
}
03与07版本
- 03版本使用的是HSSFWorkbook这么一个类来操作03的Excel数据
- 07版本使用的是XSSFWorkbook这么一个类来操作07的Excel数据
其实他们的方法都是一样的,仅仅是类的不同。而使用哪个对象,我们可以根据后缀名来判断创建哪个对象【是03还是07】
@Test
public void testRead03And07Excel() throws Exception {
String fileName = "D:\\itcast\\测试.xlsx";
if(fileName.matches("^.+\\.(?i)((xls)|(xlsx))$")){
//判断是否excel文档
boolean is03Excel = fileName.matches("^.+\\.(?i)(xls)$");
FileInputStream inputStream = new FileInputStream(fileName);
//1、读取工作簿
Workbook workbook = is03Excel ?new HSSFWorkbook(inputStream):new XSSFWorkbook(inputStream);