HP-JavaUtil: xls 操作类
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){
//生成一个Excel
HSSFWorkbook book = new HSSFWorkbook();
//生成一个表格
sheetTitle = getSheetTitle(sheetTitle); //判断、设置sheetTitle
HSSFSheet 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){
//生成一个Excel
HSSFWorkbook book = new HSSFWorkbook();
// 生成一个表格
sheetTitle = getSheetTitle(sheetTitle); // 判断、设置sheetTitle
HSSFSheet 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){
//生成Excel
HSSFWorkbook 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){
//生成Excel
HSSFWorkbook 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){
//生成Excel
HSSFWorkbook 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){
//生成Excel
HSSFWorkbook 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<>(); //创建表数据结果集 //判断需要生成几个Excel
int num = excelList.size() % maxRowCount == 0 ? excelList.size() / maxRowCount : excelList.size() / maxRowCount + 1; HSSFWorkbook book = new HSSFWorkbook();
List<Object> newList = null; //新数据列表
String newTitle = null; //新title
for(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)){ //如果是创建多个Excel
book = exportExcel(header, newList, newTitle);
list.add(book);
}
else if(MORE_SHEET_FLAG.equals(flag)){ //创建多sheet
HSSFSheet 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<>(); //创建表数据结果集
// 判断需要生成几个Excel
int num = excelList.size() % maxRowCount == 0 ? excelList.size() / maxRowCount : excelList.size() / maxRowCount + 1; HSSFWorkbook book = new HSSFWorkbook();
List<Object> newList = null; // 新数据列表
String newTitle = null; // 新title
for (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)) { // 如果是创建多个Excel
book = exportExcel(header,properties, newList, newTitle);
list.add(book);
} else if (MORE_SHEET_FLAG.equals(flag)) { // 创建多sheet
HSSFSheet 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设置为null
try {
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 操作类的更多相关文章
- 【个人使用.Net类库】(3)Excel文件操作类(基于NPOI)
Web开发工作中经常要根据业务的需要生成对应的报表.经常采用的方法如下: 将DataTable导出至Excel文件; 读取模板Excel文件; 修改模板Excel文件对应的内容. 因此,便想到封装一个 ...
- C#EXCEL 操作类--C#ExcelHelper操作类
主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...
- [C#] 常用工具类——文件操作类
/// <para> FilesUpload:工具方法:ASP.NET上传文件的方法</para> /// <para> FileExists:返回文件是否存在&l ...
- [Excel] C# ExcelHelper操作类 (转载)
点击下载 ExcelHelper.rar 主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Exc ...
- C# 文件操作类大全
C# 文件操作类大全 时间:2015-01-31 16:04:20 阅读:1724 评论:0 收藏:0 [点我收藏+] 标签: 1.创建文件夹 //usin ...
- C# Excel操作类 ExcelHelper
实现C#与Excel文件的交互操作,实现以下功能: 1.DataTable 导出到 Excel文件 2.Model数据实体导出到 Excel文件[List<Model>] 3.导出数据到模 ...
- XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)
XML序列化 #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...
- File 文件操作类 大全
File 文件操作类 大全 许多人都会对文件操作感到很难 我也是 但是一个好的项目中必定会涉及到文件操作的 文件的复制 粘贴 等等等 公司大佬写了 一个文件操作的工具类 感觉还是棒棒的啦 ...
- C#自定义Excel操作类
C#自定义Excel操作类,可以用于将DataTable导出到Excel文件,从Excel文件读取数据. using System; using System.IO; using System.Dat ...
随机推荐
- 在centos7上配置jenkins
在Linux(centos7)环境下配置jenkins,并用github作为仓库. 配置jenkins https://blog.csdn.net/wangfei0904306/article/det ...
- Java:ConcurrentHashMap支持完全并发的读
ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁.(事实上,ConcurrentHashMap支持完全并发的读以及一定程度并发的写.)如果使用传统的技术,如HashMa ...
- web安全系列1:入侵的途径
大家好,接下来的很长一段时间我都会介绍和web安全有关的知识,欢迎大家关注和转发. 话不多说,我们首先来看看今天的主题----入侵的途径.当然,今天介绍的都是针对web网站的常用手法和技巧. 不可否认 ...
- python中使用XPath
XPath在Python的爬虫学习中,起着举足轻重的地位,对比正则表达式 re两者可以完成同样的工作,实现的功能也差不多,但XPath明显比re具有优势,在网页分析上使re退居二线. XPath介绍: ...
- 2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)
传送门 题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi,YYY道具移走第iii个道具概率为uiu_iui. 对于每个物品每种道具最多 ...
- php类自动加载
__autoload 新建一个index.php <?php $d = new z(); function __autoload($class) //自动捕获new的类名 { $file = $ ...
- Python开发——11.异常及异常处理
一.异常 1.定义 异常及时程序运行时发生错误的信号 2.种类 异常分为语法错误和逻辑错误,语法错误在程序执行之前就应该改正. 常用异常 AttributeError 试图访问一个对象没有的树形,比如 ...
- 写给笨蛋徒弟的学习手册(3)—C#中15个预定义数据类型
在C#中学习中,你会很早的遇到预定义数据类型这个概念,但你有没有仔细想过它存在的意义?正所谓“存在即合理”,预定义数据类型的存在目的主要有俩个方面,一是为了增加程序的安全性,同时减轻编译器负担,加快编 ...
- Visual Studio Code and local web server
It is the start of a New Year and you have decided to try Visual Studio Code, good resolution! One o ...
- vue组件通信新姿势
在vue项目实际开发中我们经常会使用props和emit来进行子父组件的传值通信,父组件向子组件传递数据是通过prop传递的, 子组件传递数据给父组件是通过$emit触发事件来做到的.例如: Vue. ...