首先,介绍一下apach-poi:
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft
Office格式档案读和写的功能。
在这里我需要导入poi所需jar包:
poi-3.10.1-20140818.jar
poi-excelant-3.10.1-20140818.jar
poi-ooxml-3.10.1-20140818.jar
poi-ooxml-schemas-3.10.1-20140818.jar
Export.java范例:
/**
* 数据导出
* @param title
* 表格标题名
* @param headers
* 表格属性列名数组
* @param dataset
* 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
* javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
* @param pattern
* 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
*/
public static void exportExcel(HSSFWorkbook workbook, String fileName, int status, String[] headers,
List<String> rheaders, List<Map<String, Object>> dataset, String pattern) {
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(fileName+System.currentTimeMillis());
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(15);
// 生成一个样式
HSSFCellStyle styleTitle = workbook.createCellStyle();
// 设置这些样式
styleTitle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
styleTitle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
styleTitle.setBorderRight(HSSFCellStyle.BORDER_THIN);
styleTitle.setBorderTop(HSSFCellStyle.BORDER_THIN);
styleTitle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
styleTitle.setFont(font);
// 生成一个样式
//产生表格标题行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < rheaders.size(); i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(styleTitle);
HSSFRichTextString text = new HSSFRichTextString(rheaders.get(i));
cell.setCellValue(text);
}
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//遍历集合数据,产生数据行
Iterator<Map<String, Object>> it = dataset.iterator();
int index = 0;
TreeMap<String, String> tt = InvokeConstant.getInvokeTitle(status);
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
Map<String, Object> t = it.next();
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
try {
Object value = t.get(tt.get(headers[i]));
if(value == null){
value = "--";
}
HSSFRichTextString richString = new HSSFRichTextString();
HSSFFont font3 = workbook.createFont();
richString.applyFont(font3);
cell.setCellValue(value.toString());
} catch (SecurityException e) {
e.printStackTrace();
}catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
}
HSSFWorkbook以传参的形式,为了创建多个sheet,在实际情况下,可能单个请求要求导出多个结果集,不能返回多个输出流,这个时候我想的办法就是,excel多sheet的形式导出多个结果集,在遍历结果集之前创建HSSFWorkbook对象,上面实例就是每次创建一个sheet。我们将数据塞完之后,就可以使用workBook.write(out),浏览器直接接收输出流,这个时候我们就完成了excel导出。