项目需求,需要解析Excel的xls文件,网上的资料大都是jxl与poi,权衡之下选择了poi进行解析。
1.首先去下载poi的jar包,CSDN上的资源很多,自行下载
2.编辑好Excel的xls文件放入SD卡
3.进行代码解析,上代码:
/**
* 获得单元格中的内容
*
* @param cell
* @return
*/
private Object getCellString(HSSFCell cell) {
Object result = null;
if (cell != null) {
int cellType = cell.getCellType();
switch (cellType) {
case HSSFCell.CELL_TYPE_STRING:
result = cell.getRichStringCellValue().getString();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
// result = cell.getNumericCellValue();
DecimalFormat df = new DecimalFormat("0"); //防止变成科学计数法,强制转换
result = df.format(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
result = cell.getNumericCellValue();
break;
case HSSFCell.CELL_TYPE_ERROR:
result = null;
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
result = cell.getBooleanCellValue();
break;
case HSSFCell.CELL_TYPE_BLANK:
result = null;
break;
}
}
return result;
}
/**
* 获取表中数据
* @param workbook HSSFWorkbook对象
* @param sheetNumber 表格索引(EXCEL 是多表文档,所以需要输入表索引号)
* @return 由LIST构成的行和列
* @throws FileNotFoundException
* @throws IOException
*/
public List getDatasFromSheet(HSSFWorkbook workbook, int sheetNumber)
throws FileNotFoundException, IOException {
List result = new ArrayList();
// 获得指定的表
HSSFSheet sheet = workbook.getSheetAt(sheetNumber);
// 获得数据总行数
int rowCount = sheet.getLastRowNum();
if (rowCount
return result;
}
// 逐行读取数据
for (int rowIndex = 0; rowIndex <= rowCount; rowIndex++) {
// 获得行对象
HSSFRow row = sheet.getRow(rowIndex);
if (row != null) {
List rowData = new ArrayList();
// 获得本行中单元格的个数
int columnCount = row.getLastCellNum();
// 获得本行中各单元格中的数据
for (short columnIndex = 0; columnIndex
@SuppressWarnings("deprecation")
HSSFCell cell = row.getCell(columnIndex);
// 获得指定单元格中数据
Object cellStr = getCellString(cell);
rowData.add(cellStr);
}
result.add(rowData);
}
}
return result;
}
/**
* 解析XLS文件任务
* @author Robin
* time 2015-01-19 14:40:59
*
*/
private class ParseXlsFileTask extends AsyncTask>{
@Override
protected List doInBackground(String... params) {
String fileName=params[0];
try {
HSSFWorkbook workbook = new HSSFWorkbook(
new FileInputStream(fileName));
List objects=getDatasFromSheet(workbook,0);
LogUtils.i("解析结果:"+objects.toString());
return objects;
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPreExecute() {
DialogUtils.showAlertDialog(progressDialog);
super.onPreExecute();
}
@Override
protected void onPostExecute(List result) {
DialogUtils.DismissProgressDialog(progressDialog);
if (!ListUtils.isEmpty(result)) {
onParseXLSListener.onParseXLSSuccess(result);
}
super.onPostExecute(result);
}
}
/**
* 设置解析XLS文件回调接口
* @param onParseXLSListener
*/
public void setOnParseXLSListener(OnParseXLSListener onParseXLSListener){
this.onParseXLSListener=onParseXLSListener;
}
4.调用的时候传入xls文件的路径:
String fileName = xlsDatas.get(position).getXlsPath();
new ParseXlsFileTask().execute(fileName); //执行XLS文件解析任务解析
以上代码要注意的是,xls文件表格中如果有较长的数字的话,不管是什么类型,poi都会解析成double类型的数字,会以科学计数法显示,对这种情况需要强制转化一下
DecimalFormat df = new DecimalFormat("0"); //防止变成科学计数法,强制转换
result = df.format(cell.getNumericCellValue());
至此,解析目的达成。
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/6934.html
微信打赏
支付宝打赏
感谢您对作者wangbin的打赏,我们会更加努力! 如果您想成为作者,请点我