废话不说,直接上代码
package com.sgcc.ahepc.util;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
public class ExcelExportUtil {
/**
* 支持多sheet生成
* @param list 展示列表
* @param titles 头信息
* @param columns 列字段
* @param sheetNames sheet名称
* @return
*/
public static HSSFWorkbook getBook(List<List<Map<String, Object>>> list,
String[] titles, String[] columns, List<String> sheetNames,int start) {
// 创建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//字体
HSSFFont font = workbook.createFont();
font.setFontName("仿宋");
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
font.setFontHeightInPoints((short) 12);
HSSFFont cellFont = workbook.createFont();
cellFont.setFontName("仿宋");
cellFont.setFontHeightInPoints((short) 12);
HSSFCellStyle titleStyle = workbook.createCellStyle();
HSSFCellStyle cellStyle = workbook.createCellStyle();
//设置颜色
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
titleStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//前景颜色
titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//填充方式,前色填充
//边框填充
titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
titleStyle.setFont(font);
titleStyle.setWrapText(false);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setFont(cellFont);
cellStyle.setWrapText(false);
// 根据sheet多少决定创建多少sheet
for (int n = 0; n < sheetNames.size(); n++) {
HSSFSheet sheet = null;
if (sheetNames != null && sheetNames.size()>0) {
sheet = workbook.createSheet(sheetNames.get(n));
} else {
sheet = workbook.createSheet();
}
// 在索引0的位置创建行(最顶端的行)
HSSFRow titleRow = sheet.createRow(start);
titleRow.setHeightInPoints(18);
//titleRow.setRowStyle(style);
// 在索引0的位置创建单元格(左上端)
for(int i=0;i<titles.length;i++){
HSSFCell titleCell = titleRow.createCell(i);
titleCell.setCellStyle(titleStyle);
titleCell.setCellValue(titles[i]);
}
//填充数据,有多少记录就需要创建多少行记录
List<Map<String,Object>> dataList = list.get(n);
for(int l=0;l<dataList.size();l++){
Map<String,Object> map = dataList.get(l);
HSSFRow dRow = sheet.createRow(start+l+1);
//根据标题的多少决定创建多少列,并根据列的名称找到对应的数据
for(int k=0;k<columns.length;k++){
HSSFCell dCell = dRow.createCell(k);
dCell.setCellStyle(cellStyle);
String val = String.
valueOf(map.get(columns[k].toUpperCase()));
if(val == null || val.equals("null")){
val = "";
}
dCell.setCellValue(val);
}
}
for(int m=0;m<titles.length;m++){
sheet.autoSizeColumn(m);
//sheet.autoSizeColumn(m, true);
//sheet.setColumnWidth(m, titles[m].getBytes().length*2*256);
}
}
return workbook;
}
}
说有一点,这个类支持多sheet输出,采用键值对的关系运作。titiles是中文的标题,colums是键值,也就是list中map的key,所以在实用时要传入list,并且list中存放map。这个结果集实际上在使用 mybatis时实际上是很方便的。这里我用的就是mybatis,虽然有一定的局限性,但是是一种思路。利用java的反射实际上也很容易将实体类转换为这样的数据。