poi导出excel通用类
一、关键的通用类
public class PoiExportUtils {
private static HSSFWorkbook workBook;
public PoiExportUtils(){
workBook = new HSSFWorkbook();
}
/**
* 创建sheet
* @param sheetName
* @param workBook
* @return
*/
public static HSSFSheet createHSSFSheet(String sheetName,HSSFWorkbook workBook){
// 生成一个表格
HSSFSheet sheet = workBook.createSheet(sheetName);
sheet.setDefaultColumnWidth(20);
return sheet;
}
/**
* 根据头部名称产生表格标题行
* @param sheet
* @param headers
* @return
*/
public void createHSSFSheetHeader(HSSFSheet sheet,String[] headers){
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
setHeaderStyle(cell);
}
}
/**
* 根据实体产生表格标题行
* @param sheet
* @param headers
* @return
*/
public <T> void createHSSFSheetHeader(HSSFSheet sheet,Collection<T> dataset,String ... excludes){
Iterator<T> it = dataset.iterator();
if(it.hasNext()){
HSSFRow row = sheet.createRow(0);
Field[] fields = it.next().getClass().getDeclaredFields();
int cellIndex = 0;
A:for(int i=0;i<fields.length;i++) {
String fieldName = fields[i].getName();
if(excludes != null){
for(String exclude : excludes){
if(exclude.equals(fieldName)){
continue A;
}
}
}
if(!fields[i].isAnnotationPresent(PoiCell.class)){
continue;
}
PoiCell poiCell = fields[i].getAnnotation(PoiCell.class);
HSSFCell cell = row.createCell(cellIndex);
HSSFRichTextString text = new HSSFRichTextString(poiCell.headerName());
cell.setCellValue(text);
setHeaderStyle(cell);
cellIndex++;
}
}
}
/**
*
* @param sheetName,工作簿名称
* @param headers,可选,
* 如果有则以这个数组中的字符串为页眉,
* 如果没有则去扫描实体类上的注解@PoiCell,以有注解的属性value为页眉。
* @param dataset,需要导出的数据集合
* @param pattern,如果日期,那么需要设置日期类型格式,
* @param out,导出的流
* @param excludes,排除的列,对应实体类属性名。
*/
public <T> void exportExcel(String sheetName,String[] headers,Collection<T> dataset,String pattern, OutputStream out,String ... excludes) {
try {
HSSFSheet sheet = createHSSFSheet(sheetName, workBook);
if(headers==null){
createHSSFSheetHeader(sheet, dataset, excludes);
}else{
createHSSFSheetHeader(sheet, headers);
}
Iterator<T> it = dataset.iterator();
int index = 1;
while(it.hasNext()){
HSSFRow row = sheet.createRow(index);
T t = it.next();
Field[] fields = t.getClass().getDeclaredFields();
int cellIndex = 0;
A:for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName();
if(excludes != null){
for(String exclude : excludes){
if(exclude.equals(fieldName)){
continue A;
}
}
}
if(!fields[i].isAnnotationPresent(PoiCell.class)){
continue A;
}
HSSFCell cell = row.createCell(cellIndex);
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Method getMethod = t.getClass().getMethod(getMethodName);
Object returnValue = getMethod.invoke(t);
String textValue = null;
if(returnValue instanceof Date){
Date date = (Date) returnValue;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
textValue = sdf.format(date);
} else if (returnValue instanceof byte[]) {
// 有图片时,设置行高为60px;
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(cellIndex, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[]) returnValue;
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,
(short) cellIndex, index, (short) cellIndex, index);
anchor.setAnchorType(2);
HSSFPatriarch patri = sheet.createDrawingPatriarch();
patri.createPicture(anchor, workBook.addPicture(
bsValue, HSSFWorkbook.PICTURE_TYPE_PNG));
} else if(returnValue!=null){
// 其它数据类型都当作字符串简单处理
textValue = returnValue.toString();
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null) {
Pattern p = Pattern.compile("^//d+(//.//d+)?{1}");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
CellStyle style = workBook.createCellStyle();
style.setWrapText(true);//回绕文本
cell.setCellStyle(style);
cell.setCellValue(textValue);
}
}
cellIndex++;
}
index++;
}
workBook.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给页眉添加样式
* @param cell
*/
private void setHeaderStyle(HSSFCell cell){
// 生成一个样式
HSSFCellStyle style = workBook.createCellStyle();
// 设置这些样式
style.setWrapText(true);//回绕文本
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//设置单元格前景色,蓝色
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中
// 生成一个字体
HSSFFont font = workBook.createFont();
font.setColor(HSSFColor.VIOLET.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
cell.setCellStyle(style);
}
/**
* 如果需要导出图片,那么需要在实体类中定义属性byte[] img 来存放图片数据
* 这个方法,从url的路径获取图片字节数组
* @param strUrl
* @return
*/
// private byte[] getImgByURL(String strUrl){
// //"http://172.16.2.49/83/207/200/0db99469-d2b9-4b97-a1c2-497509c3f5f7.png"
// byte[] byteArray = null;
// try {
// URL url = new URL(strUrl);
//
// InputStream input = url.openStream();
//
// ByteArrayOutputStream output = new ByteArrayOutputStream();
// byte[] buffer = new byte[4096];
// int n = 0;
// while (-1 != (n = input.read(buffer))) {
// output.write(buffer, 0, n);
// }
// byteArray = output.toByteArray();
// } catch (MalformedURLException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
// return byteArray;
// }
}
二、自定义注解类
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PoiCell {
public String headerName() default "";
}
三、实体类
public class CarAlarmExportEntity{
@PoiCell(headerName="车牌号")
private String plateNo;
@PoiCell(headerName="接收时间")
private Date alarmTime;// 报警时间
@PoiCell(headerName="海拔")
private Double altitude;// 海拔
private String alarmFromStr;//报警来源
@PoiCell(headerName="图片路径")
private String imgPath;
@PoiCell(headerName="图片")
private byte[] img;
//get,set
}
四、测试
List<CarAlarmExportEntity> list = new ArrayList<CarAlarmExportEntity>();
PoiExportUtils poi = new PoiExportUtils();
// String[] str = {"a","b","c"};自定义页眉
poi.exportExcel("sheet01",null,list, "yyyy-MM-dd HH:mm:ss", new FileOutputStream("f:/poi.xls"), "alarmFromStr");
poi导出excel通用类的更多相关文章
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- 使用POI导出EXCEL工具类并解决导出数据量大的问题
POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...
- NPOI MVC 模型导出Excel通用类
通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...
- NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中
由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案. 注意:若直接使用在WinForm项目中,必需先下 ...
- POI导出EXCEL经典实现
1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...
- Java POI 导出EXCEL经典实现 Java导出Excel
转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...
- java中使用poi导出excel表格数据并且可以手动修改导出路径
在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下
- 重构:以Java POI 导出EXCEL为例
重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...
随机推荐
- javascript下ie7,ie8的Date Bug的解决
ie9+, chrome firefox opera下 string到Date 使用 new Date("2013-01-01"); 都是ok的. 但在ie7, ie8下 返回N ...
- Oracle数据库导入导出命令总结
Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中.利用 ...
- cf 732c
/* cf732c 错过的最少次数 _________________________________________________________________________________ ...
- radio值未出现JQ获取值问题
$('input:radio[name="modelExtend.manageType"]:checked').val(); 选中的获取的值不是空或者null而是on
- canvas 动态画线
<!--实现鼠标按下的时候,移动进行绘制,鼠标抬起结束绘图,用到的事件有mousedown mousemove mouseup用的的canvas api 有 beginPath moveTo l ...
- 对tomcat中使用反射加载类的理解
public void init() throws Exception { initClassLoaders(); //加载一下jar包和类 Thread.currentThread().setCon ...
- openacs与easycwmp的对接
原创作品,转载请注明出处 copyright:weishusheng 2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...
- ABBYY FineReader 12对系统有哪些要求
ABBYY FineReader是市场领先的ocr文字识别软件,可快速方便地将扫描的文档.PDF文档和图像文件(包括数码照片)转化为可编辑.可搜索的格式.每个软件都有其安装运行的系统要求,ABBYY ...
- eclipse svn插件地址
http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240
- 13、java中的多态
1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...