同学们学习java时,导出可能使用简单的IO比较多,导出execl功能可能不太了解,刚刚好今天写了一个导出功能,给大家参考:
需求:根据地市分别查出各个地市部门的相关内容,再根据不同专业分表在一个execl文件导出
大家应该发现了要点:涉及到execl的内容填写和表格的行列合并,会了这些操作基本上就能应对大部分的execl导出功能实现
主要思路:合并好单元格,填写好固定的列名,然后遍历填写地市和地市相关数据
直接上代码和注释:
// 创建一个Excel表格
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建自己的数据结构保存数据
Map<String,List> execl = new HashMap<>();
//外层循环遍历分表条件分表
for (int j = 0; j < itemspeccode.length; j++) {
//创建数据类型存储一张表内的数据
List<Map<String, Map>> ltList = new ArrayList<>();
//遍历表内需要查询的数据
for (int i = 0; i < lt.length; i++) {
//查出一行数据
Map<String,Map> result =iMssProjectWarnService.getexeclConstructionCokpit(latnId, lt[i], itemspeccode[j]);
ltList.add(result);
}
execl.put(getName(itemspeccode[j]),ltList);
//创建分表和命名,就是下方的sheet1,2,3...这种
HSSFSheet sheet = workbook.createSheet(getName(itemspeccode[j]));
//设计列的宽度(列,宽度)
sheet.setColumnWidth(1, 6000);
sheet.setColumnWidth(2, 6000);
sheet.setColumnWidth(3, 6000);
sheet.setColumnWidth(4, 6000);
sheet.setColumnWidth(5, 6000);
sheet.setColumnWidth(6, 6000);
sheet.setColumnWidth(7, 6000);
sheet.setColumnWidth(8, 6000);
sheet.setColumnWidth(9, 6000);
sheet.setColumnWidth(10, 6000);
sheet.setColumnWidth(11, 6000);
sheet.setColumnWidth(12, 6000);
//合并单元格和添加数据
HSSFRow row0 = sheet.createRow(0);
HSSFCell cell0 = row0.createCell(0);
cell0.setCellValue(getName(itemspeccode[j]));
//合并单元格CellRangeAddress(起始行,结束行,起始列,结束列)
sheet.addMergedRegion(new CellRangeAddress(0,0,0,10));
sheet.addMergedRegion(new CellRangeAddress(1,2,0,0));
sheet.addMergedRegion(new CellRangeAddress(1,1,1,6));
sheet.addMergedRegion(new CellRangeAddress(1,1,7,12));
//添加数据以起始行为赋值位置
HSSFRow row12 = sheet.createRow(1);
row12.createCell(0).setCellValue("单位");
row12.createCell(1).setCellValue("在建工程交付");
row12.createCell(7).setCellValue("在建工程关闭");
//第一行填充固定名称数据
HSSFRow row = sheet.createRow(2);
row.createCell(1).setCellValue("当前交付超期工程数");
row.createCell(2).setCellValue("当前在建工程数");
row.createCell(3).setCellValue("当前在建工程超期率(%)");
row.createCell(4).setCellValue("当年交付超期工程数");
row.createCell(5).setCellValue("当年在建工程数");
row.createCell(6).setCellValue("当年在建工程超期率(%)");
row.createCell(7).setCellValue("当前关闭超期工程数");
row.createCell(8).setCellValue("当前在建工程数");
row.createCell(9).setCellValue("当前在建工程超期率(%)");
row.createCell(10).setCellValue("当年关闭超期工程数");
row.createCell(11).setCellValue("当年在建工程数");
row.createCell(12).setCellValue("当年在建工程超期率(%)");
//遍历地市名称,一行一行循环添加
//提取的方法,execl就是前面定义的存储数据的数据结构,sheet就是开头定义HSSFSheet sheet = workbook.createSheet(getName(itemspeccode[j]));
for (int i = 0; i < lt.length; i++) {
extracted(execl, sheet, itemspeccode[j],getCityName(lt[i]),i,3);
}
HSSFRow row14 = sheet.createRow(14);
row14.createCell(0).setCellValue("本地网");
}
// 将Excel文件输出到输出流
OutputStream outputStream = response.getOutputStream();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
workbook.close();
}
下面就是一个提取出来的方法用来一行一行填入,可能大家和我的填写方式不尽相同,但是可以参考,总结操作就是创建一个行然后加固定位置加数据
private void extracted(Map<String, List> execl, HSSFSheet sheet, String itemspeccode,String dishi,int i,int j) {
//从第n行开始添加
HSSFRow row2 = sheet.createRow(j+i);
//选择表格位置填值操作,之后类似
row2.createCell(0).setCellValue(dishi);
//查出数据
Map<String,Map> o = (Map) execl.get(getName(itemspeccode)).get(i);
Long num = (Long) o.get(dishi).get("当前交付超期");
//选择表格位置填值操作,之后类似
row2.createCell(1).setCellValue(num);
//..........类似代码
}
导出效果就是这样,和需求一模一样非常完美哦。要根据列去加行也是这样类似的操作。(关于这个表格个性化,应该也是有办法的,不过我还没去研究)
原创不易禁止转载哦