excel操作

1.前言

项目中要求读取excel文件内容,并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。

2.代码实例:

复制代码

packageedu.sjtu.erplab.poi;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.IOException;

importjava.io.InputStream;

importjava.text.SimpleDateFormat;

importjava.util.Date;

importjava.util.HashMap;

importjava.util.Map;

importorg.apache.poi.hssf.usermodel.HSSFCell;

importorg.apache.poi.hssf.usermodel.HSSFDateUtil;

importorg.apache.poi.hssf.usermodel.HSSFRow;

importorg.apache.poi.hssf.usermodel.HSSFSheet;

importorg.apache.poi.hssf.usermodel.HSSFWorkbook;

importorg.apache.poi.poifs.filesystem.POIFSFileSystem;

/**

*操作Excel表格的功能类

*/

publicclassExcelReader{

privatePOIFSFileSystemfs;

privateHSSFWorkbookwb;

privateHSSFSheetsheet;

privateHSSFRowrow;

/**

*读取Excel表格表头的内容

*@paramInputStream

*@returnString表头内容的数组

*/

publicString[]readExcelTitle(InputStreamis){

try{

fs=newPOIFSFileSystem(is);

wb=newHSSFWorkbook(fs);

}catch(IOExceptione){

e.printStackTrace();

}

sheet=wb.getSheetAt(0);

row=sheet.getRow(0);

//标题总列数

intcolNum=row.getPhysicalNumberOfCells();

System.out.println("colNum:"+colNum);

String[]title=newString[colNum];

for(inti=0;i<colNum;i++){

//title[i]=getStringCellValue(row.getCell((short)i));

title[i]=getCellFormatValue(row.getCell((short)i));

}

returntitle;

}

/**

*读取Excel数据内容

*@paramInputStream

*@returnMap包含单元格数据内容的Map对象

*/

publicMap<Integer,String>readExcelContent(InputStreamis){

Map<Integer,String>content=newHashMap<Integer,String>();

Stringstr="";

try{

fs=newPOIFSFileSystem(is);

wb=newHSSFWorkbook(fs);

}catch(IOExceptione){

e.printStackTrace();

}

sheet=wb.getSheetAt(0);

//得到总行数

introwNum=sheet.getLastRowNum();

row=sheet.getRow(0);

intcolNum=row.getPhysicalNumberOfCells();

//正文内容应该从第二行开始,第一行为表头的标题

for(inti=1;i<=rowNum;i++){

row=sheet.getRow(i);

intj=0;

while(j<colNum){

//每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据

//也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean

//str+=getStringCellValue(row.getCell((short)j)).trim()+

//"-";

str+=getCellFormatValue(row.getCell((short)j)).trim()+"";

j++;

}

content.put(i,str);

str="";

}

returncontent;

}

/**

*获取单元格数据内容为字符串类型的数据

*

*@paramcellExcel单元格

*@returnString单元格数据内容

*/

privateStringgetStringCellValue(HSSFCellcell){

StringstrCell="";

switch(cell.getCellType()){

caseHSSFCell.CELL_TYPE_STRING:

strCell=cell.getStringCellValue();

break;

caseHSSFCell.CELL_TYPE_NUMERIC:

strCell=String.valueOf(cell.getNumericCellValue());

break;

caseHSSFCell.CELL_TYPE_BOOLEAN:

strCell=String.valueOf(cell.getBooleanCellValue());

break;

caseHSSFCell.CELL_TYPE_BLANK:

strCell="";

break;

default:

strCell="";

break;

}

if(strCell.equals("")||strCell==null){

return"";

}

if(cell==null){

return"";

}

returnstrCell;

}

/**

*获取单元格数据内容为日期类型的数据

*

*@paramcell

*Excel单元格

*@returnString单元格数据内容

*/

privateStringgetDateCellValue(HSSFCellcell){

Stringresult="";

try{

intcellType=cell.getCellType();

if(cellType==HSSFCell.CELL_TYPE_NUMERIC){

Datedate=cell.getDateCellValue();

result=(date.getYear()+1900)+"-"+(date.getMonth()+1)

+"-"+date.getDate();

}elseif(cellType==HSSFCell.CELL_TYPE_STRING){

Stringdate=getStringCellValue(cell);

result=date.replaceAll("[年月]","-").replace("日","").trim();

}elseif(cellType==HSSFCell.CELL_TYPE_BLANK){

result="";

}

}catch(Exceptione){

System.out.println("日期格式不正确!");

e.printStackTrace();

}

returnresult;

}

/**

*根据HSSFCell类型设置数据

*@paramcell

*@return

*/

privateStringgetCellFormatValue(HSSFCellcell){

Stringcellvalue="";

if(cell!=null){

//判断当前Cell的Type

switch(cell.getCellType()){

//如果当前Cell的Type为NUMERIC

caseHSSFCell.CELL_TYPE_NUMERIC:

caseHSSFCell.CELL_TYPE_FORMULA:{

//判断当前的cell是否为Date

if(HSSFDateUtil.isCellDateFormatted(cell)){

//如果是Date类型则,转化为Data格式

//方法1:这样子的data格式是带时分秒的:2011-10-120:00:00

//cellvalue=cell.getDateCellValue().toLocaleString();

//方法2:这样子的data格式是不带带时分秒的:2011-10-12

Datedate=cell.getDateCellValue();

SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");

cellvalue=sdf.format(date);

}

//如果是纯数字

else{

//取得当前Cell的数值

cellvalue=String.valueOf(cell.getNumericCellValue());

}

break;

}

//如果当前Cell的Type为STRIN

caseHSSFCell.CELL_TYPE_STRING:

//取得当前的Cell字符串

cellvalue=cell.getRichStringCellValue().getString();

break;

//默认的Cell值

default:

cellvalue="";

}

}else{

cellvalue="";

}

returncellvalue;

}

publicstaticvoidmain(String[]args){

try{

//对读取Excel表格标题测试

InputStreamis=newFileInputStream("d:\\test2.xls");

ExcelReaderexcelReader=newExcelReader();

String[]title=excelReader.readExcelTitle(is);

System.out.println("获得Excel表格的标题:");

for(Strings:title){

System.out.print(s+"");

}

//对读取Excel表格内容测试

InputStreamis2=newFileInputStream("d:\\test2.xls");

Map<Integer,String>map=excelReader.readExcelContent(is2);

System.out.println("获得Excel表格的内容:");

for(inti=1;i<=map.size();i++){

System.out.println(map.get(i));

}

}catch(FileNotFoundExceptione){

System.out.println("未找到指定路径的文件!");

e.printStackTrace();

}

}

}

复制代码

3.总结

因为excel单元格中的内容往往都有一定的格式,比如日期型,数字型,字符串型,因此在读取的时候要进行格式判断,不然会出现错误。常见的就是不能正常读取日期。在代码实例中有一个方法:

getCellFormatValue(HSSFCellcell)

往这个方法中传入excel单元格就能识别单元格格式,并转化为正确的格式。

ps:2012-2-23

代码实例中有一段代码:

intcolNum=row.getPhysicalNumberOfCells();

其中的HSSFRow.getPhysicalNumberOfCells();这个方法是用于获取一行中存在的单元格数,POI的官方API中有给出getPhysicalNumberOfCells方法的解释

getPhysicalNumberOfCells

publicintgetPhysicalNumberOfCells()

getsthenumberofdefinedcells(NOTnumberofcellsintheactualrow!).Thatistosayifonlycolumns0,4,5havevaluesthentherewouldbe3.Specifiedby:getPhysicalNumberOfCellsininterfaceRowReturns:intrepresentingthenumberofdefinedcellsintherow.

相关推荐