首先从优缺点上来说
一、jxl
优点:
Jxl对中文支持非常好,操作简单,方法看名知意。
Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写
支持Excel 95-2000的所有版本(网上说目前可以支持Excel2007了,还没有尝试过)
生成Excel 2000标准格式
支持字体、数字、日期操作
能够修饰单元格属性
支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
缺点:效率低,图片支持不完善,对格式的支持不如POI强大
二、POI
优点:
缺点:不成熟,代码不能跨平台,貌似不少同行在使用工程中还碰到让人郁闷的BUG(最近的项目中也是遇到了一些bug,不过目前没有查出来是代码的问题还是POI的问题,总之问题很诡异,数据替代参数总有失败的。关于不能跨平台这一说,我也没有试验过,不过Java不是跨平台吗?POI是JAVA的一个组件,怎么就不能跨平台了呢,总之这些问题还需要在以后的项目中多多实践,才能比较出区别之处。)
使用JXL反射操作导入数据
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
/**
* EXECL文件导入处理工具类
* <p>
*/
@SuppressWarnings("unchecked")
public class FileImportUtil {
public final static <T> List<T> parseExcel(File excel, String className, String[] fieldNames) {
List result = new ArrayList();
FileInputStream fs = null;
try {
fs = new FileInputStream(excel);
Workbook wb = Workbook.getWorkbook(fs);
Sheet sheet = wb.getSheet(0);
int row = sheet.getRows();
String value = null;
int nullNum = 0;
for (int r = 1; r < row; r++) {
nullNum = 0;
Object o = Class.forName(className).newInstance();
for (int i = 0; i < fieldNames.length; i++) {
value = sheet.getCell(i, r).getContents();
if (value == null || value.trim().length() == 0) {
nullNum++;
continue;
}
insertValue(o, fieldNames[i], fetchExcelValue(sheet.getCell(i, r)));
}
if (nullNum < fieldNames.length) {
result.add(o);
}
}
} catch (Exception e) {
throw new UnsupportedOperationException("解析EXCEL生成对象错误,请根据Excel模板上传正确文件!");
} finally {
if (fs != null)
try {
fs.close();
} catch (IOException e) {
}
}
return result;
}
private static final String fetchExcelValue(Cell cell) {
String result = null;
if (cell.getType() == CellType.DATE) {
DateCell dt = (DateCell) cell;
DateFormat df = dt.getDateFormat();
result = df.format(dt.getDate());
} else {
result = cell.getContents();
}
return result;
}
private static final void insertValue(Object o, String fieldName, String value) throws SecurityException,
NoSuchFieldException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException, ParseException {
Field field = o.getClass().getDeclaredField(fieldName);
Method method = o.getClass().getMethod(
"set" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1), field.getType());
method.invoke(o, transforObject(field.getType(), value));
}
private static final Object transforObject(Class type, String str) throws ParseException {
if (str == null || str.trim().length() == 0) {
return null;
}
Object value = str;
if (type.equals(Integer.class) || type.equals(int.class)) {
value = Integer.valueOf(str);
} else if (type.equals(Timestamp.class)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse(str);
value = new Timestamp(date.getTime());
} else if (type.equals(boolean.class)) {
value = Boolean.valueOf(str);
}
return value;
}
}
personImport.java 就是个bean
public class PersonImport {
private String personCode;
private String name;
private String deptCode;
private String gender;
private String IDType;
private String identityId;
private String birthday;
private String phone;
private String pinyin;
private String address;
private String englishName;
private String email;
private String inaugurationDate;
private String leaveJobDate;
private String educational;
private String people;//民族
private String remark;}
这里就是使用了导入的功能
String className = PersonImport.class.getName();
String[] fieldNames = { "personCode", "name", "deptCode", "gender", "IDType", "identityId", "birthday",
"phone", "pinyin", "address", "englishName", "email", "inaugurationDate", "leaveJobDate",
"educational", "people", "remark" };
List<PersonImport> personImportList = FileImportUtil.parseExcel(excel, className, fieldNames);
action 层的操作
public void importPersonFromExcel(MultipartFile multExcel) throws IllegalStateException, IOException {
ActionResult result = new ActionResult();
result.setSuccess(true);
File excel = new File(FileUploadUtils.getUploadFileTempPath() + File.separator + SysCodeUtil.generateByUUID());
multExcel.transferTo(excel);
OperateResult operResult = new OperateResult();
if (excel == null) {
result.setSuccess(false);
result.setMessage("请选择要上传的文件!");
} else {
try {
operResult = personInfoService.saveBatchImportPersonInfo(this.findCurrentUserId(), excel);
result.setSuccess(operResult.isResult());
result.setMessage(operResult.getMsg());
} catch (Exception e) {
LogUtils.logException(e);
result.setSuccess(false);
result.setMessage(ConstParamWebservice.SYS_ERROR);
}
}
}