因为程序版本的限制,最多只能用到poi3.15,所以用不了easyexcel。小类初衷。草率的写,也没有测试什么很大量数据的情况,有问题可以指出来哟。
由于程序的中心思想是解决导出excel,所以数据是单纯的对象属性不包括list等等。分为两个步骤,一个是注释,还有一个就是工具类操作。
我的程序是测试导成本地的,如果你要用来发给前端什么的也可以另外写输出。
注释定义:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Inherited
public @interface PoiExcel {
String value();
int index();
}
其中index表示该属性对应在excel中的列数,value表示列标题。
工具类定义:
包括以下几个部分
1.创建表头 createHeader
2.单条数据行的写入 writeDatas
3.多条数据的写入 getHSSFWorkbook
4.创建表头样式 getStringCenterStyle
5.main函数测试
public class ExcelUtil<T> {
/**
* 根据传入的对象创建HSSFWorkbook
*
* @param wb
* @param dataList
* @param <T>
* @param pageSize 一页多少条
* @return
*/
public static <T> HSSFWorkbook getHSSFWorkbook(HSSFWorkbook wb, List<T> dataList, Class<T> clazz, int pageSize) {
if (wb == null) {
wb = new HSSFWorkbook();
}
if (dataList == null) {
createHeader(wb, String.valueOf(0), clazz);
return wb;
}
int j = 0;
int maxRow = pageSize;//sheet.getLastRowNum();65535
if (maxRow > 65535) {
maxRow = 65535;
}
int dataSize = dataList.size();
HSSFSheet sheet = null;
for (int i = 0; i < dataSize; i++) {
if (i % maxRow == 0) {
sheet = createHeader(wb, String.valueOf(j++), clazz);
}
writeDatas(sheet, dataList.get(i), clazz, (i % maxRow + 1));
}
try {
if(wb != null){
wb.close();
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
return wb;
}
/**
* 创建表格头
* @param wb
* @param sheetName
* @param clazz
* @param <T>
* @return
*/
public static <T> HSSFSheet createHeader(HSSFWorkbook wb, String sheetName, Class<T> clazz) {
HSSFSheet sheet = wb.createSheet(sheetName);
HSSFRow row = sheet.createRow(0);
Field[] fields = clazz.getDeclaredFields();
HSSFCell cell;
HSSFCellStyle style = getStringCenterStyle(wb);
for (Field field : fields) {
PoiExcel poiExcel = field.getAnnotation(PoiExcel.class);
cell = row.createCell(poiExcel.index());
cell.setCellStyle(style);//设置单元格格式为"文本"
cell.setCellType(CellType.STRING);
cell.setCellValue(poiExcel.value());
}
return sheet;
}
/**
* 行数据填写
* @param sheet
* @param data
* @param clazz
* @param rowNum
* @param <T>
*/
public static <T> void writeDatas(HSSFSheet sheet, T data, Class<T> clazz, int rowNum) {
Field[] fields = clazz.getDeclaredFields();
List<Field> fieldList = Arrays.asList(fields);
HSSFRow row = sheet.createRow(rowNum);
fieldList.stream().forEach(field -> {
field.setAccessible(true);
PoiExcel poiExcel = field.getAnnotation(PoiExcel.class);
String fieldVal = "";
try {
fieldVal = (String) field.get(data);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
row.createCell(poiExcel.index()).setCellValue(fieldVal);
});
}
/**
* 样式
* @param wb
* @return
*/
public static HSSFCellStyle getStringCenterStyle(HSSFWorkbook wb) {
HSSFCellStyle style = wb.createCellStyle();
HSSFDataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("@"));
style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
return style;
}
/**
* excel export usage
* @param args
*/
public static void main(String[] args) {
List<TestEntity> a = new ArrayList<>();
TestEntity a1 = new TestEntity();
a1.setT1("1");
a1.setT2("2");
TestEntity a2 = new TestEntity();
a2.setT1("1");
a2.setT2("2");
a.add(a1);
a.add(a2);
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(null, a, TestEntity.class, 1);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File("F://test.xls"));
wb.write(fos);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}