首页 > 技术文章 > JAVA-excel 导入

VVII 2018-05-20 18:08 原文

java excel 导入

@(JAVA)[excel 导入]

  • jsp
<input type="file" id="upload" name="upload" class="hidden">
<button type="button" id="btn-import">导入</button>
  • js
$(document).on('click', "#btn-import", function() {
  $('#upload').click();
});
  • action
@Autowired
private XXXSrv srv;
	
private List<File> upload; // 得到上传的文件
private List<String> uploadFileName; // 得到文件的名称
//省略get,set方法

public void importFile() {
		if (CollectionUtils.isNotEmpty(uploadFileName)) {
			String fileName = uploadFileName.get(0);
			String extention = fileName.substring(fileName.lastIndexOf("."));
			if (fileName.indexOf(extention) > -1 && (extention.equals(".xls") || extention.equals(".xlsx"))) {
				srv.importExcel(upload.get(0), extention);
				sendSuccessMsg("", "导入成功!");
			} else {
				this.sendFailMsg("", "不支持上传的文件类型");
			}
		} else {
			this.sendFailMsg("", "上传的文件为空");
		}
	}
  • XXXSrvImpl
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.hibernate.criterion.Order;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

//省略接口
@Override
public void importExcel(File file, String extention) {
	FileInputStream in;
	try {
		in = new FileInputStream(file);
		List<Map<String, Object>> excelData = null;
		if (extention.equals(".xls")) {
			HSSFWorkbook workbook = new HSSFWorkbook(in);
			excelData = ExcelImportUtil.read2007Excel(workbook);
		} else if (extention.equals(".xlsx")) {
			XSSFWorkbook workbook = new XSSFWorkbook(in);
			excelData = ExcelImportUtil.readExcel(workbook);
		}
		ExcelImportUtil.toObjectList(excelData, User.class);
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} catch (Exception e) {
		e.printStackTrace();
	}
}
  • 帮助类 ExcelImportUtil
/**
 * 功能:读取EXCEL中的数据到List<Map<String, Object>>中
 *
 * xlsx
 *
 */
public static List<Map<String, Object>> read2007Excel(HSSFWorkbook workbook) {
	List<Map<String, Object>> excelData = new LinkedList<Map<String, Object>>();
	int columnLength = workbook.getSheetAt(0).getRow(0).getPhysicalNumberOfCells();
	HSSFSheet sheet = workbook.getSheetAt(0);
	String[] columnNames = createColumnNameArray(sheet.getRow(0), columnLength);
	for (int rowIndex = 1; rowIndex < sheet.getPhysicalNumberOfRows(); rowIndex++) {
		Map<String, Object> cellMap = Maps.newHashMap();
		HSSFRow row = sheet.getRow(rowIndex);
		for (int cellIndex = 0; cellIndex < row.getPhysicalNumberOfCells(); cellIndex++) {
			cellMap.put(columnNames[cellIndex], getCellValue(row.getCell(cellIndex)));
		}
		excelData.add(cellMap);
	}
	return excelData;
}
/**
 * 功能:读取EXCEL中的数据到List<Map<String, Object>>中
 * xls
 */
public static List<Map<String, Object>> readExcel(XSSFWorkbook workbook) {
	List<Map<String, Object>> excelData = new LinkedList<Map<String, Object>>();
	int columnLength = workbook.getSheetAt(0).getRow(0).getPhysicalNumberOfCells();
	XSSFSheet sheet = workbook.getSheetAt(0);
	String[] columnNames = createColumnNameArray(sheet.getRow(0), columnLength);
	for (int rowIndex = 1; rowIndex < sheet.getPhysicalNumberOfRows(); rowIndex++) {
		Map<String, Object> cellMap = Maps.newHashMap();
		XSSFRow row = sheet.getRow(rowIndex);
		for (int cellIndex = 0; cellIndex < row.getPhysicalNumberOfCells(); cellIndex++) {
			cellMap.put(columnNames[cellIndex], getCellValue(row.getCell(cellIndex)));
		}
		excelData.add(cellMap);
	}
	return excelData;
}
	
/**
 * 功能:创建EXCEL列名数组
 * 
 */
private static String[] createColumnNameArray(HSSFRow row, int length) {
	String[] columnName = new String[length];
	for (int cellIndex = 0; cellIndex < row.getPhysicalNumberOfCells(); cellIndex++) {
		columnName[cellIndex] = getCellValue(row.getCell(cellIndex));
	}
	return columnName;
}

/**
 * 功能:创建EXCEL当前单元格内容
 *
 */
private static String getCellValue(HSSFCell cell) {
	String value = null;
	if (cell != null) {
		switch (cell.getCellType()) {
		case HSSFCell.CELL_TYPE_NUMERIC:
			if (HSSFDateUtil.isCellDateFormatted(cell)) {
				Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
				value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
			} else {
				value = String.valueOf(cell.getNumericCellValue());
			}
			break;
		case HSSFCell.CELL_TYPE_STRING:
			value = cell.getStringCellValue();
			break;
		case HSSFCell.CELL_TYPE_BOOLEAN:
			value = String.valueOf(cell.getBooleanCellValue());
			break;
		case HSSFCell.CELL_TYPE_ERROR:// 错误
			break;
		case HSSFCell.CELL_TYPE_FORMULA:
			String val = String.valueOf(cell.getNumericCellValue());
			value = val.equals("NaN") ? String.valueOf(cell.getStringCellValue()) : val;// 如果获取的数据值非法,就将其装换为对应的字符串
			break;
		case HSSFCell.CELL_TYPE_BLANK:// 空值
			break;
		default:
			value = cell.getStringCellValue();
			break;
		}
	}
	return value;
}

/**
 * 功能:利用反射将 List<Map<String,Object>>结构 生成相应的List<T>数据
 *
 */
public static <T> List<T> toObjectList(List<Map<String, Object>> list, Class<T> clazz) throws Exception {
	List<T> objList = new LinkedList<T>();
	for (int i = 0; i < list.size(); i++) {
		Set<Map.Entry<String, Object>> set = list.get(i).entrySet();
		Iterator<Entry<String, Object>> it = set.iterator();
		T obj = clazz.newInstance();
		Method[] methods = clazz.getDeclaredMethods();
		while (it.hasNext()) {
			Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it.next();
			for (Method m : methods) {
				if (m.getName().startsWith("set")) {
					String methodName = entry.getKey().toString();
					StringBuffer sb = new StringBuffer(methodName);
					sb.replace(0, 1, (methodName.charAt(0) + "").toUpperCase());
					methodName = "set" + sb.toString();
					if (methodName.equals(m.getName())) {
						m.invoke(obj, entry.getValue());
						break;
					}
				}
			}
		}
		objList.add(obj);
	}
	return objList;
}

推荐阅读