详细整理java jxl包读取excel文件

先上工具类代码

实现类

package com.lijinquan.fileparse;

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.read.biff.BiffException;
import dev.fpxgroup.common.utility.DateFormatUtility;
import dev.fpxgroup.common.utility.StringUtility;

/**
 * Excel文件解析操作类
 * Date :2018-07-17
 * @author lijinquan
 *
 */
public class ExcelFileOperation implements IFileOperation
{
	/**
	 * Excel文件里的标题
	 */
	private String[] columnHeaders;

	/**
	 * Excel文件内容
	 */
	private List<String[]>  fileContentData;
	
	private List<Map<String,String>> contentDataMap;
	
	/**
	 * Excel文件里所有数据
	 */
	private List<String[]> fileData;
	
	/**
	 * 第一个sheet名字
	 */
	private String fistSheetName;
	
	/**
	 * 根据文件路径初始化
	 * 
	 * @param uploadfile 文件路径
	 * @throws FileOperationException 
	 */
	public  ExcelFileOperation(String uploadfile) throws FileOperationException
	{	
		File objFile = new File(uploadfile);
		init(objFile);
	}
	
	/**
	 * 以文件对象构造
	 * 
	 * @param upFile 文件对象
	 * @throws FileOperationException 
	 */
	public  ExcelFileOperation(File upFile) throws FileOperationException
	{	
		init(upFile);
	}
	
	public  ExcelFileOperation(File upFile,boolean assemMap) throws FileOperationException
	{	
		init(upFile,assemMap);
	}
	
	/**
	 * 原始的方法,把excel中的数据组装成数组的形式 
	 * @param objFile
	 * @throws FileOperationException
	 * @deprecated 因为使用数组索引会造成以后修改excel内容格式很麻烦,因此建议使用init(File objFile,boolean initMap)方法来实例化,使用map的形式获取每列的值  -xufeng 2014年12月15日
	 */
	@Deprecated
	protected void init(File objFile) throws FileOperationException
	{
		init(objFile,false);
	}
	
	/**
	 * 新的方法,同时把所有的excel中的所有数据组装到map中,以避免通过数组索引来获取值
	 * @author lijinquan
	 * @since 2018年8月15日
	 * @param objFile
	 * @param initMap
	 * @throws FileOperationException
	 */
	protected void init(File objFile,boolean initMap) throws FileOperationException
	{
		Workbook objWorkbook = null;
		try {
			WorkbookSettings objWorkbookSettings = new WorkbookSettings();
			//此处用iso-8859-1反而不乱码UTF-16LE
			objWorkbookSettings.setEncoding("ISO-8859-1");
			objWorkbookSettings.setCellValidationDisabled(true); //禁用单元格校验,否则wps编辑的excel或因office版本差别可能导致不能正常读取内容
			objWorkbook = Workbook.getWorkbook(objFile,objWorkbookSettings);
			Sheet firstSheet = objWorkbook.getSheet(0);
			setFistSheetName(firstSheet.getName());
			int iRows = firstSheet.getRows();			 
			int iColumn = firstSheet.getColumns();
			
			if(iRows > 0 && iColumn > 0)
			{
				fileData = parseFileData(firstSheet, iRows, iColumn);
				contentDataMap = new ArrayList<Map<String,String>> ();
				if(fileData.size() > 0)
				{
					columnHeaders = fileData.remove(0);
//					fileContentData = new ArrayList<String[]>();
					fileContentData = fileData;
					if(initMap){
						for(String[] row : fileData){
							Map<String,String> map = new HashMap<String,String>();
							for(int index = 0;index < row.length;index++){
								map.put(columnHeaders[index], row[index]);
							}
							contentDataMap.add(map);
						}
					}
//					fileContentData.remove(0);
				}
			}
			
		} catch (BiffException e) {
			throw new FileOperationException(e);
		} catch (IOException e) {
			throw new FileOperationException(e);
		}finally{
			if(objWorkbook != null){
				objWorkbook.close();
			}
		}
	}
	
	
	private List<String[]> parseFileData(Sheet objSheet, int iRows, int iColumn)
	{
		List<String[]> fileDataList = new ArrayList<String[]>();
		for(int i = 0; i < iRows; i++)
		{
			String[] arrayRow = new String[iColumn];
			//判断是当前行是否是空行,空行则不加
			boolean blNullRow = true;
			for(int j = 0; j < iColumn; j++)
			{
				Cell cell = objSheet.getCell(j,i);
				String strContents = null;
				//单元格数字处理:有些数字不准确
				if(cell.getType().equals(CellType.NUMBER))
				{
					NumberCell numberCell = (NumberCell) cell;
					Double numberb2 = numberCell.getValue();
					BigDecimal bd = new BigDecimal(numberb2);
					if (bd.toString().indexOf(".") > -1)
					{
						strContents = String.valueOf(Float.parseFloat(bd.toString()));
					} else
					{
						strContents = bd.toString();
					}
				}else if(cell.getType().equals(CellType.DATE))
				{//对单元格中的日期进行处理
					DateCell dateCell = (DateCell) cell;
					Date date = dateCell.getDate();
					strContents = DateFormatUtility.getStandardDate(date);
				}else
				{
					strContents = cell.getContents();
				}
				
				//去空格
				if(!StringUtility.isNull(strContents))
				{
					strContents = strContents.trim();
					blNullRow = false;
				}
				
				arrayRow[j] = strContents;
				
			}
			if(!blNullRow)
			{
				fileDataList.add(arrayRow);
			}
		}
		return fileDataList;
	}

	public String[] getColumnHeaders()
	{
		return columnHeaders;
	}

	public List<String[]> getFileContentData()
	{
		return fileContentData;
	}

	public List<String[]> getFileData()
	{
		return fileData;
	}


	public String getFirstSheetName() {
		// TODO Auto-generated method stub
		return fistSheetName;
	}


	public void setFistSheetName(String fistSheetName) {
		this.fistSheetName = fistSheetName;
	}

	@Override
	public List<Map<String, String>> getFileContentDataMap() {
		return contentDataMap;
	}


}

接口类

 

package com.lijinquan.fileparse;

import java.util.List;
import java.util.Map;


/**
 * 文件操作接口
 * 
 * @author 李金泉
 *
 */
public interface IFileOperation
{
	/**
	 * 获取文件列头
	 * 
	 * @return 文件列头
	 */
	public String[] getColumnHeaders();
	
	/**
	 * 获取文件内容数据
	 * 
	 * @return 文件内容数据
	 */
	public List<String[]> getFileContentData();
	
	/**
	 * 获取用map形式组装的数据列表
	 * @author lijinquan
	 * @since 2018年7月15日
	 * @return
	 */
	public List<Map<String,String>> getFileContentDataMap();
	
	/**
	 * 获取文件所有数据
	 * 
	 * @return 文件所有数据
	 */
	public List<String[]> getFileData();
	
	/**
	 * 获取文件的第一个sheet名字
	 * @return
	 */
	public String getFirstSheetName();
}

创建一个工厂类,方便解析不同excel

package com.lijinquan.fileparse;

import java.io.File;

/**
 * excel文件解析工厂类
 * 
 * @author lijinquan
 *
 */
public class FileParseFatory
{
	/**
	 * 获得订单文件操作对象
	 * 
	 * @param fileType 文件类型
	 * @param uploadFile 文件路径,用于建立文件对象
	 * @return 文件操作对象
	 * @throws FileOperationException 
	 */
	public static IFileOperation getFileOperation(String fileType, String uploadFile) throws FileOperationException
	{
		if(IFileBasic.File_Type_CSV.equalsIgnoreCase(fileType))
		{
			return new CSVFileOperation(uploadFile);
			
		}else if(IFileBasic.File_Type_XLS.equalsIgnoreCase(fileType))
		{
			return new ExcelFileOperation(uploadFile);
		}else if(IFileBasic.File_Type_XLSX.equalsIgnoreCase(fileType))
		{
			return new XExcelFileOperation(uploadFile);
		}else
		{
			return null;
		}
			
	}
	
	/**
	 * 获得订单文件操作对象
	 * 
	 * @param fileType 文件类型
	 * @param upFile 文件对象
	 * @return 文件操作对象
	 * @throws FileOperationException 
	 */
	public static IFileOperation getFileOperation(String fileType, File upFile) throws FileOperationException{
		return getFileOperation(fileType,upFile,false);
	}
		
	public static IFileOperation getFileOperation(String fileType, File upFile,boolean assemMap) throws FileOperationException
	{
		if(IFileBasic.File_Type_CSV.equalsIgnoreCase(fileType))
		{
			return new CSVFileOperation(upFile);
			
		}else if(IFileBasic.File_Type_XLS.equalsIgnoreCase(fileType))
		{
			return new ExcelFileOperation(upFile,assemMap);
		}else if(IFileBasic.File_Type_XLSX.equalsIgnoreCase(fileType))
		{
			return new XExcelFileOperation(upFile);
		}
		else
		{
			return null;
		}
			
	}
}

 

测试类

public static void main(String[] args) {

   File file= new File("E://abc/def.xls");
    String strFileType=	"xls";
	IFileOperation objFileOperation = FileParseFatory.getFileOperation(strFileType, file);


//获取表头
String[] columnHeaders = objFileOperation.getColumnHeaders();

//获取行内容
List<String[]> roLineContentData = objFileOperation.getFileContentData();
	}

 

 

测试内容不具体再截图分享了,请自行取用和改造

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值