1 POI读取excel
Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和PowerPoint用程序动态操作的应用较少。那么本文就结合POI来介绍一下操作Excel的方法。
Office 2007的文件结构完全不同于2003,所以对于两个版本的Office组件,POI有不同的处理API,分开使用即可。首先来说几个Excel的基本概念。对于一个Excel文件,这称为一个工作簿(Workbook),打开Excel之后,在下方会有sheet1/2/3这样的选项卡,点击可以切换到不同的sheet中,这个sheet称作工作表。每个工作表就是我们编辑的区域,这是一张二维表,阿拉伯数字控制行数,从1开始,而程序中还是0,类似数组和集合。字母控制列数,从A开始,Z以后是两个字母控制。对于每一行,我们称为Row,列就是Column,行列可以确定唯一的一个元素,那么就是单元格,称为Cell。
下面从读取Excel开始,首先建立一个Excel 2003以下版本的xls文件。设定几列来看。来存储学生信息的Excel表如下:
姓名 | 性别 | 年龄 |
张三 | 男 | 20 |
李四 | 女 | 23 |
王五 | 男 | 22 |
这里的姓名,性别和班级是文本值,而年龄和成绩是数字值,这在设计对象和处理时要注意区分。那么可以如下设计这个对象:
创建student类
package poi_test;
/**
* 学生类
* @author Administrator
*
*/
publicclass student {
private String name;//姓名
private String sex;//性别
privateintage;//年龄
public student(){
}
public student(String name, String sex, int age){
this.name=name;
this.sex=sex;
this.age=age;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
public String getSex() {
returnsex;
}
publicvoid setSex(String sex) {
this.sex = sex;
}
publicint getAge() {
returnage;
}
publicvoid setAge(int age) {
this.age = age;
}
public String getInfo(){
return"student info:"+name+" "+sex+" "+age;
}
}
以下读取excel
package poi_test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* 读取excel
* @author Administrator
*
*/
publicclass readExcel {
privatestatic String xls2003="C:\\student.xls";
privatestatic String xls2007="C:\\student.xlsx";
privatestatic List<student> readfromexcel2003(String filePath){
File excelFile = null;//excel文件对象
InputStream is = null;//输入流
String cellStr = null;//单元格的值
List<student> studentlist = new ArrayList<student>();
student student = null;
try{
excelFile = new File(filePath);
is = new FileInputStream(excelFile);
HSSFWorkbook workbook2003 = new HSSFWorkbook(is);//创建excel文件对象
HSSFSheet sheet = workbook2003.getSheetAt(0);//取出第一个工作表
int rows = sheet.getLastRowNum();//一共有多少行
for (int i = 1; i <= rows; i++) {
//不处理表头所以从1开始
student = new student();
HSSFRow row = sheet.getRow(i);// 获取行信息
if(row==null){
continue;
}
int cellnums = row.getLastCellNum();//没一行有多少列即多少单元格
for (int j = 0; j < cellnums; j++) {
HSSFCell cell = row.getCell(j);
if(cell==null){
cellStr = "";
}elseif (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理
cellStr = String.valueOf(cell.getBooleanCellValue());
} elseif (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理
cellStr = cell.getNumericCellValue() + "";
} else {
cellStr = cell.getStringCellValue();
}
if(j==0){
student.setName(cellStr);
}elseif(j==1){
student.setSex(cellStr);
}else{
student.setAge(new Double(cellStr).intValue());
}
}
studentlist.add(student);
}
}catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}finally{
if(is!=null){
try{
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
return studentlist;
}
publicstaticvoid main(String[] args) {
long start = System.currentTimeMillis();
List<student> list = readfromexcel2003(xls2003);
for (student stu : list) {
System.out.println(stu.getInfo());
}
long end = System.currentTimeMillis();
System.out.println((end - start) + " ms done!");
}
}
2 POI写入excel数据
下面来做简单的文件写入,也就是准备输入写入Excel文件,为了演示,直接创建对象,而实际应用中数据可以是来自数据库的。写入文件就是文件解析的逆过程。但POI的组件不是从单元格开始创建文件的,还是从工作簿开始创建,进而创建工作表,行和单元格,最终将整个工作簿写入文件,完成操作。
package poi_test;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
publicclass writeExcel {
privatestatic String xls2003="d:\\student.xls";
privatestatic String xls2007="d:\\student.xlsx";
privatestatic List<student> studentList = null;
privatestatic student[] students = new student[4];
/**
* 静态块初始化数据
*/
static {
studentList = new ArrayList<student>();
students[0] = new student("张三", "男", 23);
students[1] = new student("李四", "女", 20);
students[2] = new student("王五", "男", 21);
students[3] = new student("赵六", "女", 22);
studentList.addAll(Arrays.asList(students));
}
/**
* 写入excel数据
* @param filePath
*/
publicstaticvoid writeExcel2003(String filePath) {
// 先创建工作簿对象
HSSFWorkbook workbook2003 = new HSSFWorkbook();
// 创建工作表对象并命名
HSSFSheet sheet = workbook2003.createSheet("学生信息统计表");
sheet.setDefaultColumnWidth(30);//设置单元格宽度
sheet.setDefaultRowHeightInPoints(40);//设置单元格默认高度
HSSFRow row1 = sheet.createRow(0);
row1.setHeight((short)300);
HSSFCell nameCellone = row1.createCell(0);
nameCellone.setCellValue("姓名");
HSSFCell sexCellone = row1.createCell(1);
sexCellone.setCellValue("性别");
HSSFCell ageCellone = row1.createCell(2);
ageCellone.setCellValue("年龄");
for (int i = 1; i <=studentList.size(); i++) {
// 取出Student对象
student student = studentList.get(i-1);
// 创建行
HSSFRow row = sheet.createRow(i);
// 开始创建单元格并赋值
HSSFCell nameCell = row.createCell(0);
nameCell.setCellValue(student.getName());
HSSFCell sexCell = row.createCell(1);
sexCell.setCellValue(student.getSex());
HSSFCell ageCell = row.createCell(2);
ageCell.setCellValue(student.getAge());
}
// 生成文件
File file = new File(filePath);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
workbook2003.write(fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* @param args
*/
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
long start = System.currentTimeMillis();
writeExcel2003(xls2003);
long end = System.currentTimeMillis();
System.out.println((end - start) + " ms done!");
}
}