通用POI导入导出excel表格

通用POI导入导出excel表格,只需要将查询出的list传给写好的方法即可

首先导入jar包

	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-scratchpad</artifactId>
		<version>3.14</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>3.14</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml-schemas</artifactId>
		<version>3.14</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>ooxml-schemas</artifactId>
		<version>1.3</version>
	</dependency>

上面三个jar包的版本号一定要相同,不然可能会出现无法预计的错误

写一个泛型excel工具类

public class ExcelPoi<T> {
private static Logger log = Logger.getLogger(ExcelPoi.class);

/**
 * 导出数据
 * 
 * @param response
 * @param list
 * @param titles
 * @param filename
 * @throws IOException
 */
public static void exportObject(HttpServletResponse response, List<?> list, String[] titles, String filename) throws IOException {
	response.setCharacterEncoding("utf-8");
	response.setHeader("content-disposition", "attachment;filename=" + new String((filename + System.currentTimeMillis()).getBytes(), "ISO8859-1") + ".xls");
	try (Workbook workbook = new HSSFWorkbook(); OutputStream ops = response.getOutputStream()) {
		Font font = workbook.createFont();
		font.setFontHeightInPoints((short) 20);
		font.setColor(HSSFFont.COLOR_RED);
		font.setFontName("黑体");
		font.setBold(false);
		font.setItalic(false);

		Sheet sheet = workbook.createSheet(filename);
		Row titleRow = sheet.createRow(0);
		for (int column = 0; column < titles.length; column++) {
			Cell itemCell = titleRow.createCell(column);
			itemCell.setCellValue(titles[column]);
		}
		if (!ParamCheck.isListEmpty(list)) {
			for (int i = 0; i < list.size(); i++) {
				Row row = sheet.createRow(i + 1);
				createRow(row, titles, list.get(i));
			}
		}
		for (int column = 0; column < titles.length; column++) {
			sheet.autoSizeColumn(column);
		}
		workbook.write(ops);
	} catch (Exception e) {
		log.error(e);
	}
}

private static void createRow(Row row, String[] titles, Object object) {
	for (int j = 0; j < titles.length; j++) {
		Field[] publicFields = object.getClass().getFields();
		Field[] declaredFields = object.getClass().getDeclaredFields();
		fieldToCell(object, publicFields, titles, row);
		fieldToCell(object, declaredFields, titles, row);
	}
}

/**
 * 获取对象属性填充到表格一条数据
 * 
 * @param object
 * @param fields
 * @param titles
 * @param row
 */
private static void fieldToCell(Object object, Field[] fields, String[] titles, Row row) {
	for (Field field : fields) {
		if (field.isAnnotationPresent(ExcelTitle.class)) {
			Object value = MyObjectUtils.getFieldValueByName(object, field);
			ExcelTitle excelTitle = field.getAnnotation(ExcelTitle.class);
			String title = excelTitle.title();
			int index = MyArrayUtils.getIndex(titles, title);
			if (index != -1 && value != null) {
				Cell cell = row.createCell(index);
				cell.setCellValue("" + value);
			}
		}
	}
}

/**
 * 导入数据
 * 
 * @param file
 * @param fileName
 * @param clz
 * @throws Exception
 */
public List<T> importObjectList(InputStream file, String fileName, Class<T> clz) throws Exception {
	List<T> list = new ArrayList<>();
	Workbook workbook = null;
	if (fileName.endsWith("xls")) {
		workbook = new HSSFWorkbook(file);
	} else if (fileName.endsWith("xlsx")) {
		workbook = new XSSFWorkbook(file);
	}
	file.close();
	if (workbook != null) {
		Map<String, Integer> titleMap = new HashMap<>();
		for (int sheetNum = 0; sheetNum < 1; sheetNum++) {
			Sheet sheet = workbook.getSheetAt(sheetNum);
			Row row = sheet.getRow(0);
			for (int columnNum = 0; columnNum < row.getLastCellNum(); columnNum++) {
				String value = getCellValue(row.getCell(columnNum));
				titleMap.put(value, columnNum);
			}
		}
		for (int sheetNum = 0; sheetNum < 1; sheetNum++) {
			Sheet sheet = workbook.getSheetAt(sheetNum);
			Field[] publicFields = clz.getFields();
			Field[] declaredFields = clz.getDeclaredFields();
			int countRow = sheet.getLastRowNum() + 1;
			for (int rowNum = 1; rowNum < countRow; rowNum++) {
				T record = clz.newInstance();
				Row row = sheet.getRow(rowNum);
				setObject(row, publicFields, record, titleMap);
				setObject(row, declaredFields, record, titleMap);
				list.add(record);
			}
		}
		workbook.close();
	}
	return list;
}

/**
 * 获取一条数据为对象赋值
 * 
 * @param row
 * @param fields
 * @param object
 * @param titleMap
 */
public static void setObject(Row row, Field[] fields, Object object, Map<String, Integer> titleMap) {
	for (Field field : fields) {
		if (field.isAnnotationPresent(ExcelTitle.class)) {
			ExcelTitle excelTitle = field.getAnnotation(ExcelTitle.class);
			String title = excelTitle.title();
			Integer index = titleMap.get(title);
			if (index != null) {
				Object value = getCellValue(row.getCell(index));
				MyObjectUtils.setFieldValueByName(object, field, value);
			}
		}
	}
}

/**
 * 获取单元格的值
 * 
 * @param cell
 * @return
 */
public static String getCellValue(Cell cell) {
	String cellValue = "";
	if (cell == null) {
		return cellValue;
	}
	if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
		if (DateUtil.isCellDateFormatted(cell)) {
			Date tempValue = cell.getDateCellValue();
			SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd");
			cellValue = simpleFormat.format(tempValue);
		} else {
			cellValue = String.valueOf(cell.getNumericCellValue());
		}
	} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
		cellValue = String.valueOf(cell.getStringCellValue());
	} else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
		cellValue = String.valueOf(cell.getBooleanCellValue());
	} else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
		cellValue = String.valueOf(cell.getBooleanCellValue());
	} else {
		cellValue = "";
	}
	return cellValue;
}
}

工具类中需要用到的几个子工具类

public class MyArrayUtils {

private MyArrayUtils() {

}

public static int getIndex(Object[] objs, Object object) {
	int index = -1;
	for (int i = 0; i < objs.length; i++) {
		Object obj = objs[i];
		if (obj.equals(object)) {
			return i;
		}
	}
	return index;
}

}

public class MyObjectUtils {

private static Logger log = Logger.getLogger(MyObjectUtils.class);

private MyObjectUtils() {

}

/**
 * 通过属性名称获取属性值
 * 
 * @param object
 * @param fieldName
 * @return
 */
public static Object getFieldValueByName(Object object, Field field) {
	try {
		String fieldName = field.getName();
		StringBuilder sb = new StringBuilder();
		sb.append("get");
		sb.append(fieldName.substring(0, 1).toUpperCase());
		sb.append(fieldName.substring(1));
		Method method = object.getClass().getMethod(sb.toString());
		return method.invoke(object);
	} catch (Exception e) {
		log.info("获取字段值异常" + e);
		return MessageUtils.ERROR;
	}
}

/**
 * 通过属性名称给对象赋值
 * 
 * @param object
 * @param fieldName
 * @param value
 * @return
 */
public static Object setFieldValueByName(Object object, Field field, Object value) {
	try {
		String fieldName = field.getName();
		Class<?>[] paramTypes = new Class[1];
		paramTypes[0] = field.getType();
		StringBuilder sb = new StringBuilder();
		sb.append("set");
		sb.append(fieldName.substring(0, 1).toUpperCase());
		sb.append(fieldName.substring(1));
		Method method = object.getClass().getMethod(sb.toString(), paramTypes);
		return method.invoke(object, value);
	} catch (Exception e) {
		log.error("赋值异常" + e);
		return MessageUtils.ERROR;
	}
}

}

public class ParamCheck {

private ParamCheck() {

}

/**
 * 校验参数是否为空
 * 
 * @param args
 * @return
 */
public static boolean checkParamIsEmpty(Object... args) {
	for (Object param : args) {
		if (param == null) {
			return true;
		}
		if (param instanceof String && "".equals(param)) {
			return true;
		}
		if (param instanceof Integer && 0 == (int) param) {
			return true;
		}
	}
	return false;
}

/**
 * 校验参数是否全部为空
 * 
 * @param args
 * @return
 */
public static boolean checkParamIsAllEmpty(Object... args) {
	for (Object param : args) {
		if (param != null) {
			boolean flag = false;
			if (param instanceof String && "".equals(param)) {
				flag = true;
			}
			if (param instanceof Integer && 0 == (int) param) {
				flag = true;
			}
			if (!flag) {
				return false;
			}
		}

	}
	return true;
}

/**
 * 校验字符串是否为空
 * 
 * @param str
 * @return
 */
public static boolean isStringEmpty(String str) {
	return str == null || "".equals(str);
}

/**
 * 校验数字是否为空
 * 
 * @param str
 * @return
 */
public static boolean isIntEmpty(Integer number) {
	return number == null || number == 0;
}

/**
 * 校验集合是否为空
 * 
 * @param str
 * @return
 */
public static boolean isListEmpty(List<?> list) {
	return list == null || list.isEmpty();
}

}

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 字段校验注解
 * 
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface ExcelTitle {

	String title();

	String dataMap() default "";

}```
返回值工具类
```java
/**
 * 返回值
 */
public class MessageUtils {

	public static final String SUCCESS = "SUCCESS";
	public static final String FAIL = "FAIL";
	public static final String ERROR = "ERROR";

	private MessageUtils() {

	}

}

导入测试

@Controller
public class Test {

@RequestMapping(value = "/importCustomerList", produces = "text/html;charset=UTF-8;")
public String importCustomerList(@RequestParam(name = "file", required = false) MultipartFile file) {
	try {
		if (file == null || file.getSize() == 0 || !file.getOriginalFilename().contains(".xls")) {
			return "文件无效";
		}
		//根据自己定义的实体类更换list的泛型
		List<Customer> list = new ExcelPoi<Customer>().importObjectList(file.getInputStream(), file.getOriginalFilename(), Customer.class);
		customService.insertCustomerList(list);//将导入的数据添加到数据库
	} catch (Exception e) {
		log.error(e);
	}
	return "";
}

}

导出测试

@Controller
public class Test {

@RequestMapping(value = "/exportCustomerList", produces = "text/html;charset=UTF-8;")
@ResponseBody
public String exportCustomerList(HttpServletResponse response, String search) {
	try {
		List<Customer> date = customService.getCustomList();
		String[] titles = { "姓名", "手机号", "地址", "客户类型" };
		String filename = "客户表";
		ExcelPoi.exportObject(response, date, titles, filename);
	} catch (Exception e) {
		log.error(e);
	}
	return "";
}		

}

发布了11 篇原创文章 · 获赞 12 · 访问量 4127

猜你喜欢

转载自blog.csdn.net/qq_38991369/article/details/94570143