parent
483c60bf59
commit
ae0e1b7e82
@ -0,0 +1,147 @@
|
||||
package com.ruoyi.common.utils.poi;
|
||||
|
||||
import com.ruoyi.common.annotation.Excel;
|
||||
import org.apache.poi.ss.usermodel.Cell;
|
||||
import org.apache.poi.ss.usermodel.Row;
|
||||
import org.apache.poi.ss.usermodel.Sheet;
|
||||
import org.apache.poi.ss.usermodel.Workbook;
|
||||
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.Field;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* ClassName: MultiSheetExcelUtil
|
||||
* Package: com.ruoyi.common.utils.poi
|
||||
* Description:
|
||||
*
|
||||
* @Author wangxy
|
||||
* @Create 2025/4/18 10:43
|
||||
* @Version 1.0
|
||||
*/
|
||||
public class MultiSheetExcelUtil {
|
||||
|
||||
private Workbook workbook;
|
||||
private HttpServletResponse response;
|
||||
private String fileName;
|
||||
|
||||
public MultiSheetExcelUtil() {
|
||||
this.workbook = new SXSSFWorkbook();
|
||||
}
|
||||
|
||||
public void initExport(HttpServletResponse response, String fileName) {
|
||||
this.response = response;
|
||||
this.fileName = fileName;
|
||||
}
|
||||
|
||||
public <T> void createSheet(List<T> list, String sheetName, Class<T> clazz) {
|
||||
Sheet sheet = workbook.createSheet(sheetName);
|
||||
List<Object[]> fields = getFields(clazz);
|
||||
createTitleRow(sheet, fields);
|
||||
fillDataRows(sheet, list, fields);
|
||||
}
|
||||
|
||||
public void finishExport() throws IOException {
|
||||
try {
|
||||
String encodedFileName = encodeFilename(fileName);
|
||||
response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + encodedFileName);
|
||||
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
|
||||
workbook.write(response.getOutputStream());
|
||||
} finally {
|
||||
if (workbook != null) {
|
||||
((SXSSFWorkbook) workbook).dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 新增的编码方法
|
||||
private String encodeFilename(String filename) {
|
||||
try {
|
||||
return URLEncoder.encode(filename, "UTF-8").replace("+", "%20");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
return filename;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<Object[]> getFields(Class<?> clazz) {
|
||||
List<Object[]> fields = new ArrayList<>();
|
||||
Field[] declaredFields = clazz.getDeclaredFields();
|
||||
for (Field field : declaredFields) {
|
||||
Excel excel = field.getAnnotation(Excel.class);
|
||||
if (excel != null) {
|
||||
fields.add(new Object[]{field.getName(), excel.name(), excel.readConverterExp(), excel.dictType(), excel.sort()});
|
||||
}
|
||||
}
|
||||
Class<?> superClass = clazz.getSuperclass();
|
||||
while (superClass != null) {
|
||||
Field[] superFields = superClass.getDeclaredFields();
|
||||
for (Field field : superFields) {
|
||||
Excel excel = field.getAnnotation(Excel.class);
|
||||
if (excel != null) {
|
||||
fields.add(new Object[]{field.getName(), excel.name(), excel.readConverterExp(), excel.dictType(), excel.sort()});
|
||||
}
|
||||
}
|
||||
superClass = superClass.getSuperclass();
|
||||
}
|
||||
fields.sort(Comparator.comparing(o -> (Integer) o[4]));
|
||||
return fields;
|
||||
}
|
||||
|
||||
private void createTitleRow(Sheet sheet, List<Object[]> fields) {
|
||||
Row row = sheet.createRow(0);
|
||||
for (int i = 0; i < fields.size(); i++) {
|
||||
Cell cell = row.createCell(i);
|
||||
cell.setCellValue((String) fields.get(i)[1]);
|
||||
}
|
||||
}
|
||||
|
||||
private <T> void fillDataRows(Sheet sheet, List<T> list, List<Object[]> fields) {
|
||||
int rowNum = 1;
|
||||
for (T item : list) {
|
||||
Row row = sheet.createRow(rowNum++);
|
||||
for (int i = 0; i < fields.size(); i++) {
|
||||
Cell cell = row.createCell(i);
|
||||
Object[] fieldInfo = fields.get(i);
|
||||
String fieldName = (String) fieldInfo[0];
|
||||
Object value = getFieldValueByName(fieldName, item);
|
||||
setCellValue(cell, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Object getFieldValueByName(String fieldName, Object obj) {
|
||||
try {
|
||||
Field field = obj.getClass().getDeclaredField(fieldName);
|
||||
field.setAccessible(true);
|
||||
return field.get(obj);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void setCellValue(Cell cell, Object value) {
|
||||
if (value == null) {
|
||||
cell.setCellValue("");
|
||||
} else if (value instanceof String) {
|
||||
cell.setCellValue((String) value);
|
||||
} else if (value instanceof Integer) {
|
||||
cell.setCellValue((Integer) value);
|
||||
} else if (value instanceof Long) {
|
||||
cell.setCellValue((Long) value);
|
||||
} else if (value instanceof Double) {
|
||||
cell.setCellValue((Double) value);
|
||||
} else if (value instanceof Boolean) {
|
||||
cell.setCellValue((Boolean) value);
|
||||
} else {
|
||||
cell.setCellValue(value.toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue