/**
*导出Excel表格
*
*@paramallList要导出的数据
*@paramheadArrjson键值对
*@paramtitleArrexcel标题
*@paramtitleExcel名字
*@parammergeColumn要合并的列
*/
publicvoidexportExcel(JSONArrayallList,String[]headArr,Stringtitle,String[]titleArr,int[]mergeColumn,HttpServletResponseresponse){
try{
//通过Response把数据以Excel格式保存
response.reset();
response.setContentType("application/msexcel;charset=UTF-8");
response.addHeader("Content-Disposition","attachment;filename=\""
+newString((title+".xls").getBytes("GBK"),
"ISO8859_1")+"\"");
OutputStreamout=response.getOutputStream();
WritableWorkbookworkbook=Workbook.createWorkbook(out);
WritableSheetsheet=workbook.createSheet(title,0);
WritableFontwf=newWritableFont(WritableFont.ARIAL,10,WritableFont.BOLD,false,
UnderlineStyle.NO_UNDERLINE,Colour.BLACK);
WritableCellFormatwcf=newWritableCellFormat(wf);
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setAlignment(Alignment.CENTRE);
//CellViewcellView=newCellView();
for(inti=0;i
Labellabel=newLabel(i,0,titleArr[i],wcf);
sheet.addCell(label);
//CellViewcellView=newCellView();
//cellView.setAutosize(true);//设置自动大小
//sheet.setColumnView(i,cellView);//根据内容自动设置列宽
}
longs1=System.nanoTime();
//格式化数据,垂直居中,和水平居中
WritableCellFormatcellFormat=newWritableCellFormat();
cellFormat.setAlignment(Alignment.CENTRE);
cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
for(inti=0;i
for(intj=0;j
Labellabel=newLabel(j,i+1,JSONObject.fromObject(allList.get(i)).get(headArr[j])==null?"":JSONObject.fromObject(allList.get(i)).get(headArr[j]).toString());
label.setCellFormat(cellFormat);
sheet.addCell(label);
//CellViewcellView=newCellView();
//cellView.setAutosize(true);//设置自动大小
//sheet.setColumnView(i,cellView);//根据内容自动设置列宽
}
}
//前一行数据
String[]pre_RowData=newString[headArr.length];
//记住第一行数据
for(inti=0;i
pre_RowData[i]=sheet.getCell(i,1).getContents().toString();
}
//循环要合并得列
for(inti=0;i
intcount=0;
//获取所有的行数,因为第一行是表头,所以从第二行开始,即j=1开始
for(intj=1;j
//从第二行开始,合并的时候,判断前一行是否相等,若相等,则这一列数据相等,才合并,若不相等,这一列数据相等也不合并
if(i>0&&j>1){
//判断这个单元格前一个单元格的值与这个单元格前一个单元格的上一个单元格的值是否相等
if(sheet.getCell(mergeColumn[i-1],j).getContents().equals(pre_RowData[i-1])){
//判断这个单元格的值与这个单元格的上一个单元格的值是否相等
if(sheet.getCell(mergeColumn[i],j).getContents().equals(pre_RowData[i])){
count++;
}else{
pre_RowData[i]=sheet.getCell(mergeColumn[i],j).getContents();
j--;
//合并单元格
sheet.mergeCells(mergeColumn[i],j-count+1,mergeColumn[i],j);
count=0;
}
}
//前两行单元格的值不相等时,则应合并以上本单元格中相等的单元格
else{
pre_RowData[i]=sheet.getCell(mergeColumn[i],j).getContents();
pre_RowData[i-1]=sheet.getCell(mergeColumn[i-1],j).getContents();
j--;
//合并单元格
sheet.mergeCells(mergeColumn[i],j-count+1,mergeColumn[i],j);
count=0;
}
//第一列到最后时,需要对以上相同的进行合并
if(j+1==sheet.getRows()){
sheet.mergeCells(mergeColumn[i],j-count+1,mergeColumn[i],j);
count=0;
//第一列比较结束,重新给pre_RowData赋值,以便对下一列进行比较时
pre_RowData[i]=sheet.getCell(i,1).getContents();
}
}else{
//判断这个单元格的值与这个单元格的上一个单元格的值是否相等
if(sheet.getCell(mergeColumn[i],j).getContents().equals(pre_RowData[i])){
count++;
}else{
pre_RowData[i]=sheet.getCell(mergeColumn[i],j).getContents();
j--;
//合并单元格
sheet.mergeCells(mergeColumn[i],j-count+1,mergeColumn[i],j);
count=0;
}
//第一列到最后时,需要对以上相同的进行合并
if(j+1==sheet.getRows()){
sheet.mergeCells(mergeColumn[i],j-count+1,mergeColumn[i],j);
count=0;
//重新给pre_RowData赋值,以便第二次比较时,比较前一单元格
pre_RowData[i]=sheet.getCell(i,1).getContents();
}
}
}
}
workbook.write();
workbook.close();
longs2=System.nanoTime();
System.out.println("jxlwrite......."+"rowstoexcel:"+(s2-s1));
}catch(RowsExceededExceptione){
e.printStackTrace();
}catch(WriteExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}