maven jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
工具类
import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* api request field, reflect util
* @author xuxueli 2017-05-26
*/
public final class FieldReflectionUtil {
private FieldReflectionUtil(){}
public static Byte parseByte(String value) {
try {
value = value.replaceAll(" ", "");
return Byte.valueOf(value);
} catch(NumberFormatException e) {
throw new RuntimeException("parseByte but input illegal input=" + value, e);
}
}
public static Boolean parseBoolean(String value) {
value = value.replaceAll(" ", "");
if (Boolean.TRUE.toString().equalsIgnoreCase(value)) {
return Boolean.TRUE;
} else if (Boolean.FALSE.toString().equalsIgnoreCase(value)) {
return Boolean.FALSE;
} else {
throw new RuntimeException("parseBoolean but input illegal input=" + value);
}
}
public static Integer parseInt(String value) {
try {
value = value.replaceAll(" ", "");
return Integer.valueOf(value);
} catch(NumberFormatException e) {
throw new RuntimeException("parseInt but input illegal input=" + value, e);
}
}
public static Short parseShort(String value) {
try {
value = value.replaceAll(" ", "");
return Short.valueOf(value);
} catch(NumberFormatException e) {
throw new RuntimeException("parseShort but input illegal input=" + value, e);
}
}
public static Long parseLong(String value) {
try {
value = value.replaceAll(" ", "");
return Long.valueOf(value);
} catch(NumberFormatException e) {
throw new RuntimeException("parseLong but input illegal input=" + value, e);
}
}
public static Float parseFloat(String value) {
try {
value = value.replaceAll(" ", "");
return Float.valueOf(value);
} catch(NumberFormatException e) {
throw new RuntimeException("parseFloat but input illegal input=" + value, e);
}
}
public static Double parseDouble(String value) {
try {
value = value.replaceAll(" ", "");
return Double.valueOf(value);
} catch(NumberFormatException e) {
throw new RuntimeException("parseDouble but input illegal input=" + value, e);
}
}
public static Date parseDate(String value, ExcelField excelField) {
try {
String datePattern = "yyyy-MM-dd HH:mm:ss";
if (excelField != null) {
datePattern = excelField.dateformat();
}
SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
return dateFormat.parse(value);
} catch(ParseException e) {
throw new RuntimeException("parseDate but input illegal input=" + value, e);
}
}
/**
* 参数解析 (支持:Byte、Boolean、String、Short、Integer、Long、Float、Double、Date)
*
* @param field
* @param value
* @return
*/
public static Object parseValue(Field field, String value) {
Class<?> fieldType = field.getType();
ExcelField excelField = field.getAnnotation(ExcelField.class);
if(value==null || value.trim().length()==0)
return null;
value = value.trim();
/*if (Byte.class.equals(fieldType) || Byte.TYPE.equals(fieldType)) {
return parseByte(value);
} else */if (Boolean.class.equals(fieldType) || Boolean.TYPE.equals(fieldType)) {
return parseBoolean(value);
}/* else if (Character.class.equals(fieldType) || Character.TYPE.equals(fieldType)) {
return value.toCharArray()[0];
}*/ else if (String.class.equals(fieldType)) {
return value;
} else if (Short.class.equals(fieldType) || Short.TYPE.equals(fieldType)) {
return parseShort(value);
} else if (Integer.class.equals(fieldType) || Integer.TYPE.equals(fieldType)) {
return parseInt(value);
} else if (Long.class.equals(fieldType) || Long.TYPE.equals(fieldType)) {
return parseLong(value);
} else if (Float.class.equals(fieldType) || Float.TYPE.equals(fieldType)) {
return parseFloat(value);
} else if (Double.class.equals(fieldType) || Double.TYPE.equals(fieldType)) {
return parseDouble(value);
} else if (Date.class.equals(fieldType)) {
return parseDate(value, excelField);
} else {
throw new RuntimeException("request illeagal type, type must be Integer not int Long not long etc, type=" + fieldType);
}
}
/**
* 参数格式化为String
*
* @param field
* @param value
* @return
*/
public static String formatValue(Field field, Object value) {
Class<?> fieldType = field.getType();
ExcelField excelField = field.getAnnotation(ExcelField.class);
if(value==null) {
return null;
}
if (Boolean.class.equals(fieldType) || Boolean.TYPE.equals(fieldType)) {
return String.valueOf(value);
} else if (String.class.equals(fieldType)) {
return String.valueOf(value);
} else if (Short.class.equals(fieldType) || Short.TYPE.equals(fieldType)) {
return String.valueOf(value);
} else if (Integer.class.equals(fieldType) || Integer.TYPE.equals(fieldType)) {
return String.valueOf(value);
} else if (Long.class.equals(fieldType) || Long.TYPE.equals(fieldType)) {
return String.valueOf(value);
} else if (Float.class.equals(fieldType) || Float.TYPE.equals(fieldType)) {
return String.valueOf(value);
} else if (Double.class.equals(fieldType) || Double.TYPE.equals(fieldType)) {
return String.valueOf(value);
} else if (Date.class.equals(fieldType)) {
String datePattern = "yyyy-MM-dd HH:mm:ss";
if (excelField != null && excelField.dateformat()!=null) {
datePattern = excelField.dateformat();
}
SimpleDateFormat dateFormat = new SimpleDateFormat(datePattern);
return dateFormat.format(value);
} else {
throw new RuntimeException("request illeagal type, type must be Integer not int Long not long etc, type=" + fieldType);
}
}
}
导入工具类
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Excel导入工具
*
*/
public class ExcelImportUtil {
/**
* 从Workbook导入Excel文件,并封装成对象
*
* @param workbook
* @param sheetClass
* @return
*/
public static List<Object> importExcel(Workbook workbook, Class<?> sheetClass) {
List<Object> sheetDataList = importSheet(workbook, sheetClass);
return sheetDataList;
}
public static List<Object> importSheet(Workbook workbook, Class<?> sheetClass) {
try {
// sheet
ExcelSheet excelSheet = sheetClass.getAnnotation(ExcelSheet.class);
String sheetName = (excelSheet!=null && excelSheet.name()!=null && excelSheet.name().trim().length()>0)?excelSheet.name().trim():sheetClass.getSimpleName();
// sheet field
List<Field> fields = new ArrayList<Field>();
if (sheetClass.getDeclaredFields()!=null && sheetClass.getDeclaredFields().length>0) {
for (Field field: sheetClass.getDeclaredFields()) {
if (Modifier.isStatic(field.getModifiers())) {
continue;
}
fields.add(field);
}
}
if (fields==null || fields.size()==0) {
throw new RuntimeException(">>>>>>>>>>> xxl-excel error, data field can not be empty.");
}
// sheet data
Sheet sheet = workbook.getSheet(sheetName);
if (sheet == null) {
return null;
}
Iterator<Row> sheetIterator = sheet.rowIterator();
int rowIndex = 0;
List<Object> dataList = new ArrayList<Object>();
while (sheetIterator.hasNext()) {
Row rowX = sheetIterator.next();
if (rowIndex > 0) {
Object rowObj = sheetClass.newInstance();
for (int i = 0; i < fields.size(); i++) {
// cell
Cell cell = rowX.getCell(i);
if (cell == null) {
continue;
}
// call val str
cell.setCellType(CellType.STRING);
String fieldValueStr = cell.getStringCellValue(); // cell.getCellTypeEnum()
// java val
Field field = fields.get(i);
Object fieldValue = FieldReflectionUtil.parseValue(field, fieldValueStr);
if (fieldValue == null) {
continue;
}
// fill val
field.setAccessible(true);
field.set(rowObj, fieldValue);
}
dataList.add(rowObj);
}
rowIndex++;
}
return dataList;
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
}
}
/**
* 导入Excel文件,并封装成对象
*
* @param excelFile
* @param sheetClass
* @return
*/
public static List<Object> importExcel(File excelFile, Class<?> sheetClass) {
try {
Workbook workbook = WorkbookFactory.create(excelFile);
List<Object> dataList = importExcel(workbook, sheetClass);
return dataList;
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InvalidFormatException e) {
throw new RuntimeException(e);
}
}
/**
* 从文件路径导入Excel文件,并封装成对象
*
* @param filePath
* @param sheetClass
* @return
*/
public static List<Object> importExcel(String filePath, Class<?> sheetClass) {
File excelFile = new File(filePath);
List<Object> dataList = importExcel(excelFile, sheetClass);
return dataList;
}
/**
* 导入Excel数据流,并封装成对象
*
* @param inputStream
* @param sheetClass
* @return
*/
public static List<Object> importExcel(InputStream inputStream, Class<?> sheetClass) {
try {
Workbook workbook = WorkbookFactory.create(inputStream);
List<Object> dataList = importExcel(workbook, sheetClass);
return dataList;
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InvalidFormatException e) {
throw new RuntimeException(e);
}
}
}
导出工具类
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
/**
* Excel导出工具
*
*/
public class ExcelExportUtil {
/**
* 导出Excel对象
*
* @param sheetDataListArr Excel数据
* @return
*/
public static Workbook exportWorkbook(List<?>... sheetDataListArr){
// data array valid
if (sheetDataListArr==null || sheetDataListArr.length==0) {
throw new RuntimeException(">>>>>>>>>>> xxl-excel error, data array can not be empty.");
}
// book (HSSFWorkbook=2003/xls、XSSFWorkbook=2007/xlsx)
Workbook workbook = new HSSFWorkbook();
// sheet
for (List<?> dataList: sheetDataListArr) {
makeSheet(workbook, dataList);
}
return workbook;
}
private static void makeSheet(Workbook workbook, List<?> sheetDataList){
// data
if (sheetDataList==null || sheetDataList.size()==0) {
throw new RuntimeException(">>>>>>>>>>> xxl-excel error, data can not be empty.");
}
// sheet
Class<?> sheetClass = sheetDataList.get(0).getClass();
ExcelSheet excelSheet = sheetClass.getAnnotation(ExcelSheet.class);
String sheetName = sheetDataList.get(0).getClass().getSimpleName();
int headColorIndex = -1;
if (excelSheet != null) {
if (excelSheet.name()!=null && excelSheet.name().trim().length()>0) {
sheetName = excelSheet.name().trim();
}
headColorIndex = excelSheet.headColor().getIndex();
}
Sheet existSheet = workbook.getSheet(sheetName);
if (existSheet != null) {
for (int i = 2; i <= 1000; i++) {
String newSheetName = sheetName.concat(String.valueOf(i)); // avoid sheetName repetition
existSheet = workbook.getSheet(newSheetName);
if (existSheet == null) {
sheetName = newSheetName;
break;
} else {
continue;
}
}
}
Sheet sheet = workbook.createSheet(sheetName);
// sheet field
List<Field> fields = new ArrayList<Field>();
if (sheetClass.getDeclaredFields()!=null && sheetClass.getDeclaredFields().length>0) {
for (Field field: sheetClass.getDeclaredFields()) {
if (Modifier.isStatic(field.getModifiers())) {
continue;
}
fields.add(field);
}
}
if (fields==null || fields.size()==0) {
throw new RuntimeException(">>>>>>>>>>> xxl-excel error, data field can not be empty.");
}
// sheet header row
CellStyle[] fieldDataStyleArr = new CellStyle[fields.size()];
int[] fieldWidthArr = new int[fields.size()];
Row headRow = sheet.createRow(0);
for (int i = 0; i < fields.size(); i++) {
// field
Field field = fields.get(i);
ExcelField excelField = field.getAnnotation(ExcelField.class);
String fieldName = field.getName();
int fieldWidth = 0;
HorizontalAlignment align = null;
if (excelField != null) {
if (excelField.name()!=null && excelField.name().trim().length()>0) {
fieldName = excelField.name().trim();
}
fieldWidth = excelField.width();
align = excelField.align();
}
// field width
fieldWidthArr[i] = fieldWidth;
// head-style、field-data-style
CellStyle fieldDataStyle = workbook.createCellStyle();
if (align != null) {
fieldDataStyle.setAlignment(align);
}
fieldDataStyleArr[i] = fieldDataStyle;
CellStyle headStyle = workbook.createCellStyle();
headStyle.cloneStyleFrom(fieldDataStyle);
if (headColorIndex > -1) {
headStyle.setFillForegroundColor((short) headColorIndex);
headStyle.setFillBackgroundColor((short) headColorIndex);
headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}
// head-field data
Cell cellX = headRow.createCell(i, CellType.STRING);
cellX.setCellStyle(headStyle);
cellX.setCellValue(String.valueOf(fieldName));
}
// sheet data rows
for (int dataIndex = 0; dataIndex < sheetDataList.size(); dataIndex++) {
int rowIndex = dataIndex+1;
Object rowData = sheetDataList.get(dataIndex);
Row rowX = sheet.createRow(rowIndex);
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
try {
field.setAccessible(true);
Object fieldValue = field.get(rowData);
String fieldValueString = FieldReflectionUtil.formatValue(field, fieldValue);
Cell cellX = rowX.createCell(i, CellType.STRING);
cellX.setCellValue(fieldValueString);
cellX.setCellStyle(fieldDataStyleArr[i]);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
// sheet finally
for (int i = 0; i < fields.size(); i++) {
int fieldWidth = fieldWidthArr[i];
if (fieldWidth > 0) {
sheet.setColumnWidth(i, fieldWidth);
} else {
sheet.autoSizeColumn((short)i);
}
}
}
/**
* 导出Excel文件到磁盘
*
* @param outputStream
* @param sheetDataListArr 数据,可变参数,如多个参数则代表导出多张Sheet
*/
public static void exportToFile(OutputStream outputStream, List<?>... sheetDataListArr){
// workbook
Workbook workbook = exportWorkbook(sheetDataListArr);
//FileOutputStream fileOutputStream = null;
try {
// workbook 2 FileOutputStream
//fileOutputStream = new FileOutputStream(filePath);
workbook.write(outputStream);
// flush
outputStream.flush();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (outputStream!=null) {
outputStream.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/**
* 导出Excel字节数据
*
* @param sheetDataListArr
* @return
*/
public static byte[] exportToBytes(List<?>... sheetDataListArr){
// workbook
Workbook workbook = exportWorkbook(sheetDataListArr);
ByteArrayOutputStream byteArrayOutputStream = null;
byte[] result = null;
try {
// workbook 2 ByteArrayOutputStream
byteArrayOutputStream = new ByteArrayOutputStream();
workbook.write(byteArrayOutputStream);
// flush
byteArrayOutputStream.flush();
result = byteArrayOutputStream.toByteArray();
return result;
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (byteArrayOutputStream != null) {
byteArrayOutputStream.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
自定义表名
import org.apache.poi.hssf.util.HSSFColor;
import java.lang.annotation.*;
/**
* 表信息
*
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ExcelSheet {
/**
* 表名称
*
* @return
*/
String name() default "";
/**
* 表头/首行的颜色
*
* @return
*/
HSSFColor.HSSFColorPredefined headColor() default HSSFColor.HSSFColorPredefined.LIGHT_GREEN;
}
自定义列名
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import java.lang.annotation.*;
/**
* 列属性信息
*
* 支持Java对象数据类型:Boolean、String、Short、Integer、Long、Float、Double、Date
* 支持Excel的Cell类型为:String
*
*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface ExcelField {
/**
* 列名称
*
* @return
*/
String name() default "";
/**
* 列宽 (大于0时生效; 如果不指定列宽,将会自适应调整宽度;)
*
* @return
*/
int width() default 0;
/**
* 水平对齐方式
*
* @return
*/
HorizontalAlignment align() default HorizontalAlignment.LEFT;
/**
* 时间格式化,日期类型时生效
*
* @return
*/
String dateformat() default "yyyy-MM-dd";
}
实体类
import com.example.demo.utils.ExcelField;
import com.example.demo.utils.ExcelSheet;
import org.apache.poi.hssf.util.HSSFColor;
import java.util.Date;
@ExcelSheet(name = "用户列表", headColor = HSSFColor.HSSFColorPredefined.LIGHT_GREEN)
public class User {
@ExcelField(name = "编号")
private Integer userId;
@ExcelField(name = "用户名")
private String username;
@ExcelField(name = "密码")
private String password;
@ExcelField(name = "生日")
private Date birthday;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
导入导出
import com.demo.domain.User;
import com.demo.util.ExcelExportUtil;
import com.demo.util.ExcelImportUtil;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class PoiControler {
@RequestMapping(value="/exportExcel")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws Exception{
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String filename = "员工列表"+format.format(new Date().getTime())+".xls";
response.setContentType("application/ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes(),"iso-8859-1"));
OutputStream out = response.getOutputStream();
try {
//需要导出的数据,例如
List<User> users = new ArrayList<>();
ExcelExportUtil.exportToFile(out,users);
} catch (Exception e) {
e.printStackTrace();
}finally{
out.close();
}
}
@PostMapping("/importExcel")
public String importExcel(MultipartFile excel) throws Exception{
Workbook workbook = WorkbookFactory.create(excel.getInputStream());
List<Object> list = ExcelImportUtil.importExcel(workbook, User.class);
if(list != null && list.size()>0){
for (Object object : list) {
User user = (User) object;
//业务
}
}
return "/需要跳转的页面";
}
}