利用POI读取Excel文件
前几天实现了利用POI创建Excel文件,今天分享一下如何利用POI读取Excel文件。
要读取的文件内容,以下截图已给出:
下面讲读取文件内容的方法。
先创建一个读取Excel的工具类。
/**
* 操作Excel表格的功能类
*/
public class ExcelReader
{
private POIFSFileSystem fs;
private HSSFWorkbook wb;
private HSSFSheet sheet;
private HSSFRow row;
/**
* 读取Excel表格表头的内容
* @param InputStream
* @return String 表头内容的数组
*/
public String[] readExcelTitle(InputStream is)
{
try
{
//获得文件输入流对象
fs = new POIFSFileSystem(is);
//获得与文件输入流相关的工作簿对象
wb = new HSSFWorkbook(fs);
}
catch (IOException e)
{
}
//获得工作簿的第一张工作表
sheet = wb.getSheetAt(0);
//获得工作表的首行
row = sheet.getRow(0);
// 标题总列数
int colNum = row.getPhysicalNumberOfCells();
//String数组保存首行的各个标题
String[] title = new String[colNum];
for (int i = 0; i < colNum; i++) {
title[i] = getCellFormatValue(row.getCell(i));
}
return title;
}
/**
* 读取Excel数据内容
* @param InputStream
* @return Map 包含单元格数据内容的Map对象
*/
public Map<Integer, String> readExcelContent(InputStream is)
{
//Map集合存储正文各行的内容,键为行的索引,值为该行所有数据连成的字符串
Map<Integer, String> content = new HashMap<Integer, String>();
String str = "";
try
{
fs = new POIFSFileSystem(is);
wb = new HSSFWorkbook(fs);
}
catch (IOException e)
{
}
sheet = wb.getSheetAt(0);
// 得到总行数
int rowNum = sheet.getLastRowNum();
row = sheet.getRow(1);
// 得到总列数
int colNum = row.getPhysicalNumberOfCells();
// 正文内容应该从第二行开始,第一行为表头的标题
for (int i = 1; i <= rowNum; i++)
{
row = sheet.getRow(i);
int j = 0;
while (j < colNum)
{
//将i行的内容转格式后加到str后
// 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
str += getCellFormatValue(row.getCell(j)) + "----";
j++;
}
//将存好的str放到Map容器中
content.put(i, str);
str = " ";
}
return content;
}
/**
* 根据HSSFCell类型设置数据
* @param cell
* @return
*/
private String getCellFormatValue(HSSFCell cell)
{
//cellvalue用来存储格式成字符串的单元格数据
String cellvalue = "";
//非空
if (cell != null)
{
// 判断当前Cell的Type:数值型,公式型,字符串型
switch (cell.getCellType())
{
case HSSFCell.CELL_TYPE_NUMERIC:
cellvalue =String.valueOf(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
cellvalue=String.valueOf(cell.getCellFormula());
break;
case HSSFCell.CELL_TYPE_STRING:
cellvalue = cell.getStringCellValue();
break;
default:
cellvalue = " ";
break;
}
}
//为空返回空字符串
else
cellvalue = "";
return cellvalue;
}
}
然后创建个测试类,利于工具类关联要读取的文件。(我的文件在g盘目录下)
public class Demo
{
public static void main(String[] args)
{
InputStream is=null;
try
{
// 对读取Excel表格标题测试
is = new FileInputStream("g:\\Book.xls");
ExcelReader excelReader = new ExcelReader();
String[] title = excelReader.readExcelTitle(is);
System.out.println("获得Excel表格的标题:");
for (String s : title)
System.out.print(s + " ");
// 对读取Excel表格内容测试
Map<Integer, String> map = excelReader.readExcelContent(is);
System.out.println("\n获得Excel表格的内容:");
for (int i = 1; i <= map.size(); i++)
{
System.out.println(map.get(i));
}
}
catch (FileNotFoundException e)
{
System.out.println("未找到指定路径的文件!");
e.printStackTrace();
}
finally
{
try
{
is.close();
}
catch (IOException e)
{
}
}
}
}
这样就实现了对Excel文件的读取!