首先在pom.xml文件中导入相关的依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15-beta2</version>
</dependency>
下面开始编写导出代码(主要为了实现功能,样式细节可以自己去百度了解)
使用的是泛型集合
public class dervedForm {
public void getExcel(OutputStream outputStream, List<?> list) throws IllegalAccessException, IOException {
//创建工作簿对象
XSSFWorkbook workbook = new XSSFWorkbook();
//max为每一页最大显示行数,需要封装工具类可以写在入参列表中
int max = 100;
//这个是一个标记,用来判断当前数据量需要分为几页来显示
int z = 1;
//变量Z会参与下面的循环中,如果if成立对于当前代码来说就是需要插入的行数刚好是max的倍数
if (list.size() % max == 0) {
z = 0;
}
//使用三层循环,循环条件参考上面的注解
for (int i = 0; i < list.size() / max + z; i++) {
//这个对象就是Excel中的页,参数为页面名字
XSSFSheet sheet = workbook.createSheet("第" + i+"页");
//这个是表格的表头信息,需要封装类的可以使用入参传入
String[] headerStr = new String[]{"企业id", "店铺id", "批次号", "商户订单号", "订单状态(1--待付款;" +
"2--待确认;3--待发货;4--待收货;5--已完成;6--已取消;)", "付款状态(0--未支付;1--已支付;)", "商品总数量", "订单商品总金额(商城价)", "订单实际金额", "订单支付金额(支付后填充)", "订单支付时间", "订单优惠金额", "折扣(0.1=10%)", "创建用户", "是否已经同步到erp(0--未同步;1--已同步;)", "店铺数据编码"};
//创建行,标题在第0行
XSSFRow headerROW = sheet.createRow(0);
for (int p = 0; p < headerStr.length; p++) {
//宽度
sheet.setColumnWidth(p, 5000);
}
//设置头单元格风格
XSSFCellStyle headerStyle = workbook.createCellStyle();
//居中
headerStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
//设置字体
XSSFFont headerFont = workbook.createFont();
headerFont.setFontName("宋体");
//提交字体风格
headerStyle.setFont(headerFont);
//循环给表头赋值
for (int p = 0; p < headerStr.length; p++) {
//创建一个单元格
XSSFCell headerCell = headerROW.createCell(p);
//插入设计的风格
headerCell.setCellStyle(headerStyle);
//插入标题
headerCell.setCellValue(headerStr[p]);
}
//设置头单元格风格 bodyStyle是表体
XSSFCellStyle bodyStyle = workbook.createCellStyle();
//居中
headerStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
//设置字体
XSSFFont bodyFont = workbook.createFont();
headerFont.setFontName("微软雅黑");
headerStyle.setFont(bodyFont);
//循环插入表体数据
for (int p=0; p < max; p++){
// 判断越界
if (p + i * max == list.size()){
break;
}
//插入在第P+1行(之所以加一是因为第一行写了标题)
XSSFRow bodyROW = sheet.createRow(p + 1);
//通过反射获得当前位置下的入参集合中的对象属性值装入到数组中
Field[] declaredFields = list.get(p + i * max).getClass().getDeclaredFields();
for (int j=0;j<declaredFields.length;j++){
//这个是反射机制的知识点,可以无视属性修饰符
declaredFields[j].setAccessible(true);
XSSFCell bodyCell = bodyROW.createCell(j);
bodyCell.setCellStyle(bodyStyle);
//再次通过反射获取到当前操作到的对象中的属性值,强转为字符串写入
bodyCell.setCellValue(String.valueOf(declaredFields[j].get(list.get(p+i*max))));
}
}
}
//写入流
workbook.write(outputStream);
}
到这里写入完成,只需要调用即可,在调用处创建文件流传入参数即可
最后补充一下,如果对导出的版本有疑问的话, XSSFWorkbook创建的是2007后的Excel , HSSFWorkbook创建的是2003的,其他完全没有区别。
实现效果