运用android listener监听模式设计excel的读取
熟悉java开发的人想必不会对监听模式陌生,在android的应用层的设计中,普遍采用这种监听模式(点击事件、Touch事件等)
本人最近研究android sdk源代码发现这是一种对api很好的封装的模式,您在写接口或是工具类时运用这种模式会有意想不到的收获。
现学现用我运用这种模式对读取excel的类进行了封装,简单的封装了一个通用的excel读取类。
1、首先声明一个监听接口,接口中定义getData方法用于获得数据
package com.excel;
public interface ExcelDataListener {
/**
* 获得excel数据
* @param data 获得excel内容
* @param sheet excel文档的sheet
*/
public abstract void getData(String data, String sheet);
}
package com.excel;
public interface ExcelDataListener {
/**
* 获得excel数据
* @param data 获得excel内容
* @param sheet excel文档的sheet
*/
public abstract void getData(String data, String sheet);
}
2、实现excel文档读取类
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;
}
}
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函数。
3、测试类
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);
}
}
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);
}
}