Apache POI是的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
结构:
HSSF - 提供读写格式档案的功能。
XSSF - 提供读写 Excel 格式档案的功能。
HWPF - 提供读写格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写格式档案的功能。
其实使用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", "p_w_upload; 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三个包