java 读取excel

package com.inspur.commonCode.util.dataImport;


import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class ExcelImportUtil {
private volatile static ExcelImportUtil excelImportUtil = null;


public static ExcelImportUtil getInstance() {
if (excelImportUtil == null) {
excelImportUtil = new ExcelImportUtil();
}
return excelImportUtil;
}


/**
* 要读取的excel文件的数据 例如: A B C D E F 11 12 14 15 16 21 23 25 26 ... ...
* 有些行的部分列为空,但其后面的列又有值

*  修改异常处理,如果解析异常,则抛出。
* @dis:lxl add 该方法针对的是,只有一个sheet的文件。将其内容读出,每行数据放置到一个String[]
*          数组中,然后将数组放到list中,将list返回。
*/
public List<String[]> getExcelStringArraySheetOne(InputStream is,
String version) {
if (version == null) {
version = "version2003";
}
// 声明集合 List<String[]> ,
// List<String[]> 的元素 行数组String[]为excel中的每一行
List<String[]> list = new ArrayList<String[]>();


try {


Workbook hwk;
if ("version2003".equals(version)) {
// 将is流实例到 一个excel流里
hwk = new HSSFWorkbook(is);
} else if ("version2007".equals(version)) {
// 将is流实例到 一个excel流里
hwk = new XSSFWorkbook(is);
} else {
return null;
}


// 得到book第一个工作薄sheet
Sheet sh = hwk.getSheetAt(0);
// 总行数
int rows = sh.getLastRowNum() + 1 - sh.getFirstRowNum();
// System.out.println(rows);
int cols = 0;
for (int i = 0; i < rows; i++) {


Row row = sh.getRow(i);
// 如果空行 跳过
if (row == null)
continue;
if (i == 0) {
cols = row.getLastCellNum() - row.getFirstCellNum();
}// 该行的总列数


String[] str = new String[cols]; // 用来存放该行每一列的值
for (int j = 0; j < cols; j++) {
Object col = row.getCell(j);
// Object colNext = row.getCell((short)(j+1));
if (col != null) { // 该列不为空,直接读到 行数组里
str[j] = col.toString();
} else { // 该列为空
str[j] = null;
// 该列的后面一列不为空,用空字符串占位
/*
* if(colNext != null){ Object colValue = ""; str[j] =
* colValue.toString(); }
*/
}
}
list.add(str);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("解析Excel失败,错误原因为:" + e.getMessage());
}
return list;
}


/**
* @creator:李小龙
* @createDate:2014-7-18下午08:45:58
* @discription:上面的方法,只获取了第一个sheet的数据。该方法为获取所有sheet数据的方法。该方法的思路是
* @discription:将每个sheet的内容放到一个list中,然后将这些sheet对应的list 再放到一个list中,将其返回。
* @discription:每个sheet对应的list,第一条数据为该sheet的名字,第二条数据为该sheet的标题。从第三行开始,始为具体信息。
* @params:is 输入流、version 版本号,默认为2003
* @return:当解析失败时,会抛出异常,可根据业务情况对该异常处理。
* @modifyInfo:
*/
public List<List<String[]>> getExcelStringArrayNewSheetAll(InputStream is,
String version, Integer... sheetCount) {
if (version == null) {
version = "version2003";
}
// 声明集合 List<String[]> ,
// List<String[]> 的元素 行数组String[]为excel中的每一行


List<List<String[]>> sheetsList = new ArrayList<List<String[]>>();


try {


Workbook hwk;
if ("version2003".equals(version)) {
// 将is流实例到 一个excel流里
hwk = new HSSFWorkbook(is);
} else if ("version2007".equals(version)) {
// 将is流实例到 一个excel流里
hwk = new XSSFWorkbook(is);
} else {
return null;
}
int sheets = 0;
if (sheetCount != null && !"".equals(sheetCount)
&& sheetCount.length >= 1 && !"".equals(sheetCount[0]))
sheets = sheetCount[0];
else
sheets = hwk.getNumberOfSheets();
for (int k = 0; k < sheets; k++) {
List<String[]> list = new ArrayList<String[]>();
// 遍历工作薄sheet
Sheet sh = hwk.getSheetAt(k);
String sheetName = sh.getSheetName();
list.add(new String[] { sheetName });
// 总行数
int rows = sh.getLastRowNum() + 1 - sh.getFirstRowNum();
int cols = 0;
// System.out.println(rows);
for (int i = 0; i < rows; i++) {
Row row = sh.getRow(i);
// 如果空行 跳过
if (row == null)
continue;
if (i == 0)
cols = row.getLastCellNum() - row.getFirstCellNum();
String[] str = new String[cols]; // 用来存放该行每一列的值
for (int j = 0; j < cols; j++) {
Cell col = row.getCell(j);
// Object colNext = row.getCell((short)(j+1));
if (col != null) { // 该列不为空,直接读到 行数组里
String val = getCell(col);
str[j] = val;


} else { // 该列为空
str[j] = null;
// 该列的后面一列不为空,用空字符串占位
/*
* if(colNext != null){ Object colValue = ""; str[j]
* = colValue.toString(); }
*/
}
}
if (!processEmpty(str))
list.add(str);
}
sheetsList.add(list);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Excel文件解析失败,原因为:" + e.getMessage());
}
return sheetsList;
}


/**
* @creator:李小龙
* @createDate:2014-7-21下午03:06:11
* @discription:获取cell的值
* @params:
* @return:
* @modifyInfo:
*/
public String getCell(Cell cell) {
DecimalFormat df = new DecimalFormat("#");
if (cell == null)
return "";
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(
HSSFDateUtil.getJavaDate(cell.getNumericCellValue()))
.toString();
}
return df.format(cell.getNumericCellValue());
case HSSFCell.CELL_TYPE_STRING:
return cell.getStringCellValue();
case HSSFCell.CELL_TYPE_FORMULA:
return cell.getCellFormula();
case HSSFCell.CELL_TYPE_BLANK:
return "";
case HSSFCell.CELL_TYPE_BOOLEAN:
return cell.getBooleanCellValue() + "";
case HSSFCell.CELL_TYPE_ERROR:
return cell.getErrorCellValue() + "";
}
return "";
}


/**

* @creator:李小龙
* @createDate:2014-11-4上午11:24:06
* @discription:处理空数据
* @params:
* @return:
* @modifyInfo:
*/
boolean processEmpty(String[] values) {
int len = values.length;
int el = 0;
for (int i = 0; i < len; i++) {
String v = values[i];
if ((v == null)
|| ("null".equals(v.toLowerCase()) || ("".equals(v.trim())))) {
el = el + 1;
values[i] = "";
}
}
if (el == len)
return true;
return false;
}


public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream(
"C:/Users/Administrator/Desktop/正式模板.xls");
List<List<String[]>> list = ExcelImportUtil.getInstance()
.getExcelStringArrayNewSheetAll(is, null, 4);
System.err.println(list.size());
}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值