POI使用:解析xls/xlsx文件(兼容office2003/2007/2010版本)

package cn.eguid;

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Comment;
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;

/**
 * --2016.3.23
 * 解析EXCEL文档1.2
 * 支持xlsx和xls文档解析,全面兼容OFFICE所有EXCEL版本文件
 * @author eguid
 *
 ** --2016.3.21
 * 解析EXCEL文档1.1
 * 支持xls文档解析
 * @author eguid
 */
public class poi {
	/**
	 * 按照给定的字段进行解析
	 * 如给定数组:{id,name,sal,date}
	 * @throws IOException 
	 * @throws InvalidFormatException 
	 */
	public static Map<String, List<String>> parseByfield(File file,String[] fields) throws InvalidFormatException, IOException
	{
		Workbook wb=createWorkbook(file);
		Sheet sheet=wb.getSheetAt(0);
		//列
		Cell cell=null;
		//暂时存放
		String data=null;
		//最大行数
		int maxRowNum=sheet.getLastRowNum();
		//最大列数
		int MaxCellNum=sheet.getRow(0).getLastCellNum();
		List<String>list=null;
		
		Map<String,List<String>>map=null;
		map=new HashMap<String,List<String>>();
		
		for(int i=0;i<maxRowNum;i++){
			
			list=new ArrayList<String>();
			String title=null;
			for(int j=0;j<MaxCellNum;j++){
			//获取第j行第i列的值
			cell=sheet.getRow(j).getCell(i);
			
			data=getValue4Cell(cell);

			//如果标题与给定字段对应,则记录值;否则进入下个整列
			if(ishave(fields,data))
			{
				if(j==0)
				{
					title=data;
				}else{
				list.add(data);
				}
			}
			else{
				break;
			}
			
			}
			map.put(title, list);
			}
		return map;
	}
	/**
	 * 是否有此字段
	 * @param fields
	 * @param field
	 * @return
	 */
	private static boolean ishave(String[] fields,String field)
	{
		if(field==null||fields==null||fields.length<1){
		return false;
		}
		
		for(int index=0;index<fields.length;index++)
		{
			if(field.equals(fields[index]))
				return true;
			else
				return false;
		}
		return false;
	}
	/**
	 * 
	 * 解析
	 * 第一行是标题行
	 * 第二行以后都是内容
	 * 例如:
	 * id sex name  
	 *  1   男     王
	 *  2   女     李
	 * 
	 * 
	 * 解析后的map格式:
	 * key  value
	 * 0     List()一行
	 * 1     List()一行
	 * 2     List()一行
	 *
	 *例如:
	 *0    [id ,  name, sex,   sal   ,  date]
	 *1    [1.0, wang, 1.0, 1000.0, 42287.0]
	 *2    [2.0, liang, 1.0, 1001.0, 42288.0]
	 *@param file
	 *@throws IOException 
	 * @throws InvalidFormatException 
	 */
public static Map parse1(File file) throws IOException, InvalidFormatException
{
	//提取并创建工作表
	Workbook wb=createWorkbook(file);
	//获取sheet页第0页
    Sheet sheet = wb.getSheetAt(0);  
    //获取行迭代器
    Iterator rows = sheet.rowIterator();  
   //解析出来的数据存放到这个map里面,value套了一层List,key用于存放标题,List用于存放标题下的所有数据
    Map<String,List<String>> map=new HashMap<String,List<String>>();
    
    String title=null;//标题
    int rowindex=0;//行数
    int cellindex=0;//列数
    String data=null;//用于暂存数据
    while(rows.hasNext())
    {
    	 List<String> list=new ArrayList<String>(); 
    	cellindex=0;
    	//获取行中数据
    	 Row row = (Row) rows.next();  
    	//获取列迭代器
    	 Iterator cells = row.cellIterator();  
 
    	    while(cells.hasNext())
    	    {
    	    	//获取列中数据
    	    	 Cell cell = (Cell) cells.next();  
    	    	 //获取每个单元格的值
    	    	//将标题下的内容放到list中
    	    	list.add( getValue4Cell(cell));
    	    }
    	  //将解析完的一列数据压入map
    	    map.put(""+rowindex++, list);
    }

    return map;
}
/**
 * 把默认的格式转换成这种格式
 * id [1,2,3,4,5]
 *name [wang,liang,eguid,qq,yy]
 * 
 * @param map    map格式:Map<String,List<String>>
 * @return  Map<String,List<String>>
 */
public static  Map<String,List<String>>  format(Map<String,List<String>> map)
{
	Map<String,List<String>> newmap=new HashMap<String,List<String>>();
	//获取标题行有多少列
	String[] titles=new String[map.get("0").size()];
	int index=0;
	//获取所有标题
	for(String s:map.get("0"))
	{
	titles[index++]=s;
	}
	//控制List
	for(int i=0;i<titles.length;i++)
	{
		List<String>newlist=new ArrayList<String>();
		//控制map
		for(int j=1;j<map.size();j++)
		{
			newlist.add(map.get(j+"").get(i));
		}
	newmap.put(titles[i],newlist);
	}
	return newmap;
	}
/**
 * 解析文件名后缀
 * @return
 */
private static String parseFileSuffix(File file)
{
	String fileName=file.getName();
	return fileName.substring(fileName.lastIndexOf(".")+1, fileName.length());
	}
/**
 * 提取文件并创建工作表
 * @throws IOException 
 * @throws InvalidFormatException 
 */
private static Workbook createWorkbook(File file) throws InvalidFormatException, IOException
{
	//如果文件不存在,抛出文件没找到异常
	InputStream input = new FileInputStream(file);  
	
	Workbook wb=null;
	//如果创建工作表失败会抛出IO异常
	wb=WorkbookFactory.create(input);
	return wb;
}
/**
 * 提取单元格中的值
 */
private static String getValue4Cell(Cell cell)
{
	String data=null;
	 switch (cell.getCellType()) {  
     case Cell.CELL_TYPE_NUMERIC: // 数字  
         data=String.valueOf(cell.getNumericCellValue()) ;
         break;  
     case Cell.CELL_TYPE_STRING: // 字符串  
     	 data=String.valueOf(cell.getStringCellValue()) ;
         break;  
     case Cell.CELL_TYPE_BOOLEAN: // Boolean  
     	 data=String.valueOf( cell.getBooleanCellValue());
         break;  
     case Cell.CELL_TYPE_FORMULA: // 公式  
     	 data=String.valueOf(cell.getCellFormula()) ;
         break;  
     case Cell.CELL_TYPE_BLANK: // 空值  
     	 data=String.valueOf("");
         break;  
     case Cell.CELL_TYPE_ERROR: // 故障  
         System.out.println(" 故障");  
         break;  
     default:  
         System.out.print("未知类型  ");  
         break;  
     }  
	 return data;
	}
/**
 * 用于关闭流(暂不用)
 * @throws IOException 
 */
private void closeAll(Closeable...closes) throws IOException
{
	if(closes==null)
	{
		return;
	}
	if(closes.length<1)
	{
		return;
	}
	for(Closeable c:closes)
	{
	if(c!=null)
	{
	try {
		c.close();
	} catch (IOException e) {
		e.printStackTrace();
		throw e;
	}	
	}
	}
	}
/**
 * 格式:
 key      value
 
 id        [1.0, 2.0, 3.0, 4.0, 5.0]
 sex      [1.0, 1.0, 1.0, 0.0, 0.0]
 name  [wang, liang, eguid, qq, yy]
 date    [42287.0, 42288.0, 42289.0, 42290.0, 42291.0]
 sal       [1000.0, 1001.0, 1002.0, 1003.0, 1004.0]
 * @throws InvalidFormatException 
 */

public static void test1() throws IOException, InvalidFormatException
{
	Map<String, List<String>>map=parse1(new File("测试.xlsx"));
	Map <String,List<String>>newmap=format(map);
	for(Entry<String,List<String>>e:newmap.entrySet())
	{
		System.out.println(e.getKey());
		System.out.println(e.getValue());
	}
	}
/**
 格式:
 key  value
 0      [id, name, sex, sal, date]
 1      [1.0, wang, 1.0, 1000.0, 42287.0]
 2      [2.0, liang, 1.0, 1001.0, 42288.0]
 3      [3.0, eguid, 1.0, 1002.0, 42289.0]
 4      [4.0, qq, 0.0, 1003.0, 42290.0]
 5      [5.0, yy, 0.0, 1004.0, 42291.0]
 * @throws InvalidFormatException 
 */
public static void test2() throws IOException, InvalidFormatException
{
	Map<String, List<String>>map=parse1(new File("测试.xlsx"));
	for(Entry<String,List<String>>e:map.entrySet())
	{
		System.out.println(e.getKey());
		System.out.println(e.getValue());
	}
	}
public static void main(String[]args) throws IOException, InvalidFormatException
{
	//System.out.println(parseFileSuffix(new File("测试.xlsx")));
	// test1();
	// test2();
	Map<String, List<String>> map=parseByfield(new File("测试.xlsx"),new String[]{"id","name"});
	System.out.println(map);
}
}


上一篇:2007年至今上证指数分析


下一篇:定制日期格式的*定义