Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
结构:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
其实使用POI进行导入和导出非常简单,这里需要说明的是,此处只使用HSSF,即只能对Excel2003进行导入和导出,如果要对Excel2007以及更高版本的Excel,则需要使用XSSF
如何使用POI对Excel进行导入:
流程:得到workbook对象(即excel文件)--> 根据workbook对象得到sheet对象(即工作薄对象) --> 根据sheet对象得到row对象(即行对象) --> 根据row对象得到cell对象(即单元格对象)
下面使用grails举例,与java语言类似
1.在页面处定义一个type为file的input
2.得到这个文件的输入流
def excelFile = request.getFile(‘content‘) //获得Excel文件
def is = excelFile.getInputStream() //获得文件输入流
3.构造workbook对象,把输入流作为参数构造workbook对象
def workbook = new HSSFWorkbook(is)
4.构造sheet对象,根据工作薄名字构造sheet对象
HSSFSheet sheet = workbook.getSheet("工资表")
5.得到最后的行序号,对所有的行进行迭代
def currPosition = 0
StringBuffer buffer = new StringBuffer()
while(true){
if(currPosition > sheet.getLastRowNum()){
break
else{
int row = currPosition;
currPosition ++
//抓取当前行数据
buffer.append(getLine(sheet, row)).append("\r");
}
}
//读取每一行数据的方法
String getLine(HSSFSheet sheet, int row){
//根据行数取得sheet的一行
HSSFRow rowline = sheet.getRow(row);
//获取当前行的列数
int filedColumns = rowline.getLastCellNum();
HSSFCell cell = null;
StringBuffer buffer = new StringBuffer();
String cellvalue = null
//迭代当前行的每一列,得到所有列的值
for(int i =0; i < filedColumns; i++){
cell = rowline.getCell((short)i);
cellvalue = ExcelTool.getCellValue(cell);
buffer.append(cellvalue).append("\t");
}
return buffer.toString();
}
//抓取每一个单元格的工具方法
class ExcelTool {
public static String getCellValue(HSSFCell cell) {
String value = "";
if (null == cell)
return value;
switch (cell.getCellType()) {
//分析单元格数据类型
case Cell.CELL_TYPE_STRING://字符串类型
value = (cell.getStringCellValue() == null) ? "" : cell
.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC://数值类型
//数值类型也分为日期类型和普通数值类型
if(HSSFDateUtil.isCellDateFormatted(cell)){
Date date = cell.getDateCellValue()
value = date.format("yyyy-MM-dd")
}else{
value = CommonTool.NVL(String.valueOf(cell.getNumericCellValue()), "0");
}
break;
//公式类型(此处如果使用getNumericCellValue()方法进行抓取,那么得到的数据将是公式的
//字面值,而不是公式本身)
case Cell.CELL_TYPE_FORMULA:
BigDecimal bd = new BigDecimal(cell.getNumericCellValue())
bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP)
value = String.valueOf(bd);
break;
//布尔类型
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue() + "";
break;
//错误类型
case Cell.CELL_TYPE_ERROR:
value = cell.getErrorCellValue() + "";
break;
//其他类型
default:
break;
}
return value;
}
}
6.此时excel表的数据已经完全导入到程序里面,那么如何处理就看业务需要了
如何使用POI对Excel进行导出:
流程:构造一个空文件对象--> 根据文件对象构造一个空的输出流 --> --> 构造sheet对象 --> 根据sheet对象得到row对象(即行对象) --> 根据row对象得到cell对象(即单元格对象)--> 单元格内填充值
下面使用grails举例,与java语言类似
1.File file = new File("工资表"); //构造文件对象
2.FileOutputStream fos = new FileOutputStream(file);//构造文件输出流对象
3.HSSFWorkbook wb = new HSSFWorkbook(); // 构造workbook对象
4.HSSFSheet sheet = wb.createSheet("工资表"); // 构造工作薄对象
5.HSSFRow row1 = sheet.createRow(0); // 构造行对象
6.HSSFCell cellA1 = row1.createCell(0, Cell.CELL_TYPE_STRING);//构造单元格对象
7.cellA1.setCellValue("工资表"); //在单元格内填充值
8.wb.write(fos); // 把workbook对象写入到输出流
9.fos.close();// 关闭输出流
10.在响应中设置文件头和内容类型,表示响应的是一个excel表格类型
response.setHeader("Content-disposition", "attachment; fileName=" + new String(fileName.getBytes("utf-8"),"iso8859-1"))
response.contentType = "application/x-rarx-rar-compressed"
11.把文件写出到响应中,响应到页面进行下载
def out = response.outputStream
def inputStream = new FileInputStream(file)
byte[] buffer = new byte[1024]
int i = -1
while ((i = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, i)
}
out.flush()
out.close()
inputStream.close()
ps:此处javaJDK版本为1.7,POI版本为3.7,使用POI需要导poi-3.7-20101029.jar,poi-ooxml-3.7-20101029.jar,poi-ooxml-schemas-3.7-20101029.jar三个包