实现的功能
maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
具体实现如下
/**
*
* @param Map<Object,Object>:excLoad 具体配置:配置方法put("配置名",值);
* List<Map> list :导出的数据集(第一行标题除外)(必须配)
* Map<String,String> header:导出数据的标题(第一行的内容)及对应的name值 例如:age='年龄'(必需配)
* String fileName :导出的文件名,没有配置则为 sheet.xls
* String titName:表格标题,没有配置则不显示
* String describe:描述字段,没有配置则不显示,位置在表格标题下方,如没有配置标题则在第一行
* List<String> field:指定输出的列名(name值),没有配置则默认输出全部列,必需为header内有的name,长度小于header的长度
* Integer startId:指定导出的数据的开始序号,第一行数据为1,没有配置默认从第一个数据开始
* Integer endId:指定导出的数据的结束序号,没有配置默认为最后一个的数据序号
* String bottom :追加内容,显示在表格最后一行,没有配置则不显示
* @param response
* @return true/false
*/
public static boolean excLoad(Map<Object,Object> excLoad, HttpServletResponse response){
//创建一个Excel对象
HSSFWorkbook workbook=new HSSFWorkbook();
//计数字段
int rowNum=0;
// 创建一个Excel的Sheet
HSSFSheet sheet = workbook.createSheet();
//创建一个字体样式
HSSFFont headfont = workbook.createFont();
headfont.setFontName("黑体");
headfont.setFontHeightInPoints((short) 12);// 字体大小
headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
//创建一个样式
HSSFCellStyle headstyle = workbook.createCellStyle();
headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
//List<LinkedHashMap> 导出的数据集(第一行标题除外)
List<Map> list= (List<Map>) excLoad.get("list");
list=list==null?null:list;
//header 导出数据的标题(第一行的内容)及对应的name值 例如:age='年龄'
Map<String,String> header= (Map<String, String>) excLoad.get("header");
header=header==null?null:header;
//fileName 导出的文件名
String fileName= (String) excLoad.get("fileName");
fileName=fileName==null?"sheet":fileName;
//标题
String titName= (String) excLoad.get("titName");
titName=titName==null?null:titName;
//描述
String describe= (String) excLoad.get("describe");
describe=describe==null?null:describe;
//输出的字段列表
List<String> field= (List<String>) excLoad.get("field");
field=field==null?null:field;
// 输出的开始位置
Integer startId= (Integer) excLoad.get("startId");
startId=startId==null?1:startId;
//输出的结束位置
Integer endId= (Integer) excLoad.get("endId");
endId=endId==null?list.size():endId;
//追加内容
String bottom= (String) excLoad.get("bottom");
bottom=bottom==null?null:bottom;
//表第一列的标题名称数组
List<String> headers=new ArrayList<>();
//根据标题名称一一对应数据库映射字段(为了从map.get(key)取值)
List<String> tableNames=new ArrayList<>();
//表的总列数
Integer sheetCount=null;
//初始化headers和tableNames
if(header!=null&&field==null){
for (Map.Entry<String,String> entry : header.entrySet()) {
headers.add(entry.getValue());
tableNames.add(entry.getKey());
}
sheetCount=header.size();
}
//根据输出的字段列表,更改tableNames和headers的值
if(field!=null){
tableNames=field;
for (String f : field) {
headers.add(header.get(f));
}
sheetCount=headers.size();
}
for (int i = 0; i < sheetCount; i++) {
//设置列宽
sheet.setColumnWidth(i, 3766);
}
//设置第一行标题行,为null,则为空
if(titName!=null){
//设置样式
HSSFCellStyle headstyle1=workbook.createCellStyle();
headstyle1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
headstyle1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
headstyle1.setFont(headfont);
//创建第一行
HSSFRow row0 = sheet.createRow(rowNum);
row0.setHeight((short) 400);
//合并单元格
CellRangeAddress range= new CellRangeAddress(rowNum,rowNum,0,sheetCount-1);
sheet.addMergedRegion(range);
// 创建第一列
HSSFCell cell0 = row0.createCell(0);
cell0.setCellValue(new HSSFRichTextString(titName));
//设置样式
cell0.setCellStyle(headstyle1);
rowNum++;
}
//设置描述行内容,为null,则为空
if (describe!=null){
//创建第一行
HSSFRow row0 = sheet.createRow(rowNum);
row0.setHeight((short) 300);
//合并单元格
CellRangeAddress range= new CellRangeAddress(rowNum,rowNum,0,sheetCount-1);
sheet.addMergedRegion(range);
// 创建第一列
HSSFCell cell0 = row0.createCell(0);
cell0.setCellValue(new HSSFRichTextString(describe));
rowNum++;
}
//设置字段行
HSSFRow rowField = sheet.createRow(rowNum);
for (int i = 0; i < headers.size(); i++) {
rowField.createCell(i).setCellValue(new HSSFRichTextString(headers.get(i)));
}
rowNum++;
//添加具体数据
HSSFRow rowValue=null;
for (int i = startId-1; i < endId; i++) {
rowValue = sheet.createRow(rowNum);
for(int j=0 ;j<tableNames.size();j++){
rowValue.createCell(j).setCellValue(new HSSFRichTextString(list.get(i).
get(tableNames.get(j)).toString()));
}
rowNum++;
}
//添加追加内容
if(bottom!=null){
HSSFRow rowBottom=sheet.createRow(rowNum);
rowBottom.setHeight((short) 300);
HSSFCell cell0 = rowBottom.createCell(0);
cell0.setCellValue(new HSSFRichTextString(bottom));
//合并单元格
CellRangeAddress range= new CellRangeAddress(rowNum,rowNum,0,sheetCount-1);
sheet.addMergedRegion(range);
}
try {
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1") + ".xls");
response.flushBuffer();
workbook.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
测试代码
List<Map> list=new ArrayList<>();
Map<String,String> map=new LinkedHashMap<>();
map.put("name","张三");
map.put("age","12");
map.put("sex","男");
list.add(map);
Map<String,String> map2=new LinkedHashMap<>();
map2.put("name","张三2");
map2.put("age","122");
map2.put("sex","男2");
list.add(map2);
Map<String,String> map3=new LinkedHashMap<>();
map3.put("name","张三3");
map3.put("age","123");
map3.put("sex","男3");
list.add(map3);
Map<String,String> map4=new LinkedHashMap<>();
map4.put("name","张三4");
map4.put("age","1224");
map4.put("sex","男4");
list.add(map4);
Map<String,String> map5=new LinkedHashMap<>();
map5.put("name","张三5");
map5.put("age","1225");
map5.put("sex","男5");
list.add(map5);
Map<String,String> hearder=new LinkedHashMap<>();
hearder.put("name","姓名");
hearder.put("age","年龄");
hearder.put("sex","性别");
Map<Object,Object> map1=new HashMap<>();
List<String> field=new ArrayList<>();
field.add("name");
field.add("age");
map1.put("list",list);
map1.put("header",hearder);
map1.put("fileName","nice");
map1.put("titName","这是个很高端的标题");
map1.put("field",field);
map1.put("bottom","这是追加内容");
map1.put("describe","描述:test测试test测试test测试test测试test测试test测试test测试test测试test测试");
map1.put("startId",2);
map1.put("endId",4);
Boolean a= ExcLoadUtil.excLoad(map1,response);
System.out.println(a);
源码如下: https://download.csdn.net/download/qq_41974343/12437839
---------------------------------------------------------结束--------------------------------------------------