/**
* 三层级打印
* @author jq.Li
* @date Feb 13, 20196:59:41 PM
*
* @param bt 底部显示的名称:"Sheet1"
* @param fileName 导出文件的名称;
* @param Title 列名;
* @param name 数据Map分装对应的Key;
* @param listContent 打印数据集合(需要拆封,涉及到单元格合并数量),格式定义好的
* @param response
* @return
*/
public final static String exportExcel(String bt,String fileName, String[] Title,
String[] name, List<Object> listContent,
HttpServletResponse response) {
String result = "系统提示:Excel文件导出成功!";
// 以下开始输出到EXCEL
try {
// 定义输出流,以便打开保存对话框______________________begin
OutputStream os = response.getOutputStream();// 取得输出流
response.reset();// 清空输出流
//response.setContentType("application/octet-stream; charset=UTF-8");
fileName=fileName+new SimpleDateFormat("yyyyMMddHH:mm:ss").format(new Date())+".xls";
response.setHeader("Content-disposition", "attachment; filename="
+ new String(fileName.getBytes("GB2312"), "ISO8859-1"));
// 设定输出文件头
response.setContentType("application/msexcel");// 定义输出类型
// 定义输出流,以便打开保存对话框_______________________end
/** **********创建工作簿************ */
WritableWorkbook workbook = Workbook.createWorkbook(os);
/** **********创建工作表************ */
WritableSheet sheet = workbook.createSheet(bt, 0);
/** **********设置纵横打印(默认为纵打)、打印纸***************** */
jxl.SheetSettings sheetset = sheet.getSettings();
sheetset.setProtected(false);
/** ************设置单元格字体************** */
WritableFont NormalFont = new WritableFont(WritableFont.ARIAL, 10);
WritableFont BoldFont = new WritableFont(WritableFont.ARIAL, 10,
WritableFont.BOLD);
/** ************以下设置两种种单元格样式,灵活备用************ */
// 用于标题居中
WritableCellFormat wcf_center = new WritableCellFormat(BoldFont);
wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条
wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐
wcf_center.setWrap(false); // 文字是否换行
// 用于正文居左
WritableCellFormat wcf_left = new WritableCellFormat(NormalFont);
wcf_left.setBorder(Border.NONE, BorderLineStyle.THIN); // 线条
wcf_left.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐
wcf_left.setAlignment(Alignment.LEFT); // 文字水平对齐
wcf_left.setWrap(false); // 文字是否换行
/** ***************以下是EXCEL开头大标题,暂时省略********************* */
// sheet.mergeCells(0, 0, colWidth, 0);
// sheet.addCell(new Label(0, 0, "XX报表", wcf_center));
/** ***************以下是EXCEL第一行列标题********************* */
for (int i = 0; i < Title.length; i++) {
sheet.addCell(new Label(i, 0, Title[i], wcf_center));
}
/** ***************以下是EXCEL正文数据********************* */
// 0.根据下面需要的数据定义集合
List hyDataList = new ArrayList(); // 行业数据集合
List hyXlDataList = new ArrayList(); // 行业小类数据集合
int hyHyxlCount=0; // 某个行业下的小类数量
int hyAllXlCount=0; // 全部的行业小类数量
int hyLastXlCount=0;// 当前循环的之前的所有行业小类数量
// 1.拆分 listContent
for (int i = 0; i < listContent.size(); i++) {
// { CONTENT=分局, xlList= [] }
Map map = (Map) listContent.get(i);
if(map!=null){
hyDataList = (List)map.get("xlList");
if(hyDataList!=null&&hyDataList.size()>0){
for (int j = 0; j < hyDataList.size(); j++) {
// { CONTENT=某行业, xlList=[]}
Map map2 = (Map) hyDataList.get(j);
if(map2!=null&&map2.size()>0){
hyXlDataList = (List)map2.get("xlList");
if(hyXlDataList!=null){
for (int k = 0; k < hyXlDataList.size(); k++) {
hyAllXlCount++;
// 真正要导出的数据内容: { CONTENT=特大型 }
Map map3 = (Map) hyXlDataList.get(k);
// 2.绘制好Excel固定格式的 Label( column<x轴>, row<y轴>, value )
// 绘制区域:分局
sheet.addCell(new Label(0, hyAllXlCount,
map.get("CONTENT")==null?"":""+map.get("CONTENT"), wcf_left));
// 绘制行业大类:行业
sheet.addCell(new Label(1, hyAllXlCount,
map2.get("CONTENT")==null?"":""+map2.get("CONTENT"), wcf_left));
for(int s=2;s<name.length;s++){
// 绘制行业小类:特大型
sheet.addCell(new Label(s, hyAllXlCount, map3.get(name[s])==null?"":""+map3.get(name[s]),wcf_left));
}
}
sheet.mergeCells(1, 1+hyHyxlCount, 1, hyHyxlCount+hyXlDataList.size());
hyHyxlCount+=hyXlDataList.size();
}
}
}
}
}
// 合并单元格,
// 第一个参数:要合并的单元格最左上角的列号,
// 第二个参数:要合并的单元格最左上角的行号,
// 第三个参数:要合并的单元格最右角的列号,
// 第四个参数:要合并的单元格最右下角的行号,
sheet.mergeCells(0, 1+hyLastXlCount, 0, hyAllXlCount);
hyLastXlCount=hyAllXlCount;
}
/** **********将以上缓存中的内容写到EXCEL文件中******** */
workbook.write();
/** *********关闭文件************* */
workbook.close();
} catch (Exception e) {
result = "系统提示:Excel文件导出失败,原因:" + e.toString();
System.out.println(result);
e.printStackTrace();
}
return result;
}
注:数据格式
map{
CONTENT=江干分局,
xlList=[
{ CONTENT=餐饮行业,
xlList=[
{CONTENT=特大型(>3000M2)},
]
}
]
}