首先展示出来的效果图,避免浪费大家查找的时间
效果如上;前后列合并,中间列不合并
代码如下:
方法参数: List<OrderExcl> orders, 一行记录对应一个类
XSSFWorkbook wb = new XSSFWorkbook();
//sheet的名字
XSSFSheet sheet = wb.createSheet("订单列表");
//设置默认列宽和行高
sheet.setDefaultColumnWidth((short) 20);
sheet.setDefaultRowHeightInPoints(20);
//标题行,第0行数据,就是图片上的蓝色行
XSSFRow row = sheet.createRow(0);
String[] str = {"业务员", "客户姓名", "客户电话",........};
// 第一行
Field[] declaredFields = orderCondition.getClass().getDeclaredFields();
OutputStream out = null;
try {
//设置样式
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
cellStyle.setFillForegroundColor(HSSFColor.ROYAL_BLUE.index);
//第一行数据
for (int i = 0; i < str.length; i++) {
//填充背景颜色
row.createCell(i).setCellStyle(cellStyle);
row.getCell(i).setCellValue(str[i]);
}
//拿出所有的数据
Iterator<OrderExcl> iterator = orders.iterator();
//一条数据就是一行记录,开始起始的行号
int index = 1;
while (iterator.hasNext()) {
//这个作用是为了记录需要合并的行的起始行
int temp = index;
OrderExcl order = iterator.next();
List<Goods> goods = order.getGoods();
int num = 0;
if (null != goods && goods.size() > 0) {
num += goods.size();
}
//合并行的结束行号
index += num;
//获取所有的属/性名
Class orderClass = order.getClass();
Field[] fields = orderClass.getDeclaredFields();
//以不需要合并行的个数,作为需要创建的行数
for (int e = 0; e < num; e++) {
XSSFRow sheetRow = sheet.createRow(temp + e);
for (int i = 0; i < fields.length; i++) {
//填充不需要合并列的数据信息 start
if (i == 23) {
String name = goods.get(e).getShpMingCheng() == null ? "" : goods.get(e).getShpMingCheng();
sheetRow.createCell(24).setCellValue(name);
continue;
}
if (i == 24) {
String code = goods.get(e).getShpBianMa() == null ? "" : goods.get(e).getShpBianMa();
sheetRow.createCell(23).setCellValue(code);
continue;
}
if (i == 25) {
String weight = goods.get(e).getZhlKg() == null ? "" : goods.get(e).getZhlKg().toString();
sheetRow.createCell(25).setCellValue(weight);
continue;
}
//填充不需要合并列的数据信息 end