运用android listener监听模式设计excel的读取java
熟悉java开发的人想必不会对监听模式陌生,在android的应用层的设计中,广泛采用这种监听模式(点击事件、Touch事件等)android
本人最近研究android sdk源代码发现这是一种对api很好的封装的模式,您在写接口或是工具类时运用这种模式会有意想不到的收获。apache
现学现用我运用这种模式对读取excel的类进行了封装,简单的封装了一个通用的excel读取类。api
一、首先声明一个监听接口,接口中定义getData方法用于得到数据数组
package com.excel; public interface ExcelDataListener { /** * 得到excel数据 * @param data 得到excel内容 * @param sheet excel文档的sheet */ public abstract void getData(String data, String sheet); }
二、实现excel文档读取类ide
package com.excel; import java.io.IOException; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Date; import java.util.HashMap; import java.util.Map; 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; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * 操做Excel表格的功能类 * 读取excel2003 * @version 1.0 */ public class ExcelReader2003 { private POIFSFileSystem fs; private HSSFWorkbook wb; private HSSFSheet sheet; private HSSFRow row; private ExcelDataListener mListener; //声明监听事件变量 public void setDataListener(ExcelDataListener l){ //设置监听 mListener = l; } /** * 读取Excel表格表头的内容 * * @param InputStream * @return String 表头内容的数组 * */ public String[] readExcelTitle(InputStream is) { try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (IOException e) { e.printStackTrace(); } sheet = wb.getSheetAt(0); row = sheet.getRow(0); // 标题总列数 int colNum = row.getPhysicalNumberOfCells(); String[] title = new String[colNum]; for (int i = 0; i < colNum; i++) { title[i] = getStringCellValue(row.getCell((short) i)); } return title; } /** * 读取Excel数据内容 * * @param InputStream * @return Map 包含单元格数据内容的Map对象 */ public Map<Integer, String> readExcelContent(InputStream is) { Map<Integer, String> content = new HashMap<Integer, String>(); try { fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); } catch (IOException e) { e.printStackTrace(); } for (int k = 0; k < wb.getNumberOfSheets(); k++) { String str = ""; sheet = wb.getSheetAt(k); // 获得总行数 int rowNum = sheet.getLastRowNum(); // 正文内容应该从第二行开始,第一行为表头的标题 for (int i = 0; i <= rowNum; i++) { row = sheet.getRow(i); if (row == null) continue; int colNum = row.getPhysicalNumberOfCells(); int j = 0; while (j < colNum) { // 每一个单元格的数据内容用"-"分割开,之后须要时用String类的replace()方法还原数据 // 也能够将每一个单元格的数据设置到一个javabean的属性中,此时须要新建一个javabean str += getStringCellValue(row.getCell((short) j)).trim() + "-"; j++; } mListener.getData(str, "sheet"+k); //触发监听事件 content.put(i, str); str = ""; } } return content; } /** * 获取单元格数据内容为字符串类型的数据 * * @param cell * Excel单元格 * @return String 单元格数据内容 */ private String getStringCellValue(HSSFCell cell) { if(cell == null) return""; String strCell = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: strCell = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: strCell = ""; break; default: strCell = ""; break; } if (strCell.equals("") || strCell == null) { return ""; } if (cell == null) { return ""; } return strCell; } /** * 获取单元格数据内容为日期类型的数据 * * @param cell * Excel单元格 * @return String 单元格数据内容 */ private String getDateCellValue(HSSFCell cell) { String result = ""; try { int cellType = cell.getCellType(); if (cellType == HSSFCell.CELL_TYPE_NUMERIC) { Date date = cell.getDateCellValue(); result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1) + "-" + date.getDate(); } else if (cellType == HSSFCell.CELL_TYPE_STRING) { String date = getStringCellValue(cell); result = date.replaceAll("[年月]", "-").replace("日", "").trim(); } else if (cellType == HSSFCell.CELL_TYPE_BLANK) { result = ""; } } catch (Exception e) { System.out.println("日期格式不正确!"); e.printStackTrace(); } return result; } /** * 得到Excel表中的内容 * * @param args *@return * @author zcg 2012-12-15 */ public Map<Integer, String> getContent(String path) { Map<Integer, String> map = null; try { // 对读取Excel表格内容测试 InputStream is2 = new FileInputStream(path); map = readExcelContent(is2); } catch (FileNotFoundException e) { System.out.println("未找到指定路径的文件!"); e.printStackTrace(); } return map; } public String[] getTitle(String path) { String[] title = null; try { // 对读取Excel表格标题测试 InputStream is = new FileInputStream(path); ExcelReader2003 excelReader = new ExcelReader2003(); title = excelReader.readExcelTitle(is); /* * System.out.println("得到Excel表格的标题:"); for (String s : title) { * System.out.print(s + " "); } */ } catch (FileNotFoundException e) { System.out.println("未找到指定路径的文件!"); e.printStackTrace(); } return title; } }
在此类中X行声明了ExcelDataListener的对象mListener;函数
关键在X行工具
mListener.getData(str, "sheet"+k); //触发监听事件测试
触发监听函数。也就是说没读取excel中的一行数据就会触发本类中须要实现的getData函数。设计
三、测试类
package com.excel; public class Test { private static String path = "D:\\ss.xls"; public static void main(String args[]){ ExcelReader2003 er = new ExcelReader2003(); er.setDataListener(new ExcelDataListener() { //设置监听事件 @Override public void getData(String data, String sheet) { System.out.println(sheet+data); //获得返回的excel中每行的数据 } }); er.getContent(path); } }