每次用到excel导出基本上都要重新写,这次是写了一个公共的,以后有想用的时侯直接复制就好,大部份都可以兼容,有问题后期再优化。
准备jar包
poi包:http://poi.apache.org/download.html
核心代码
import com.wd.common.anno.Merge;
import com.wd.common.utils.DateUtil;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* <p>导出excel类</p>
* @ClassName: ExportExcelUtils
* @author: sunhr
* @date: 2016年8月9日 下午7:18:33
* @version: V2.0
*/
public class ExportExcelUtils<T>
{
/**
*
* <p>根据对象导出excel表格内容--泛型对象里面的属性顺序就已经确认了excel列的顺序,支持根据多个条件合并多列</p>
* @author sunhr
* @date 2016年9月30日 下午5:20:13
* @param workbook 是否想要多个sheet页
* @param sheetName sheet页名称
* @param heading 第一行标题
* @param titles 列头
* @param dataset 表格数据
* @param mergeCells 要合并的列 -->int[] mergeCells={0,1,2,3,4,9,10,11,12};,根据rowMergeFlag属性值是否相等判别要合并多少行(只要每一行的此属性值相等,便合并)
* @param total 合计数据
* @param cols 自定义列宽
* @return
* Workbook
*/
public Workbook ExportExcelMoreMergeCells(Workbook workbook,
String sheetName,
String heading,
String[] titles,
Collection<T> dataset,
Map<String,int[]> mergeCellsMap,
Map<String, Object> total,
Map<Integer, Integer> cols){
Workbook[] wbs = new Workbook[]{new HSSFWorkbook(), new XSSFWorkbook()};
//设置表格版本
Workbook wb = null;
if(workbook == null){
wb = wbs[0];
}else{
wb = workbook;
}
// 创建标题样式
CellStyle titleStyle = wb.createCellStyle();
titleStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
titleStyle.setBorderTop(CellStyle.BORDER_THIN);
titleStyle.setBorderLeft(CellStyle.BORDER_THIN);
titleStyle.setBorderRight(CellStyle.BORDER_THIN);
titleStyle.setBorderBottom(CellStyle.BORDER_THIN);
titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
Font titleFont = wb.createFont();
titleFont.setColor(HSSFFont.COLOR_NORMAL);
titleFont.setFontHeightInPoints((short)11);
titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
titleStyle.setFont(titleFont);
// 创建内容样式
CellStyle dataStyle = wb.createCellStyle();
dataStyle.setBorderTop(CellStyle.BORDER_THIN);
dataStyle.setBorderLeft(CellStyle.BORDER_THIN);
dataStyle.setBorderRight(CellStyle.BORDER_THIN);
dataStyle.setBorderBottom(CellStyle.BORDER_THIN);
dataStyle.setAlignment(CellStyle.ALIGN_CENTER);
dataStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
Font dataFont = wb.createFont();
dataFont.setFontHeightInPoints((short)11);
dataStyle.setFont(dataFont);
// 创建工作薄
Sheet sheet = wb.createSheet(sheetName);
sheet.setDefaultColumnWidth((short)17);// 默认列宽
sheet.createFreezePane(0, 2, 0, 2);
//设置列宽
if(cols != null){
for(Map.Entry<Integer, Integer> entry : cols.entrySet()){
sheet.setColumnWidth(entry.getKey(), entry.getValue());
}
}
Row row = null;
Cell cell = null;
// 1. 创建标题(第一行)
row = sheet.createRow(0);
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (short)(titles.length - 1)));// 合并标题列
row.setHeightInPoints(20);
cell = row.createCell(0);
cell.setCellValue(heading);
cell.setCellStyle(titleStyle);
// 2. 创建列头(第二行)
row = sheet.createRow(1);
row.setHeightInPoints(20);
for(short i = 0; i < titles.length; i++){
cell = row.createCell(i);
cell.setCellSt