package com.jingsky.mv.util;
import com.jingsky.util.common.CollectionUtil;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.DateUtil;
import java.io.*;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
/**
* 封装对excel的操作,包括本地读写excel和流中输出excel,支持office 2007。
* 依赖于poi-3.9-20121203.jar,poi-ooxml-3.9-20121203.jar,poi-ooxml-schemas-3.9-20121203.jar,dom4j-1.6.1.jar
* 有参构造函数参数为excel的全路径
* @author 老沙 QQ:862990787
*/
public class ExcelUtil {
// excel文件流
private InputStream inputStream;
/**
* 无参构造函数 默认
*/
public ExcelUtil() {
}
/**
* 有参构造函数
*/
public ExcelUtil(InputStream inputStream) {
this.inputStream= inputStream;;
}
/**
* 读取某个工作簿上的所有单元格的值。
* 作者:朱志杰
* July 30, 2013 3:27:08 PM
* @param sheetOrder 工作簿序号,从0开始。
* @return List<Object[]> 所有单元格的值。
* @throws IOException 加载excel文件IO异常。
* @throws FileNotFoundException excel文件没有找到异常。
* @throws InvalidFormatException
*/
public List<Object[]> read(int sheetOrder) throws FileNotFoundException, IOException, InvalidFormatException{
Workbook workbook = WorkbookFactory.create(this.inputStream);
if(this.inputStream != null) {
this.inputStream.close();
}
Sheet sheet = workbook.getSheetAt(sheetOrder);
//用来记录excel值
List<Object[]> valueList=new LinkedList<Object[]>();
//循环遍历每一行、每一列。
for(Row row : sheet){
//每一行
Object[] rowObject=null;
//System.out.println(row.getLastCellNum());
for(int i=0 ;i<row.getLastCellNum();i++){
Cell cell=row.getCell(i);
//System.out.println(cell==null);
if(cell==null){
rowObject= CollectionUtil.addToArray(rowObject, "");
continue;
}
//cell.getCellType是获得cell里面保存的值的type
switch(cell.getCellType()){
case Cell.CELL_TYPE_BOOLEAN:
//得到Boolean对象的方法
rowObject=CollectionUtil.addToArray(rowObject, cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
//先看是否是日期格式
if(DateUtil.isCellDateFormatted(cell)){
//读取日期格式
rowObject=CollectionUtil.addToArray(rowObject, new com.jingsky.util.common.DateUtil(cell.getDateCellValue()).toLongDate());
}else{
DecimalFormat df = new DecimalFormat();
//单元格的值,替换掉,
String value=df.format(cell.getNumericCellValue()).replace(",","");
//读取数字
rowObject=CollectionUtil.addToArray(rowObject, value);
}
break;
case Cell.CELL_TYPE_FORMULA:
//读取公式
rowObject=CollectionUtil.addToArray(rowObject, cell.getCellFormula());
break;
case Cell.CELL_TYPE_STRING:
//读取String
rowObject=CollectionUtil.addToArray(rowObject, cell.getRichStringCellValue().toString());
break;
default:
//读取String
rowObject=CollectionUtil.addToArray(rowObject, cell.getRichStringCellValue().toString());
}
}
//将这行添加到list。
valueList.add(rowObject);
}
return valueList;
}
/**
* 读取某个工作簿上的某个单元格的值。
* 作者:朱志杰
* Sep 19, 2012 3:27:08 PM
* @param sheetOrder 工作簿序号,从0开始。
* @param colum 列数 从1开始
* @param row 行数 从1开始
* @return 单元格的值。
* @throws Exception 加载excel异常。
*/
public String read(int sheetOrder,int colum, int row) throws Exception {
Workbook workbook = WorkbookFactory.create(this.inputStream);
if(this.inputStream != null) {
this.inputStream.close();
}
Sheet sheet = workbook.getSheetAt(sheetOrder);
Row rows = sheet.getRow(row-1);
Cell cell = rows.getCell(colum-1);
String content = cell.getStringCellValue();
return content;
}
}