POI 3.17 + POI-OOXML 3.15导入Excel
ExcelUtil.class
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.base.CharMatcher;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
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.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
public class ExcelUtil<T> {
Class<T> clazz;
public ExcelUtil(Class<T> clazz) {
this.clazz = clazz;
}
public static final String EXCEL_XLS = "xls";
public static final String EXCEL_XLSX = "xlsx";
public static final String EXCEL_ET = "et";
public static final String EXCEL_EXT = "ext";
public List<T> importExcel(MultipartFile file,int dataRow) {
Errors errors = new Errors();
List<T> list = new ArrayList<T>();
Field[] allFields = clazz.getDeclaredFields();
Map<String, Field> fieldsMap = new HashMap<String, Field>(allFields.length);
for (Field field : allFields) {
if (field.isAnnotationPresent(ExcelAttribute.class)) {
ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
String name = attr.column();
field.setAccessible(true);
fieldsMap.put(name, field);
}
}
InputStream input = null;
String originalName = file.getOriginalFilename();
if(StringUtils.isEmpty(originalName)){
throw new ErrorException("-1","源文件名不能为空");
}
String ext = originalName.substring(originalName.lastIndexOf(".")+1);
int cellNum;
try {
input = file.getInputStream();
Workbook workbook = this.getWorkbook(input, ext);
Sheet sheet = workbook.getSheetAt(0);
int rows = sheet.getPhysicalNumberOfRows();
if (rows > dataRow) {
Row title = sheet.getRow(dataRow-1);
cellNum = title.getPhysicalNumberOfCells();
Map<Integer, String> titleMap = new HashMap<Integer, String>(cellNum);
int k = 0;
for (Cell cell : title) {
titleMap.put(k, cell.getStringCellValue());
k++;
}
for (int i = dataRow; i < rows; i++) {
Row row = sheet.getRow(i);
if (row==null) {
break;
}
T entity = null;
for (int j = 0; j < cellNum; j++) {
String colName = titleMap.get(j);
if(colName!=null&&!"".equals(colName)) {
Field field = fieldsMap.get(colName);
if(field == null){
continue;
}
Class<?> fieldType = field.getType();
Cell cell = row.getCell(j);
boolean nullable = field.getAnnotation(ExcelAttribute.class).nullable();
if (cell == null && !nullable) {
errors.put("-1", "第"+(i+1)+"行的"+colName+"为空");
}
String c = "";
if (cell !=null) {
c = String.valueOf(getCellValue3(cell));
}
entity = (entity == null ? clazz.newInstance() : entity);
if (String.class == fieldType) {
field.set(entity, String.valueOf(c));
} else if ((Integer.TYPE == fieldType)
|| (Integer.class == fieldType)) {
field.set(entity, Integer.parseInt(c));
} else if ((Long.TYPE == fieldType)
|| (Long.class == fieldType)) {
field.set(entity, Long.valueOf(c));
} else if ((Double.TYPE == fieldType)
|| (Double.class == fieldType)) {
if ("".equals(c)) {
c = "0.0";
}
try {
field.set(entity, Double.valueOf(c));
} catch (NumberFormatException e) {
throw new ErrorException("第"+(i+1)+"行的"+colName+"错误");
}
} else if (BigDecimal.class == fieldType) {
field.set(entity, new BigDecimal(c));
}
}
}
list.add(entity);
}
}
} catch (IOException e) {
throw new ErrorException("-2","上传失败!");
}catch (IllegalArgumentException e) {
throw new ErrorException("-2","上传失败!");
} catch (IllegalAccessException e) {
throw new ErrorException("-2","上传失败!");
} catch (InstantiationException e) {
throw new ErrorException("-2","上传失败!");
} catch (ErrorException e) {
throw new ErrorException("-1",e.getErrors());
} finally {
try {
if(input!=null){
input.close();
}
} catch (IOException e) {
throw new ErrorException("-2","上传失败!");
}
}
if (!errors.isEmpty()) {
throw new ErrorsException(errors);
}
return list;
}
private Workbook getWorkbook(InputStream input, String ext) throws ErrorException, IOException {
Workbook work = null;
if(ExcelUtil.EXCEL_XLS.equals(ext)){
work=new HSSFWorkbook(input);
}else if(ExcelUtil.EXCEL_XLSX.equals(ext)) {
work=new XSSFWorkbook(input);
}else if(ExcelUtil.EXCEL_ET.equals(ext)) {
work=new HSSFWorkbook(input);
}else if(ExcelUtil.EXCEL_EXT.equals(ext)) {
work=new HSSFWorkbook(input);
}else {
throw new ErrorException("只支持.et,.ext,.xls.,xlsx格式的文件!");
}
return work;
}
public Object getCellValue(Cell cell) {
Object value = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
if(cell != null ) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
value = this.StringTrim(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
if("General".equals(cell.getCellStyle().getDataFormatString())) {
BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
value = bd.toPlainString();
}else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {
value = sdf.format(cell.getDateCellValue());
}else if(HSSFDateUtil.isCellDateFormatted(cell)){
Date date = cell.getDateCellValue();
value = sdf.format(date);
}
break;
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
value = "";
break;
default:
break;
}
}
return value;
}
public Object getCellValue2(Cell cell) {
Object value = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
if (cell != null) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
value = this.StringTrim(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
value = bd.toPlainString();
}
if ("General".equals(cell.getCellStyle().getDataFormatString())) {
BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
value = bd.toPlainString();
} else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {
value = sdf.format(cell.getDateCellValue());
} else if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
value = sdf.format(date);
} else {
BigDecimal bd = new BigDecimal(cell.getNumericCellValue());
value = bd.toPlainString();
}
break;
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
value = "";
break;
default:
break;
}
}
return value;
}
public static String getCellValue3(Cell cell) {
String cellValue = "";
if (cell == null) {
return cellValue;
}
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf;
if (cell.getCellStyle().getDataFormat() == 14) {
sdf = new SimpleDateFormat("yyyy/MM/dd");
} else if (cell.getCellStyle().getDataFormat() == 21) {
sdf = new SimpleDateFormat("HH:mm:ss");
} else if (cell.getCellStyle().getDataFormat() == 22) {
sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
} else {
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
Date date = cell.getDateCellValue();
cellValue = sdf.format(date);
} else if (cell.getCellStyle().getDataFormat() == 0) {
cell.setCellType(CellType.STRING);
cellValue = StringTrim(String.valueOf(cell.getRichStringCellValue().getString()));
}
break;
case STRING:
cellValue = StringTrim(String.valueOf(cell.getStringCellValue()));
break;
case BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case FORMULA:
try {
cellValue = StringTrim(String.valueOf(cell.getStringCellValue()));
} catch (Exception exception) {
cellValue = String.valueOf(cell.getNumericCellValue());
}
break;
case BLANK:
cellValue = null;
break;
case ERROR:
cellValue = "非法";
break;
default:
cellValue = "未知";
break;
}
return cellValue;
}
public static String StringTrim(String str){
if(null != str) {
return BcConvertUtil.qjToBj(str).replaceAll("[\\s\\u00A0]+"," ").trim();
}
return str;
}
}
ExcelAttribute.class
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ java.lang.annotation.ElementType.FIELD })
public @interface ExcelAttribute {
public abstract String column();
public abstract boolean nullable();
}
BcConvertUtil.class
import org.apache.commons.lang.StringUtils;
import java.util.regex.Pattern;
public class BcConvertUtil {
static final char DBC_CHAR_START = 33;
static final char DBC_CHAR_END = 126;
static final char SBC_CHAR_START = 65281;
static final char SBC_CHAR_END = 65374;
static final int CONVERT_STEP = 65248;
static final char SBC_SPACE = 12288;
static final char DBC_SPACE = ' ';
public static String qjToBj(String str){
if (StringUtils.isBlank(str)){
return "";
}
StringBuilder buf = new StringBuilder(str.length());
char[] ca = str.toCharArray();
for (char c : ca) {
if (c >= SBC_CHAR_START && c <= SBC_CHAR_END) {
buf.append((char) (c - CONVERT_STEP));
} else if (c == SBC_SPACE) {
buf.append(DBC_SPACE);
} else {
buf.append(c);
}
}
return buf.toString();
}
public static String bjToQj(String src) {
if (StringUtils.isBlank(src)){
return "";
}
StringBuilder buf = new StringBuilder(src.length());
char[] ca = src.toCharArray();
for (char c : ca) {
if (c == DBC_SPACE) {
buf.append(SBC_SPACE);
} else if ((c >= DBC_CHAR_START) && (c <= DBC_CHAR_END)) {
buf.append((char) (c + CONVERT_STEP));
} else {
buf.append(c);
}
}
return buf.toString();
}
public static boolean containQjChar(String content){
if (StringUtils.isBlank(content)){
return true;
}
String spaceChar = " ";
if (content.contains(spaceChar)){
return false;
}
String pattern = "[\\x00-\\xff]+";
return Pattern.matches(pattern, content);
}
public static void main(String[] args) {
String content = "111 @ADDBTT%^&";
String content1 = "111@a123";
String ret = BcConvertUtil.qjToBj(content);
boolean a = BcConvertUtil.containQjChar(content1);
ret = ret.replace(" ", "");
System.out.println("符合要求? " + ret);
System.out.println("符合要求? " + a);
}
}