利用poi匯出Excel,poi匯出excel
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
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.streaming.SXSSFWorkbook;
//需要的jar包:poi-3.15.jar、poi-ooxml-3.15.jar
/**
* 2002、2003的一個活頁簿中最多含有256個工作表,預設情況下是三個工作表,工作表由65536行*256列組成,每行列交叉為一個單位格。
* 2007的無論是工作表個數、工作表列數、行數,都大大突破了這個資料,excel預設的工作薄副檔名為".xlsx",
* 這種格式的檔案中每個工作頁包含1048576行(Row)*16384列(Column)。EXCEL的協助檔案上說的,理論上sheet是無限個,但受可用記憶體的限制,
* 你可以試著插入一個新工作表,然後按著F4,就會看見工作表不停的增加,我1G記憶體,工作表增加到10000個,還能正常進行基本操作 。
*/
/**
*
* Excel匯出方法
*@param title Excel標題
*@param headersParams 以字串"header = param"方式儲存元素的List<Striing>;header代表的是表頭,param代表的是表頭對應的屬性
*@param dataList 需要匯出Excel資料
*@param sheetMaxCount 每一個sheet的最大儲存行數(數量)
*@return Workbook
*@since (此方法開始於哪個版本)0.0.3
*@author yangke
*
*/
public class NextExcelUtil {
/**
* 分sheet匯出Excel的情況
* @param title Excel表的標題,如果不存在,則傳null
* @param headersParams 表頭與屬性值的對應關係數組
* @param dataList 匯出Excel資料
* @param sheetMaxCount 單個sheet儲存資料量最大值
* */
@SuppressWarnings({ "unchecked", "rawtypes", "unused" })
public static <T> Workbook getWorkbook(String title, List<String> headersParams, List<T> dataList, int sheetMaxCount) {
//擷取匯出總資料量
int count = dataList.size();
//擷取要分多少個sheet
int page = count%sheetMaxCount > 0 ? count/sheetMaxCount + 1 : count/sheetMaxCount;
//拆分大的List為多個小的List
List<List> splitList = getSplitList(dataList, sheetMaxCount);
//建表
Workbook wb = new HSSFWorkbook();
for(int i = 0;i < page;i++){
int m = 0;
//建立sheet
Sheet sheet = wb.createSheet();
if(title != null){
wb.setSheetName(i, title+i);
//設定標題
for(int j = 0;j < 2;j++){
Row titleRow = sheet.createRow(i);
for(int k = 0;k < headersParams.size();k++){
Cell titleCell = titleRow.createCell(k);
CellStyle titleStyle = getStyle(wb);
titleCell.setCellStyle(titleStyle);
//標題內容只設定一次就行,且值只能設定在標題所佔的位置的首行首列,否則合併儲存格時值會被覆蓋
if(j == 0 && k == 0){
titleCell.setCellValue(title);
titleCell.setCellStyle(titleStyle);
}
}
}
//合并標題儲存格
sheet.addMergedRegion(new CellRangeAddress(0, 1,0,headersParams.size()-1));
m = 2;
}
//擷取表頭及其對應的屬性
String[] headers = new String[headersParams.size()];
String[] params = new String[headersParams.size()];
for(int j = 0;j < headersParams.size();j++){
String[] hsPs = headersParams.get(j).toString().split("=");
headers[j] = hsPs[0];
params[j] = hsPs[1];
}
//設定表頭
Row headRow = sheet.createRow(m);
for(int j = 0;j < headers.length;j++){
Cell headerCell = headRow.createCell(j);
headerCell.setCellValue(headers[j]);
}
//擷取單個sheet需要填充的資料
List<T> smallList = splitList.get(i);
//給單個sheet填充資料
//擷取反射模版
Class clazz = null;
for(int j = 0;j < smallList.size();j++){
clazz = smallList.get(0).getClass();
Row paramRow = sheet.createRow(j + 1 + m);
for(int k = 0;k < params.length;k++){
try {
Field field = clazz.getDeclaredField(params[k]);
Method method = clazz.getMethod(getMethodName(params[k]));
Object obj = method.invoke(smallList.get(j));
Cell paramCell = paramRow.createCell(k);
//判斷是否為時間格式
if(obj.getClass() == Date.class){
if(obj != null){
CreationHelper creationHelper = wb.getCreationHelper();
CellStyle dateStyle = wb.createCellStyle();
dateStyle.setDataFormat(
creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
paramCell.setCellStyle(dateStyle);
paramCell.setCellValue((Date)obj);
}else{
paramCell.setCellValue("");
}
}else{
if(obj != null){
paramCell.setCellValue(obj.toString());
}else{
paramCell.setCellValue("");
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
return wb;
}
/**
* 匯出單個sheet的Excel
* @param title Excel表的標題,如果不存在,則傳null
* @param headersParams 表頭與屬性值的對應關係數組
* @param dataList 匯出Excel資料
* */
@SuppressWarnings({ "rawtypes", "unused", "unchecked" })
public static <T> Workbook getWorkbook(String title,List<String> headersParams,List<T> dataList) {
//建表
Workbook wb = new HSSFWorkbook();
//建立活頁簿
Sheet sheet = wb.createSheet();
//設定起始行,預設為0
int m = 0;
//判斷是否存在標題
if(title != null){
wb.setSheetName(0, title);
//設定標題
for(int i = 0;i < 2;i++){
Row titleRow = sheet.createRow(i);
for(int j = 0;j < headersParams.size();j++){
Cell titleCell = titleRow.createCell(j);
CellStyle titleStyle = getStyle(wb);
titleCell.setCellStyle(titleStyle);
//標題內容只設定一次就行,且值只能設定在標題所佔的位置的首行首列,否則合併儲存格時值會被覆蓋
if(j == 0 && i == 0){
titleCell.setCellValue(title);
titleCell.setCellStyle(titleStyle);
}
}
}
//合并標題儲存格
sheet.addMergedRegion(new CellRangeAddress(0, 1,0,headersParams.size()-1));
m = 2;
}
String[] headers = new String[headersParams.size()];
String[] params = new String[headersParams.size()];
for(int i = 0;i < headersParams.size();i++){
String[] headerParam = headersParams.get(i).split("=");
headers[i] = headerParam[0];
params[i] = headerParam[1];
}
//設定表頭
Row headRow = sheet.createRow(m);
for(int i = 0;i < headers.length;i++){
Cell headerCell = headRow.createCell(i);
headerCell.setCellValue(headers[i]);
}
//填入資料
//擷取反射模版
Class clazz = null;
if(dataList != null && dataList.size() > 0){
clazz = dataList.get(0).getClass();
for(int i = 0;i < dataList.size();i++){
Row paramRow = sheet.createRow(i + 1 + m);
for(int j = 0;j < params.length;j++){
try {
Cell paramCell = paramRow.createCell(j);
Field field = clazz.getDeclaredField(params[j]);
Method method = clazz.getMethod(getMethodName(params[j]));
Object obj = method.invoke(dataList.get(i));
//判斷是否為時間格式
if(obj.getClass() == Date.class){
if(obj != null){
CreationHelper creationHelper = wb.getCreationHelper();
CellStyle dateStyle = wb.createCellStyle();
dateStyle.setDataFormat(
creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
paramCell.setCellStyle(dateStyle);
paramCell.setCellValue((Date)obj);
}else{
paramCell.setCellValue("");
}
}else{
if(obj != null){
paramCell.setCellValue(obj.toString());
}else{
paramCell.setCellValue("");
}
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
return wb;
}
/**
*
* 設定標題邊框
*@param workbook Excel對象
*@param titleRow 標題列
*@param headersParams 列名屬性名稱,對應關係的List
*@return CellStyle 標題樣式
*@since (此方法開始於哪個版本)0.0.3
*@author yk
*
*/
@SuppressWarnings("deprecation")
public static CellStyle getStyle(Workbook wb) {
//建立顯示樣式
CellStyle style = wb.createCellStyle();
//建立字型樣式
Font font = wb.createFont();
font.setFontHeight((short) 280);
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
style.setAlignment(HorizontalAlignment.CENTER);
//設定邊框
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setBorderTop(CellStyle.BORDER_THIN);
style.setFont(font);
return style;
}
/*
* 標題樣式
*/
@SuppressWarnings("deprecation")
public static <T> CellStyle getTitleStyle(Workbook workbook) {
// 設定字型
Font font = workbook.createFont();
//設定字型大小
font.setFontHeightInPoints((short)11);
//字型加粗
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
//設定字型名字
font.setFontName("Courier New");
//設定樣式;
CellStyle style = workbook.createCellStyle();
style.setFont(font);
//設定自動換行;
style.setWrapText(false);
//設定水平對齊的樣式為置中對齊;
style.setAlignment(CellStyle.ALIGN_CENTER);
//設定垂直對齊的樣式為置中對齊;
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
return style;
}
/*
* 列頭儲存格樣式
*/
@SuppressWarnings("deprecation")
public CellStyle getColumnTopStyle(Workbook workbook) {
// 設定字型
Font font = workbook.createFont();
//設定字型大小
font.setFontHeightInPoints((short)11);
//字型加粗
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
//設定字型名字
font.setFontName("Courier New");
//設定樣式;
CellStyle style = workbook.createCellStyle();
//設定底邊框;
style.setBorderBottom(CellStyle.BORDER_THIN);
//設定左邊框;
style.setBorderLeft(CellStyle.BORDER_THIN);
//設定右邊框;
style.setBorderRight(CellStyle.BORDER_THIN);
//設定頂邊框;
style.setBorderTop(CellStyle.BORDER_THIN);
//在樣式用應用設定的字型;
style.setFont(font);
//設定自動換行;
style.setWrapText(false);
//設定水平對齊的樣式為置中對齊;
style.setAlignment(CellStyle.ALIGN_CENTER);
//設定垂直對齊的樣式為置中對齊;
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
return style;
}
/*
* 列資料資訊儲存格樣式
*/
@SuppressWarnings("deprecation")
public CellStyle getCellStyle(Workbook workbook) {
// 設定字型
Font font = workbook.createFont();
//設定字型大小
//font.setFontHeightInPoints((short)10);
//字型加粗
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//設定字型名字
font.setFontName("Courier New");
//設定樣式;
CellStyle style = workbook.createCellStyle();
//設定底邊框;
style.setBorderBottom(CellStyle.BORDER_THIN);
//設定左邊框;
style.setBorderLeft(CellStyle.BORDER_THIN);
//設定右邊框;
style.setBorderRight(CellStyle.BORDER_THIN);
//設定頂邊框;
style.setBorderTop(CellStyle.BORDER_THIN);
//在樣式用應用設定的字型;
style.setFont(font);
//設定自動換行;
style.setWrapText(false);
//設定水平對齊的樣式為置中對齊;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//設定垂直對齊的樣式為置中對齊;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
/*
* 擷取方法名
* @param 屬性名稱
* */
private static String getMethodName(String fieldName){
return "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
}
}