接上一篇博客,繼續介紹雙標題導出.
/**
* 雙標題excel導出
* @param response
* @param fileName 文件名
* @param sheetName sheet頁名
* @param firstTitle 第一行表頭標題
* @param title 第二行標題
* @param content 每一列對應值
* @param list 單元格下拉選項(可根據具體需求去留)
*/
public static void exportForTwoTitle(HttpServletResponse response, String fileName, String sheetName, String firstTitle, String[] title, String[][] content, List<T> list) {
XSSFWorkbook wb = new XSSFWorkbook();
OutputStream os = null;
try {
wb = exportXlsForTwoTitle(sheetName, firstTitle,title, content, wb,list);
ExcelUtil.setResponse(response, fileName);
os = response.getOutputStream();
wb.write(os);
os.flush();
} catch (Exception e) {
logger.error("io error");
} finally {
try {
wb.close();
if (os != null) {
os.close();
}
} catch (Exception e) {
logger.error("close io error");
}
}
}
/**
* 導出Excel(雙標題)
*
* @param sheetName sheet名稱
* @param title 標題
* @param values 內容
* @param wb HSSFWorkbook對象
* @return
*/
public static XSSFWorkbook exportXlsForTwoTitle(String sheetName, String firstTitle, String[] title, String[][] values, XSSFWorkbook wb,List<T> list) {
// 第一步,創建一個HSSFWorkbook,對應一個Excel文件
if (wb == null) {
wb = new XSSFWorkbook();
}
// 第二步,在workbook中添加一個sheet,對應Excel文件中的sheet
XSSFSheet sheet = wb.createSheet(sheetName);
//設置默認列寬
sheet.setDefaultColumnWidth(20);
// 第四步,創建單元格,並設置值表頭 設置表頭居中
XSSFCellStyle style = wb.createCellStyle();
// 創建一個居中格式
style.setAlignment(HorizontalAlignment.CENTER);
//設置文本格式
XSSFDataFormat format = wb.createDataFormat();
style.setDataFormat(format.getFormat("@"));
// 第三步,在sheet中添加表頭第0行,注意老版本poi對Excel的行數列數有限制
XSSFRow row0 = sheet.createRow(0);
row0.setHeightInPoints(175);
//sheet.autoSizeColumn(1, true);
XSSFCellStyle style0 = wb.createCellStyle();
// 創建一個居中格式
style0.setAlignment(HorizontalAlignment.LEFT);
// 自動換行
style0.setWrapText(true);
// 生成一個字體
XSSFFont font = wb.createFont();
font.setFontHeightInPoints((short) 11);
font.setColor(HSSFColor.ROYAL_BLUE.index);
font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
font.setFontName("仿宋_GB2312");
// 把字體 應用到當前樣式
style0.setFont(font);
XSSFCell cell0 = row0.createCell(0);
// 單元格合併
CellRangeAddress region = new CellRangeAddress(0,0, 0,9 );
sheet.addMergedRegion(region);
cell0.setCellValue(firstTitle);
cell0.setCellStyle(style0);
XSSFRow row = sheet.createRow(1);
XSSFCell cell;
//創建標題
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
//設置某一列字段的下拉框值選項
String[] typeList = Type.getAllEnum().toArray(new String[]{});
XSSFDataValidation dataValidationType = setColumnList(sheet,typeList,1);
if (dataValidationType != null) {
sheet.addValidationData(dataValidationType);
}
//********************************************************
//創建內容
if(values != null && values.length >0){
//創建內容
for (int i = 0; i < values.length; i++) {
row = sheet.createRow(i + 2);
for (int j = 0; j < values[i].length; j++) {
//將內容按順序賦給對應的列對象
cell = row.createCell(j);
cell.setCellStyle(style);
cell.setCellValue(values[i][j]);
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
}
}
}
return wb;
}
/**
* 設置指定字段下拉選項
* @param sheet 當前sheet
* @param textList 下拉選項
* @param colNum 第幾列
* @return
*/
public static XSSFDataValidation setColumnList(XSSFSheet sheet, String[] textList, int colNum) {
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper
.createExplicitListConstraint(textList);
CellRangeAddressList addres = new CellRangeAddressList(1,65536,colNum,colNum);
XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(
dvConstraint, addres);
validation.setSuppressDropDownArrow(true);
return validation;
}