您的位置:首页 > 编程语言 > Java开发

Java读取MicrosoftOffice Excel的内容

2016-05-30 17:32 344 查看
Java读取MicrosoftOffice Word的内容

用到的jar包:

poi-3.9.jar,
stax2-api.jar,
xmlbeans-2.3.0.jar,:
poi-ooxml-3.9.jar,
poi-ooxml-schemas-3.9-20121203.jar,
dom4j-1.6.1.jar,


下载地址:

http://download.csdn.net/detail/capmiachael/9535646

- 例1:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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.ss.usermodel.WorkbookFactory;
import org.springframework.web.multipart.MultipartFile;

public class MicroOfficeFile {

public Workbook readExcel(File file) {
Workbook wb = null; //用Workbook是读取Excel2003、2007的通用方法。
try {
//          InputStream ins = file.;
wb = WorkbookFactory.create(file);
} catch (IOException e) {
System.out.println("获取文档数据流出错。");
e.printStackTrace();
} catch (InvalidFormatException e) {
System.out.println("创建Excel文件出错。");
e.printStackTrace();
} catch (IllegalArgumentException e) {
System.out.println("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
System.out.println("这不是一个Excel文件");
}
return wb;
}

public Workbook readExcel(MultipartFile multipartFile) {
//      multipartFile.getName();    //得到的是<input type="file">的name属性值。
//      System.out.println(multipartFile.getOriginalFilename() +" uploaded! "); //获取文件名
Workbook wb = null; //用Workbook是读取Excel2003、2007的通用方法。
try {
InputStream ins = multipartFile.getInputStream();
wb = WorkbookFactory.create(ins);
} catch (IOException e) {
System.out.println("获取文档数据流出错。");
e.printStackTrace();
} catch (InvalidFormatException e) {
System.out.println("创建Excel文件出错。");
e.printStackTrace();
} catch (IllegalArgumentException e) {
System.out.println("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
System.out.println("这不是一个Excel文件");
}
return wb;
}

/**
* 取Excel所有数据,包含header
* @return List<String[]>
*/
public List<String[]> getAllData(Workbook wb, int sheetIndex) {
List<String[]> dataList = new ArrayList<String[]>();
int columnNum = 0;
Sheet sheet = wb.getSheetAt(sheetIndex);
if (sheet.getRow(0) != null) {
columnNum = sheet.getRow(0).getLastCellNum() - sheet.getRow(0).getFirstCellNum();
}
if (columnNum > 0) {
for (Row row : sheet) {
String[] singleRow = new String[columnNum];
int n = 0;
for (int i = 0; i < columnNum; i++) {
Cell cell = row.getCell(i, Row.CREATE_NULL_AS_BLANK);
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK:
singleRow
= "";
break;
case Cell.CELL_TYPE_BOOLEAN:
singleRow
= Boolean.toString( cell.getBooleanCellValue() );
break;
// 数值
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {   //判断是否是日期
Date date = cell.getDateCellValue();
singleRow
= DateTransform.Date2String(date, "yyyy-MM-dd HH:mm:ss");
} else {
cell.setCellType(Cell.CELL_TYPE_STRING);
String temp = cell.getStringCellValue();
// 判断是否包含小数点,如果不含小数点,则以字符串读取,如果含小数点,则转换为Double类型的字符串
if (temp.indexOf(".") > -1) {
singleRow
= String.valueOf( new Double(temp) ).trim();
} else {
singleRow
= temp.trim();
}
}
break;
case Cell.CELL_TYPE_STRING:
singleRow
= cell.getStringCellValue().trim();
break;
case Cell.CELL_TYPE_ERROR:
singleRow
= "";
break;
case Cell.CELL_TYPE_FORMULA:
cell.setCellType(Cell.CELL_TYPE_STRING);
singleRow
= cell.getStringCellValue();
if (singleRow
!= null) {
singleRow
= singleRow
.replaceAll("#N/A", "").trim();
}
break;
default:
singleRow
= "";
break;
}
n++;
}
if ("".equals(singleRow[0])) {
continue;
}// 如果第一行为空,跳过
dataList.add(singleRow);
}
}
return dataList;
}
}
public static void main(String [] args){
MicroOfficeFile mof = new MicroOfficeFile();
String filepath = "E:\\001.xls";
Workbook wb = mof.readExcel(filepath);
List<String[]> list = mof.getAllData(wb, 0);
return list;//不需要的不分可用sublist()截取,例如:return list.sublist(1, list.size()-3),第一行
//以及最后三行不要

}

}


注意:

sheet.getLastRowNum()和getLastCellNum();

返回值经常与我们预期的不一致。

原因:

当单元格设置了格式后,填入值,又删除,但此时有些格式信息没有跟着删除,这时getLastRowNum返回的值就会大于我们预期的值。

只有单元格没设置格式时才能正确获取值,因此就需要我们去利用单元格内容判断,如:某一列或几列是否有数据。较为麻烦,但也是可行的。

例2:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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;

/**
* 读取Excel
*
* @author Michael
*/
public class ReadBusExcelUtils {
//  private Logger logger = LoggerFactory.getLogger(ReadBusExcelUtils.class);
private Workbook wb;
private Sheet sheet;
private Row row;

public ReadBusExcelUtils(String filepath) {
if (filepath == null) {
return;
}
String ext = filepath.substring(filepath.lastIndexOf("."));
try {
InputStream is = new FileInputStream(filepath);
if (".xls".equals(ext)) {
wb = new HSSFWorkbook(is);
} else if (".xlsx".equals(ext)) {
wb = new XSSFWorkbook(is);
} else {
wb = null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
//          logger.error("FileNotFoundException", e);
} catch (IOException e) {
e.printStackTrace();
//          logger.error("IOException", e);
}
}

/**
* 读取Excel数据内容
*
* @param InputStream
* @return Map 包含单元格数据内容的Map对象
* @author Michael
*/
public ArrayList<ArrayList<Object>> readExcelContent() throws Exception {
if (wb == null) {
throw new Exception("Workbook对象为空!");
}
ArrayList<ArrayList<Object>> content = new ArrayList<ArrayList<Object>>();
int sheetsNum = wb.getNumberOfSheets(); // 获取Sheet的个数
for (int index = 0; index < sheetsNum; index++) {
sheet = wb.getSheetAt(index);
// 得到当前sheet总行数
int rowNum = sheet.getLastRowNum();
row = sheet.getRow(0);
int colNum = row.getPhysicalNumberOfCells();
for (int i = 5; i <= rowNum; i++) {
row = sheet.getRow(i);
int j = 0;
ArrayList<Object> cellValue = new ArrayList<Object>();
while (j < colNum) {
Object obj = null;

switch (j) {// 对第10,11,12列的数据进行取整操作
case 10:
case 11:
case 12:
obj = getCellFormatValue(row.getCell(j), 0);
break;
default:
obj = getCellFormatValue(row.getCell(j), 4);// 其他情况数字保留四位小数
}
cellValue.add(obj);
// System.out.println(j+"----"+cellValue);
j++;

}
if (cellValue.get(1) != "")
content.add(cellValue);
}
sheet = null;
}
return content;
}

/**
* 根据Cell类型设置数据,如果是数字,小数点后保留DotNum位
*
* @param cell
* @param DotNum
*            :需要保留的小数位数,若为0,取整。
* @return
*/
private Object getCellFormatValue(Cell cell, int DotNum) {
Object cellvalue = "";
if (cell != null) {
// 判断当前Cell的Type
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:// 如果当前Cell的Type为NUMERIC
case Cell.CELL_TYPE_FORMULA: { // 判断当前的cell是否为Date
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 对日期进行格式化
cellvalue = df.format(date);
} else {// 如果是纯数字

String Datatype = "#####0";
switch (DotNum) {
case 1:
Datatype = "#####0.#";
break;
case 2:
Datatype = "#####0.##";
break;
case 3:
Datatype = "#####0.###";
break;
case 4:
Datatype = "#####0.####";
break;
case 5:
Datatype = "#####0.#####";
break;
case 6:
Datatype = "#####0.######";
break;
default:
break;
}

DecimalFormat df = new DecimalFormat(Datatype);// 浮点数格式化对象---整数保留原样,小数最多保留到第四位
cellvalue = String.valueOf(df.format(
cell.getNumericCellValue()).toString());
}
break;
}
case Cell.CELL_TYPE_STRING:// 如果当前Cell的Type为STRING
cellvalue = cell.getRichStringCellValue().getString().trim();// 取得当前的Cell字符串,删去字符串首尾的空格
break;
case Cell.CELL_TYPE_BOOLEAN:// 如果当前是Boolean型
cellvalue = Boolean.toString(cell.getBooleanCellValue());
break;
default:// 默认的Cell值
cellvalue = "";
}
} else {
cellvalue = "";
}
return cellvalue;
}

public static void main(String[] args) {
try {
String filepath = "E:\\001.xls";
ReadBusExcelUtils excelReader = new ReadBusExcelUtils(filepath);
/**
* 打印Excel表格内容
*/
ArrayList<ArrayList<Object>> array = excelReader.readExcelContent();
System.out.println("--------------------Excel表格的内容:--------------------");
System.out.println("表格行数:"+array.size());
System.out.println();
System.out.println();
for (int i = 0; i < array.size(); i++) {
System.out.println(array.get(i));

}

} catch (FileNotFoundException e) {
System.out.println("未找到指定路径的文件,请检查路径或文件名!");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: