java导入导出excle并给出 接口
时间: 2023-08-12 11:03:22 浏览: 89
首先,需要引入以下依赖项:
```xml
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
```
然后,可以使用以下接口来实现Excel文件的导入和导出:
```java
public interface ExcelService {
/**
* 导入Excel文件
* @param file Excel文件
* @param sheetName 工作表名称
* @param clazz 数据类型
* @param <T> 泛型
* @return 数据列表
* @throws Exception 异常
*/
<T> List<T> importExcel(MultipartFile file, String sheetName, Class<T> clazz) throws Exception;
/**
* 导出Excel文件
* @param dataList 数据列表
* @param sheetName 工作表名称
* @param clazz 数据类型
* @param fileName 文件名
* @param response HttpServletResponse
* @param <T> 泛型
* @throws Exception 异常
*/
<T> void exportExcel(List<T> dataList, String sheetName, Class<T> clazz, String fileName, HttpServletResponse response) throws Exception;
}
```
其中,`importExcel` 方法用于将 Excel 文件中的数据导入到 Java 对象列表中,`exportExcel` 方法用于将 Java 对象列表导出为 Excel 文件。
具体的实现可以参考以下代码:
```java
@Service
public class ExcelServiceImpl implements ExcelService {
private final static String EXCEL_XLS = "xls";
private final static String EXCEL_XLSX = "xlsx";
/**
* 导入Excel文件
*
* @param file Excel文件
* @param sheetName 工作表名称
* @param clazz 数据类型
* @param <T> 泛型
* @return 数据列表
* @throws Exception 异常
*/
@Override
public <T> List<T> importExcel(MultipartFile file, String sheetName, Class<T> clazz) throws Exception {
Workbook workbook = getWorkbook(file);
if (workbook == null) {
throw new Exception("Excel文件格式不正确");
}
Sheet sheet = getSheet(workbook, sheetName);
if (sheet == null) {
throw new Exception("工作表不存在");
}
List<T> dataList = new ArrayList<>();
List<String> headers = new ArrayList<>();
int rowCount = sheet.getPhysicalNumberOfRows();
for (int i = 0; i < rowCount; i++) {
Row row = sheet.getRow(i);
if (row == null) {
continue;
}
if (i == 0) {
int cellCount = row.getPhysicalNumberOfCells();
for (int j = 0; j < cellCount; j++) {
Cell cell = row.getCell(j);
if (cell == null) {
headers.add("");
} else {
headers.add(getCellValue(cell));
}
}
} else {
T data = clazz.newInstance();
int cellCount = headers.size();
for (int j = 0; j < cellCount; j++) {
Cell cell = row.getCell(j);
if (cell == null) {
continue;
}
String header = headers.get(j);
Field field = clazz.getDeclaredField(header);
field.setAccessible(true);
Class<?> fieldType = field.getType();
Object cellValue = getCellValue(cell);
if (cellValue == null) {
continue;
}
if (String.class == fieldType) {
field.set(data, cellValue.toString());
} else if (Integer.class == fieldType || int.class == fieldType) {
field.set(data, Integer.parseInt(cellValue.toString()));
} else if (Long.class == fieldType || long.class == fieldType) {
field.set(data, Long.parseLong(cellValue.toString()));
} else if (Double.class == fieldType || double.class == fieldType) {
field.set(data, Double.parseDouble(cellValue.toString()));
} else if (Float.class == fieldType || float.class == fieldType) {
field.set(data, Float.parseFloat(cellValue.toString()));
} else if (Boolean.class == fieldType || boolean.class == fieldType) {
field.set(data, Boolean.parseBoolean(cellValue.toString()));
} else if (Date.class == fieldType) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
field.set(data, sdf.parse(cellValue.toString()));
}
}
dataList.add(data);
}
}
return dataList;
}
/**
* 导出Excel文件
*
* @param dataList 数据列表
* @param sheetName 工作表名称
* @param clazz 数据类型
* @param fileName 文件名
* @param response HttpServletResponse
* @param <T> 泛型
* @throws Exception 异常
*/
@Override
public <T> void exportExcel(List<T> dataList, String sheetName, Class<T> clazz, String fileName, HttpServletResponse response) throws Exception {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet(sheetName);
List<Field> fields = Arrays.asList(clazz.getDeclaredFields());
int rowIndex = 0;
Row headerRow = sheet.createRow(rowIndex++);
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);
if (excelProperty != null) {
headerRow.createCell(i).setCellValue(excelProperty.value());
} else {
headerRow.createCell(i).setCellValue(field.getName());
}
}
for (T data : dataList) {
Row dataRow = sheet.createRow(rowIndex++);
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
field.setAccessible(true);
Object value = field.get(data);
if (value != null) {
if (value instanceof String) {
dataRow.createCell(i).setCellValue((String) value);
} else if (value instanceof Integer) {
dataRow.createCell(i).setCellValue((Integer) value);
} else if (value instanceof Long) {
dataRow.createCell(i).setCellValue((Long) value);
} else if (value instanceof Double) {
dataRow.createCell(i).setCellValue((Double) value);
} else if (value instanceof Float) {
dataRow.createCell(i).setCellValue((Float) value);
} else if (value instanceof Boolean) {
dataRow.createCell(i).setCellValue((Boolean) value);
} else if (value instanceof Date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
dataRow.createCell(i).setCellValue(sdf.format((Date) value));
}
}
}
}
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(), StandardCharsets.ISO_8859_1));
workbook.write(response.getOutputStream());
}
/**
* 获取工作表
*
* @param workbook 工作簿
* @param sheetName 工作表名称
* @return 工作表
*/
private Sheet getSheet(Workbook workbook, String sheetName) {
return StringUtils.isEmpty(sheetName) ? workbook.getSheetAt(0) : workbook.getSheet(sheetName);
}
/**
* 获取工作簿
*
* @param file Excel文件
* @return 工作簿
* @throws IOException 异常
*/
private Workbook getWorkbook(MultipartFile file) throws IOException {
String fileName = file.getOriginalFilename();
if (StringUtils.isEmpty(fileName)) {
return null;
}
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
InputStream inputStream = file.getInputStream();
if (suffix.equalsIgnoreCase(EXCEL_XLS)) {
return new HSSFWorkbook(inputStream);
} else if (suffix.equalsIgnoreCase(EXCEL_XLSX)) {
return new XSSFWorkbook(inputStream);
} else {
return null;
}
}
/**
* 获取单元格的值
*
* @param cell 单元格
* @return 值
*/
private Object getCellValue(Cell cell) {
if (cell == null) {
return null;
}
switch (cell.getCellTypeEnum()) {
case BLANK:
return null;
case BOOLEAN:
return cell.getBooleanCellValue();
case ERROR:
return null;
case FORMULA:
return cell.getCellFormula();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue();
} else {
return cell.getNumericCellValue();
}
case STRING:
return cell.getStringCellValue();
default:
return null;
}
}
}
```
这里实现了 `ExcelService` 接口,并使用了 `Apache POI` 库来读写 Excel 文件。其中,`importExcel` 方法使用了反射来将 Excel 中的数据映射到 Java 对象中,`exportExcel` 方法则使用了注解来获取 Java 对象中的字段名和 Excel 中的列名进行对应。
注:需要在 Java 对象中使用 `@ExcelProperty("列名")` 注解来指定 Excel 中的列名。
阅读全文