先上工具类代码
实现类
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();
}
测试内容不具体再截图分享了,请自行取用和改造