Written In The Font
謝謝,陳明.哈哈!共勉,努力搞定它.
路漫漫其修遠兮,吾將上下而求索
Content
| ExportExcelAndSave( ??? String[] header, ??? List<Object> excelList, ??? String sheetTitle, ??? String filePath, ??? String fileName) ? | @param header 表格屬性列名數組 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param filePath Excel文件保存位置 @param fileName Excel文件名 ? |
| ExportExcelAndSave( ??? String[] header, ??? String[] properties, ??? List<Object> excelList, ??? String sheetTitle, ??? String filePath, ??? String fileName) ? | @param header 表格屬性列名數組 @param properties 表頭對應javaBean中的屬性 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param filePath Excel文件保存位置 @param fileName Excel文件名 ? |
| ExportExcelAndZip( ??? String[] header, ??? List<Object> excelList, ??? String sheetTitle, ??? String filePath, ??? String excelName, ??? String zipName) ? | @param header 表格屬性列名數組 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param filePath zip文件保存位置 @param excelName? Excel名稱 @param zipName zip名稱 ? |
| ExportExcelAndZip( ??? String[] header, ??? String[] properties, ??? List<Object> excelList, ??? String sheetTitle, ??? String filePath, ??? String excelName, ??? String zipName) ? | @param header 表格屬性列名數組 @param properties 表頭對應javaBean的屬性 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param filePath zip文件保存位置 @param excelName? Excel名稱 @param zipName zip名稱 ? |
| 大數據存儲 | ? |
| ExportExcelForBigDataAndSave( ??? String[] header, ??? List<Object> excelList, ??? String sheetTitle, ??? String flag, ??? String filePath, ??? String fileName) ? | @param header 表格屬性列名數組 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet @param filePath 文件保存路徑 @param fileName 保存文件名 ? |
| ExportExcelForBigDataAndSave( ??? String[] header, ??? String[] properties, ??? List<Object> excelList, ??? String sheetTitle, ??? String flag, ??? String filePath, ??? String fileName) ? | @param header 表格屬性列名數組 @param properties 表頭對應javaBean屬性 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet @param filePath 文件保存路徑 @param fileName 保存文件名 ? |
| ExportExcelForBigDataAndZipAndSave( ??? String[] header, ??? List<Object> excelList, ??? String sheetTitle, ??? String flag, ??? String filePath, ??? String excelName, ??? String zipName) ? | @param header 表格屬性列名數組 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet @param filePath 文件保存路徑 @param excelName Excel文件名 @param zipName zip文件名 ? |
| ExportExcelForBigDataAndZipAndSave( ??? String[] header, ??? String[] properties, ??? List<Object> excelList, ??? String sheetTitle, ??? String flag, ??? String filePath, ??? String excelName, ??? String zipName) ? | @param header 表格屬性列名數組 @param properties 表頭對應javaBean屬性 @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據) @param sheetTitle 表格標題名 @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet @param filePath 文件保存路徑 @param excelName? Excel文件名 @param zipName ZIP文件名 ? |
package com.javaUtil.utils.excel;import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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;/*** @Description: Excel 生成通用類,為了兼容,所有 Excel 統一生成 Excel2003 即:xx.xls* @Project:javaUtils* @Author : chenssy* @email:chenssy995812509@163.com* @Web:cmsblogs.com* @Date : 2014年6月15日 下午9:09:38* @version 1.0*/
public class ExcelExportHelper {/** 時間格式:默認為yyyy-MM-dd */private String DATE_PATTERN = "yyyy-MM-dd"
;/** 圖片寬度,默認為:100 */private int IMAGE_WIDTH = 30
;/** 圖片高度,默認為:50 */private int IMAGE_HEIGHT = 5
;/** 單元格的最大寬度 */private int[] maxWidth;/** * 單頁支持最多數據列:超過65534會出錯* 若數據列多余65534則需要通過MORE_EXCEL_FLAG、MORE_SHEET_FLAG來區別生成多個Excel、還是sheet*/private int maxRowCount = 2500
;/** 大量數據,多個Excel標識---0001 */private String MORE_EXCEL_FLAG = "0001"
;/** 大量數據,多個sheet標識---0001 */private String MORE_SHEET_FLAG = "0002"
;/*** 默認構造函數 */public ExcelExportHelper(){}/*** @param datePattern 指定的時間格式*/public ExcelExportHelper(String datePattern){this.DATE_PATTERN =
datePattern;}/*** @param imageWidth 指定圖片的寬度* @param imageHeight 指定圖片的高度*/public ExcelExportHelper(
int imageWidth,
int imageHeight){this.IMAGE_HEIGHT =
imageHeight;this.IMAGE_WIDTH =
imageWidth;}/*** @param datePatter 指定時間格式* @param imageWidth 指定圖片的寬度* @param imageHeight 指定圖片的高度*/public ExcelExportHelper(String datePatter,
int imageWidht,
int imageHeight){this.DATE_PATTERN =
datePatter;this.IMAGE_HEIGHT =
imageHeight;this.IMAGE_WIDTH =
imageWidht;}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,如有圖片請轉換為byte[]<br>* header、excelList規則如下:<br>* header、excelList中的Bean必須對應(javaBean的屬性順序):如下<br>* header:姓名、年齡、性別、班級<br>* Bean:name、age、sex、class<br>* * @author chenssy * @date 2014年6月15日 下午9:18:37* * @param header 表格屬性列名數組* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @return 生成的HSSFWorkBook* @version 1.0*/public HSSFWorkbook exportExcel(String[] header,List<Object>
excelList,String sheetTitle){//生成一個ExcelHSSFWorkbook book =
new HSSFWorkbook(); //生成一個表格sheetTitle = getSheetTitle(sheetTitle);
//判斷、設置sheetTitleHSSFSheet sheet =
book.createSheet(sheetTitle);//設置Excel里面數據
setExcelContentData(book,sheet,header,excelList);System.out.println("——————————————————ExcelExportHelper:Excel生成成功..."
);return book;}/*** * 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,如有圖片請轉換為byte[]<br>* header、properties需要一一對應:<Br>* header = ["學號","年齡","性別","班級"]* properties = ["id","age","sex","class"],其對應的excelList中javaBean的屬性值* * @author chenssy * @date 2014年6月19日 下午6:02:02* * @param header Excel表頭* @param properties 表頭對應javaBean中的屬性* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* * @return 生成的HSSFWorkbook* @version 1.0*/public HSSFWorkbook exportExcel(String[] header,String[] properties,List<Object>
excelList,String sheetTitle){//生成一個ExcelHSSFWorkbook book =
new HSSFWorkbook();// 生成一個表格sheetTitle = getSheetTitle(sheetTitle);
// 判斷、設置sheetTitleHSSFSheet sheet =
book.createSheet(sheetTitle);// 設置Excel里面數據
setExcelContentData(book, sheet, header, properties ,excelList);System.out.println("——————————————————ExcelExportHelper:Excel生成成功..."
);return book;}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將Excel保存至某個路徑下,* 如有圖片請轉換為byte[]<br>* header、excelList規則如下:<br>* header、excelList中的Bean必須一一對應(javaBean的屬性順序):如下<br>* header:姓名、年齡、性別、班級<br>* Bean:name、age、sex、class<br>* * @author chenssy * @date 2014年6月17日 下午2:24:38* * @param header 表格屬性列名數組* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param filePath Excel文件保存位置 * @param fileName Excel文件名* * @return* @version 1.0*/public void exportExcelAndSave(String[] header,List<Object>
excelList,String sheetTitle,String filePath,String fileName){//生成ExcelHSSFWorkbook book =
exportExcel(header, excelList, sheetTitle);//保存生成的Excel
saveExcel(book,filePath,fileName);}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將Excel保存至某個路徑下,* 如有圖片請轉換為byte[]<br>* header、properties需要一一對應:<Br>* header = ["學號","年齡","性別","班級"]* properties = ["id","age","sex","class"],其對應的excelList中javaBean的屬性值* * @author chenming * @date 2014年6月19日 下午6:24:56* * @param header 表格屬性列名數組* @param properties 表頭對應javaBean中的屬性* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param filePath Excel文件保存位置 * @param fileName Excel文件名* @version 1.0*/public void exportExcelAndSave(String[] header,String[] properties,List<Object>
excelList,String sheetTitle,String filePath,String fileName){//生成ExcelHSSFWorkbook book =
exportExcel(header, properties,excelList, sheetTitle); //保存生成的Excel
saveExcel(book,filePath,fileName);}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將 Excel 打包 zip 格式保存至某個路徑下,* 如有圖片請轉換為byte[]<br>* header、excelList規則如下:<br>* header、excelList中的Bean必須一一對應(javaBean的屬性順序):如下<br>* header:姓名、年齡、性別、班級<br>* Bean:name、age、sex、class<br>* * @author chenssy * @date 2014年6月18日 下午12:36:01* * @param header 表格屬性列名數組* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param filePath zip文件保存位置 * @param excelName Excel名稱* @param zipName zip名稱* * @version 1.0*/public void exportExcelAndZip(String[] header,List<Object>
excelList,String sheetTitle,String filePath,String excelName,String zipName){//生成ExcelHSSFWorkbook book =
exportExcel(header, excelList, sheetTitle);//將生成的Excel打包保存起來List<HSSFWorkbook> books =
new ArrayList<HSSFWorkbook>
();books.add(book);zipExcelAndSave(books, filePath, zipName, excelName);}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將 Excel 打包 zip 格式保存至某個路徑下,* 如有圖片請轉換為byte[]<br>* header、properties需要一一對應:<Br>* header = ["學號","年齡","性別","班級"]* properties = ["id","age","sex","class"],其對應的excelList中javaBean的屬性值* * @author chenssy * @date 2014年6月19日 下午6:33:04* * @param header 表格屬性列名數組* @param properties 表頭對應javaBean的屬性* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param filePath zip文件保存位置 * @param excelName Excel名稱* @param zipName zip名稱* * @version 1.0*/public void exportExcelAndZip(String[] header,String[] properties,List<Object>
excelList,String sheetTitle,String filePath,String excelName,String zipName){//生成ExcelHSSFWorkbook book =
exportExcel(header, properties,excelList, sheetTitle);//將生成的Excel打包保存起來List<HSSFWorkbook> books =
new ArrayList<HSSFWorkbook>
();books.add(book);zipExcelAndSave(books, filePath, zipName, excelName);}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,如有圖片請轉換為byte[]<br>* 用于大數據量時使用,涉及到一個表只能有65536行,當數據量較大時會直接寫入下一個表(excel、sheet)* header、excelList規則如下:<br>* header、excelList中的Bean必須一一對應(javaBean的屬性順序):如下<br>* header:姓名、年齡、性別、班級<br>* Bean:name、age、sex、class<br>* * @author chenssy * @date 2014年6月17日 下午9:53:15* * @param header 表格屬性列名數組* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet* @return List<HSSFWorkbook>* @version 1.0*/public List<HSSFWorkbook> exportExcelForBigData(String[] header,List<Object>
excelList,String sheetTitle,String flag){List<HSSFWorkbook> list =
new ArrayList<>();
//創建表數據結果集//判斷需要生成幾個Excelint num = excelList.size() % maxRowCount == 0 ? excelList.size() / maxRowCount : excelList.size() / maxRowCount + 1
;HSSFWorkbook book =
new HSSFWorkbook();List<Object> newList =
null;
//新數據列表String newTitle =
null;
//新titlefor(
int i = 0 ; i < num ; i++
){//計算新的數據列表int beginRowNum = maxRowCount *
i;int endRowNum = maxRowCount * (i + 1) > excelList.size() ? excelList.size() : maxRowCount * (i + 1
);newList =
excelList.subList(beginRowNum, endRowNum);newTitle = getSheetTitle(sheetTitle) + "_" +
i; if(MORE_EXCEL_FLAG.equals(flag)){
//如果是創建多個Excelbook =
exportExcel(header, newList, newTitle);list.add(book);}else if(MORE_SHEET_FLAG.equals(flag)){
//創建多sheetHSSFSheet sheet =
book.createSheet(newTitle);setExcelContentData(book,sheet,header,newList);}}if(MORE_SHEET_FLAG.equals(flag)){
//創建多sheet
list.add(book);}return list;}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,如有圖片請轉換為byte[]<br>* 用于大數據量時使用,涉及到一個表只能有65536行,當數據量較大時會直接寫入下一個表(excel、sheet)* header、properties需要一一對應:<Br>* header = ["學號","年齡","性別","班級"]* properties = ["id","age","sex","class"],其對應的excelList中javaBean的屬性值* * @author chenssy * @date 2014年6月19日 下午6:41:23* * @param header 表格屬性列名數組* @param properties 表頭對應javaBean的屬性* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet* @return List<HSSFWorkbook>* @version 1.0*/public List<HSSFWorkbook>
exportExcelForBigData(String[] header,String[] properties,List<Object>
excelList,String sheetTitle, String flag){List<HSSFWorkbook> list =
new ArrayList<>();
//創建表數據結果集// 判斷需要生成幾個Excelint num = excelList.size() % maxRowCount == 0 ? excelList.size() / maxRowCount : excelList.size() / maxRowCount + 1
;HSSFWorkbook book =
new HSSFWorkbook();List<Object> newList =
null;
// 新數據列表String newTitle =
null;
// 新titlefor (
int i = 0; i < num; i++
) {// 計算新的數據列表int beginRowNum = maxRowCount *
i;int endRowNum = maxRowCount * (i + 1) > excelList.size() ? excelList.size() : maxRowCount * (i + 1
);newList =
excelList.subList(beginRowNum, endRowNum);newTitle = getSheetTitle(sheetTitle) + "_" +
i;if (MORE_EXCEL_FLAG.equals(flag)) {
// 如果是創建多個Excelbook =
exportExcel(header,properties, newList, newTitle);list.add(book);} else if (MORE_SHEET_FLAG.equals(flag)) {
// 創建多sheetHSSFSheet sheet =
book.createSheet(newTitle);setExcelContentData(book, sheet, header, properties,newList);}}if (MORE_SHEET_FLAG.equals(flag)) {
// 創建多sheet
list.add(book);}return list;}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將Excel保存至某個路徑下,* 如有圖片請轉換為byte[]<br>* 用于大數據量時使用,涉及到一個表只能有65536行,當數據量較大時會直接寫入下一個表(excel、sheet)* header、excelList規則如下:<br>* header、excelList中的Bean必須一一對應(javaBean的屬性順序):如下<br>* header:姓名、年齡、性別、班級<br>* Bean:name、age、sex、class<br>* * @author chenssy * @date 2014年6月17日 下午10:39:15* * @param header 表格屬性列名數組* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet* @param filePath 文件保存路徑* @param fileName 保存文件名* @return * @version 1.0*/public void exportExcelForBigDataAndSave(String[] header,List<Object>
excelList,String sheetTitle,String flag,String filePath,String fileName){//獲取數據結果集List<HSSFWorkbook> books =
exportExcelForBigData(header, excelList, sheetTitle, flag);String _fileName = ""
;for(
int i = 0 ; i < books.size() ; i ++
){HSSFWorkbook book =
books.get(i);_fileName = getFileName(fileName) + "_0" +
i;//保存Excel文件
saveExcel(book, filePath, _fileName);}}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將Excel保存至某個路徑下,* 如有圖片請轉換為byte[]<br>* 用于大數據量時使用,涉及到一個表只能有65536行,當數據量較大時會直接寫入下一個表(excel、sheet)* header、properties需要一一對應:<Br>* header = ["學號","年齡","性別","班級"]* properties = ["id","age","sex","class"],其對應的excelList中javaBean的屬性值* * @author chenssy * @date 2014年6月19日 下午8:22:25* * @param header 表格屬性列名數組* @param properties 表頭對應javaBean屬性* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet* @param filePath 文件保存路徑* @param fileName 保存文件名* @version 1.0*/public void exportExcelForBigDataAndSave(String[] header,String[] properties,List<Object>
excelList,String sheetTitle,String flag,String filePath,String fileName){//獲取數據結果集List<HSSFWorkbook> books =
exportExcelForBigData(header, properties,excelList, sheetTitle, flag);String _fileName = ""
;for(
int i = 0 ; i < books.size() ; i ++
){HSSFWorkbook book =
books.get(i);_fileName = getFileName(fileName) + "_0" +
i;//保存Excel文件
saveExcel(book, filePath, _fileName);}}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將 Excel 打包成 ZIP * 保存至某個路徑下,如有圖片請轉換為byte[]<br>* 用于大數據量時使用,涉及到一個表只能有65536行,當數據量較大時會直接寫入下一個表(excel、sheet)* header、excelList規則如下:<br>* header、excelList中的Bean必須一一對應(javaBean的屬性順序):如下<br>* header:姓名、年齡、性別、班級<br>* Bean:name、age、sex、class<br>* * @author chenssy * @date 2014年6月19日 下午10:39:15* * @param header 表格屬性列名數組* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet* @param filePath 文件保存路徑* @param excelName Excel文件名* @param zipName zip文件名* @return * @version 1.0*/public void exportExcelForBigDataAndZipAndSave(String[] header,List<Object>
excelList,String sheetTitle,String flag,String filePath,String excelName,String zipName){//獲取生成的Excel集合List<HSSFWorkbook> books =
exportExcelForBigData(header, excelList, sheetTitle, flag);//將生成的Excel打包并保存
zipExcelAndSave(books, filePath, zipName, excelName);}/*** 通用方法,使用 java 反射機制,根據提供表頭 header ,數據列 excelList 生成 Excel,并將 Excel 打包成 ZIP * 保存至某個路徑下,如有圖片請轉換為byte[]<br>* 用于大數據量時使用,涉及到一個表只能有65536行,當數據量較大時會直接寫入下一個表(excel、sheet)* header、properties需要一一對應:<Br>* header = ["學號","年齡","性別","班級"]* properties = ["id","age","sex","class"],其對應的excelList中javaBean的屬性值* * @author chenssy * @date 2014年6月19日 下午8:24:21* * @param header 表格屬性列名數組* @param properties 表頭對應javaBean屬性* @param excelList 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。此方法支持的* javabean屬性的數據類型有基本數據類型及String,Date,byte[](圖片數據)* @param sheetTitle 表格標題名* @param flag 分頁標識為。flag == 0001:生成多個Excel,flag == 0002:生成多個sheet* @param filePath 文件保存路徑* @param excelName Excel文件名* @param zipName ZIP文件名* @version 1.0*/public void exportExcelForBigDataAndZipAndSave(String[] header,String[] properties,List<Object>
excelList,String sheetTitle,String flag,String filePath,String excelName,String zipName){//獲取生成的Excel集合List<HSSFWorkbook> books =
exportExcelForBigData(header, properties,excelList, sheetTitle, flag);//將生成的Excel打包并保存
zipExcelAndSave(books, filePath, zipName, excelName);}/*** 填充Excel數據內容* @author chenssy * @date 2014年6月17日 下午10:32:34* @param book Excel* @param sheet sheet* @param header Excel頭部title* @param excelList Excel數據列* @version 1.0*/@SuppressWarnings({ "rawtypes", "unchecked", "deprecation"
})private void setExcelContentData(HSSFWorkbook book,HSSFSheet sheet,String[] header,List<Object>
excelList) {//設置列頭樣式(居中、變粗、藍色)HSSFCellStyle headerStyle =
book.createCellStyle();setHeaderStyle(headerStyle, book);// 設置單元格樣式HSSFCellStyle cellStyle =
book.createCellStyle();setCellStyle(cellStyle, book);// 創建頭部HSSFRow row =
createHeader(sheet, headerStyle, header);// 畫圖的頂級管理器,一個sheet只能獲取一個(一定要注意這點)HSSFPatriarch patriarch =
sheet.createDrawingPatriarch();int index = 0
;/* 避免在迭代過程中產生的新對象太多,這里講循環內部變量全部移出來 */Object t =
null; HSSFCell cell =
null;Field field =
null;String fieldName =
null;String getMethodName =
null;Class tCls =
null;Method getMethod =
null;Object value =
null;// 遍歷集合數據,產生數據行Iterator<Object> it =
excelList.iterator();maxWidth =
new int[header.length];
//初始化單元格寬度while (it.hasNext()) {index++
;row =
sheet.createRow(index);// 設置數據列t =
it.next();// 利用反射,根據javabean屬性的先后順序,動態調用getXxx()方法得到屬性值Field[] fields =
t.getClass().getDeclaredFields();for (
short i = 0; i < fields.length; i++
) {cell =
row.createCell(i);cell.setCellStyle(cellStyle);field =
fields[i];fieldName =
field.getName();getMethodName = "get"+ fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);
//構建getter方法try {tCls =
t.getClass();getMethod = tCls.getMethod(getMethodName,
new Class[] {});value = (Object) getMethod.invoke(t,
new Object[] {});// 將value設置當單元格指定位置
setCellData(row, index, i, value, cell, sheet, patriarch, book);} catch (NoSuchMethodException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());} catch (SecurityException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());} catch (IllegalAccessException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());} catch (IllegalArgumentException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());} catch (InvocationTargetException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());}}}System.out.println("——————————————————填充Excel數據成功.........."
);}/*** 填充Excel內容* @author chenssy * @date 2014年6月19日 下午6:00:35* @param book* @param sheet* @param header* @param properties* @param excelList* @version 1.0*/@SuppressWarnings("rawtypes"
)private void setExcelContentData(HSSFWorkbook book, HSSFSheet sheet, String[] header, String[] properties,List<Object>
excelList) {//設置列頭樣式(居中、變粗、藍色)HSSFCellStyle headerStyle =
book.createCellStyle();setHeaderStyle(headerStyle, book);// 設置單元格樣式HSSFCellStyle cellStyle =
book.createCellStyle();setCellStyle(cellStyle, book);// 創建頭部HSSFRow row =
createHeader(sheet, headerStyle, header);// 畫圖的頂級管理器,一個sheet只能獲取一個(一定要注意這點)HSSFPatriarch patriarch =
sheet.createDrawingPatriarch();/* 為了避免迭代過程中產生過多的新對象,這里將循環內部變量全部移出來 */int index = 0
;Object t =
null;HSSFCell cell =
null;Object o =
null;Class clazz =
null;PropertyDescriptor pd =
null;Method getMethod =
null;// 遍歷集合數據,產生數據行Iterator<Object> it =
excelList.iterator();maxWidth =
new int[header.length];
//初始化單元格寬度while (it.hasNext()) {index++
;row =
sheet.createRow(index);// 設置數據列t =
it.next();for(
int i = 0 ; i < header.length ; i++
){cell =
row.createCell(i);cell.setCellStyle(cellStyle);o =
null;
//每一個單元格都需要將O設置為nulltry {clazz =
t.getClass();pd =
new PropertyDescriptor(properties[i],clazz);getMethod = pd.getReadMethod();
// 獲得get方法if (pd !=
null) { o = getMethod.invoke(t);
//執行get方法返回一個Object
} setCellData(row, index, i, o, cell, sheet, patriarch, book);} catch (IntrospectionException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());} catch (IllegalAccessException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());} catch (IllegalArgumentException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());} catch (InvocationTargetException e) {e.printStackTrace();System.out.println("——————————————————創建Excel數據列表時出錯。method:setDataRow,message:"+
e.getMessage());}}}System.out.println("——————————————————填充Excel數據成功.........."
);}/*** 設置sheet的title,若為空則為yyyyMMddHH24mmss* @author chenssy * @date 2014年6月16日 下午1:46:06* @param sheetTitle* @return* @version 1.0*/private String getSheetTitle(String sheetTitle) {String title =
null;if(sheetTitle !=
null && !""
.equals(sheetTitle)){title =
sheetTitle;}else{Date date =
new Date();SimpleDateFormat sdf =
new SimpleDateFormat("yyyyMMddHH24mmss"
);title =
sdf.format(date);}return title;}/*** 設置Excel圖片的格式:字體居中、變粗、藍色、12號* @author chenssy * @date 2014年6月16日 下午8:46:49* @param headerStyle* @version 1.0*/private void setHeaderStyle(HSSFCellStyle headerStyle,HSSFWorkbook book) {headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//垂直居中 //設置字體HSSFFont font =
book.createFont();font.setFontHeightInPoints((short) 12);
//字號:12號font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//變粗font.setColor(HSSFColor.BLUE.index);
//藍色
headerStyle.setFont(font);}/*** 設置單元格樣式* @author chenssy * @date 2014年6月17日 上午11:00:53* @param cellStyle* @param book* @version 1.0*/private void setCellStyle(HSSFCellStyle cellStyle, HSSFWorkbook book) {cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//垂直居中
HSSFFont font =
book.createFont();font.setFontHeightInPoints((short)12
);cellStyle.setFont(font);}/*** 根據頭部樣式、頭部數據創建Excel頭部* @author chenssy * @date 2014年6月17日 上午11:37:28* @param sheet sheet* @param headerStyle 頭部樣式* @param header 頭部數據* @return 設置完成的頭部Row* @version 1.0*/private HSSFRow createHeader(HSSFSheet sheet,HSSFCellStyle headerStyle,String[] header) {HSSFRow headRow = sheet.createRow(0
);headRow.setHeightInPoints((short)(20));
//設置頭部高度//添加數據HSSFCell cell =
null;for(
int i = 0 ; i < header.length ; i++
){cell =
headRow.createCell(i);cell.setCellStyle(headerStyle);HSSFRichTextString text =
new HSSFRichTextString(header[i]);cell.setCellValue(text);}return headRow;}/*** 設置單元格數據* @author chenssy * @date 2014年6月17日 上午11:48:14* @param row 指定行* @param index * @param i 行數* @param value 單元格值* @param cell 單元格* @param sheet sheet* @param patriarch 頂級畫板* @param book Excel* @version 1.0*/private void setCellData(HSSFRow row,
int index ,
int i ,Object value,HSSFCell cell,HSSFSheet sheet,HSSFPatriarch patriarch,HSSFWorkbook book) {String textValue =
null; if (value
instanceof Date) {
//為日期設置時間格式Date date =
(Date) value;SimpleDateFormat sdf =
new SimpleDateFormat(DATE_PATTERN);textValue =
sdf.format(date); }if(value
instanceof byte[]){
//byte為圖片//設置圖片單元格寬度、高度row.setHeightInPoints((
short)(IMAGE_HEIGHT * 10
));sheet.setColumnWidth(i, IMAGE_WIDTH * 256
);HSSFClientAnchor anchor =
new HSSFClientAnchor(0, 0, 1023, 255,(
short) i, index, (
short) i, index); anchor.setAnchorType(3
); //插入圖片 byte[] bsValue = (
byte[]) value;patriarch.createPicture(anchor, book.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG)); }else{
//其余全部當做字符處理if(value !=
null){textValue =
String.valueOf(value);}else{textValue = ""
;}}// 如果不是圖片數據,就利用正則表達式判斷textValue是否全部由數字組成if (textValue !=
null) {Pattern p = Pattern.compile("^//d+(//.//d+)?$"
);Matcher matcher =
p.matcher(textValue);//設置單元格寬度,是文字能夠全部顯示
setCellMaxWidth(textValue,i);sheet.setColumnWidth(i, maxWidth[i]); //設置單元格寬度row.setHeightInPoints((
short)(20));
//設置單元格高度if (matcher.matches()) {// 是數字當作double處理
cell.setCellValue(Double.parseDouble(textValue));} else {cell.setCellValue(textValue);}}}/*** 獲取文件名,若為空,則規則為:yyyyMMddHH24mmss+6位隨機數* @author chenssy * @date 2014年6月17日 下午5:44:27* @param fileName* @return* @version 1.0*/private String getFileName(String fileName) {if(fileName ==
null || ""
.equals(fileName)){//日期Date date =
new Date();SimpleDateFormat sdf =
new SimpleDateFormat("yyyyMMddHH24mmss"
);//隨機數Random random =
new Random();fileName = sdf.format(date) + String.valueOf(Math.abs(random.nextInt() * 1000000
));}return fileName;}/*** 根據字數來獲取單元格大小,并更新當前列的最大寬度* @author chenssy * @date 2014年6月17日 下午7:35:52* @param textValue * @param 指定列* @return* @version 1.0*/private void setCellMaxWidth(String textValue,
int i ) {int size =
textValue.length();int width = (size + 6) * 256
;if(maxWidth[i] <=
width){maxWidth[i] =
width;}}/*** 將生成的Excel保存到指定路徑下* @author chenming * @date 2014年6月19日 下午6:10:17* @param book 生成的Excel* @param filePath 需要保存的路勁* @param fileName Excel文件名* @version 1.0*/private void saveExcel(HSSFWorkbook book, String filePath, String fileName) {//檢測保存路勁是否存在,不存在則新建
checkFilePathIsExist(filePath);//將Excel保存至指定目錄下fileName =
getFileName(fileName);FileOutputStream out =
null;try {out =
new FileOutputStream(filePath + "\\" + fileName + ".xls"
);book.write(out); System.out.println("——————————————————保存Excel文件成功,保存路徑:" + filePath + "\\" + fileName + ".xls"
);} catch (Exception e) {e.printStackTrace();System.out.println("——————————————————保存Excel文件失敗。exportExcelForListAndSave,message:"+
e.getMessage());}finally{if(out !=
null){try {out.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 將生成的Excel打包并保存到指定路徑下* @author chenssy * @date 2014年6月19日 下午6:18:09* @param book 生成的Excel* @param filePath 保存路勁* @param zipName zip 文件名* @param excelName Excel文件名* @version 1.0*/private void zipExcelAndSave(List<HSSFWorkbook>
books,String filePath,String zipName,String excelName){//檢測保存路徑是否存在,若不存在則新建
checkFilePathIsExist(filePath);zipName =
getFileName(zipName);excelName =
getFileName(excelName);//將Excel打包并保存至指定目錄下FileOutputStream out =
null;ZipOutputStream zip =
null;try {out =
new FileOutputStream(filePath + "\\" + zipName + ".zip"
);zip =
new ZipOutputStream(out);HSSFWorkbook book =
null;String _excelName = ""
;for (
int i = 0; i < books.size(); i++
) {book =
books.get(i);_excelName = getFileName(excelName) + "_0" +
i;ZipEntry entry =
new ZipEntry(_excelName + ".xls"
);zip.putNextEntry(entry);book.write(zip);}System.out.println("——————————————————保存Excel文件成功,保存路徑:" + filePath + "\\" + zipName + ".xls"
);} catch (FileNotFoundException e) {e.printStackTrace();System.out.println("——————————————————保存Excel文件失敗。method:exportExcelForBigDataAndSave,message:" +
e.getMessage());} catch (IOException e) {e.printStackTrace();System.out.println("——————————————————保存Excel文件失敗。method:exportExcelForBigDataAndSave,message:" +
e.getMessage());} finally {if (zip !=
null) {try {zip.flush();zip.close();} catch (IOException e) {e.printStackTrace();}}if (out !=
null) {try {out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 檢測保存路徑是否存在,不存在則新建* @author chenssy * @date 2014年6月18日 下午1:05:17* @param filePath* @version 1.0*/private void checkFilePathIsExist(String filePath) {File file =
new File(filePath);if(!
file.exists()){file.mkdirs();}}
} ?
總結
以上是生活随笔為你收集整理的HP-JavaUtil: xls 操作类的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。