通用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 "";
}
}