Java导入导出工具类代码实现
时间: 2025-01-03 21:40:45 浏览: 8
### Java Excel 导入导出工具类实现
#### 单Sheet导出功能
为了实现出色的Excel操作,在Java中通常会使用Apache POI库来处理Excel文件。下面是一个简单的例子展示如何创建一个单Sheet导出的功能。
```java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public class ExcelExportUtil {
public static void exportSingleSheet(List<?> dataList, String sheetName, HttpServletResponse response) throws IOException {
SXSSFWorkbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet(sheetName);
// 创建表头
Row headerRow = sheet.createRow(0);
Class<?> clazz = dataList.get(0).getClass();
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Cell cell = headerRow.createCell(i);
ExcelAttribute excelAttr = fields[i].getAnnotation(ExcelAttribute.class);
if (excelAttr != null) {
cell.setCellValue(excelAttr.name());
}
}
// 填充数据行
int rowNum = 1;
for (Object obj : dataList) {
Row row = sheet.createRow(rowNum++);
for (int i = 0; i < fields.length; i++) {
try {
Field field = clazz.getDeclaredField(fields[i].getName());
field.setAccessible(true);
Object value = field.get(obj);
Cell cell = row.createCell(i);
if (value instanceof Integer || value instanceof Long || value instanceof Double) {
cell.setCellValue(((Number)value).doubleValue());
} else if (value instanceof Date){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
cell.setCellValue(sdf.format(value));
} else{
cell.setCellValue(String.valueOf(value));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 输出至客户端浏览器下载
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(sheetName+".xlsx", "UTF-8"));
ServletOutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
workbook.close();
outputStream.flush();
outputStream.close();
}
}
```
此代码片段展示了`exportSingleSheet`函数,它接受一个泛型列表作为输入参数并将其写入到一个新的工作簿的工作表里[^1]。
#### 多Sheet导出功能
对于多Sheet的情况,则可以在上述基础上稍作修改:
```java
// ...省略部分相同代码...
for(int j=0;j<listOfDataLists.size();j++){
List<?> dataList = listOfDataLists.get(j);
Sheet sheet = workbook.createSheet("Sheet"+(j+1));
// 同样的逻辑填充每个sheet的内容...
}
// 继续完成剩余的操作...
```
这里假设有一个名为`listOfDataLists`的对象保存着多个待导出的数据集,循环遍历这些集合并将它们分别放入不同的Sheets中。
#### 数据字典KV映射支持
当涉及到需要将某些特定值转换成更易读的文字描述时(比如状态码转为中文说明),可以通过定义额外的方法或利用自定义注解配合反射机制来达成目的。例如,在实体类字段上添加如下注解:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface DictMapping {
String dictKey() default "";
}
```
接着在获取单元格值之前先判断是否存在这样的映射关系,并做相应的替换处理。
阅读全文