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章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...
随机推荐
- mysql 导入导出方法。
1.导出 mysqldump -u username - p databasename >名.sql enter passward: 2.导入:mysql -uroot -proot sour ...
- 观 GT Java语言管理系统的感悟
继上次java系统考核完... 坦白说,我对我自己写的例子还是很满意的,虽说学长们给的评价不高 ,但我一直以为是学长们对我们的要求太高,以他们的眼光在看待我们,所以我对学长们给的评价并没有太过在意,当 ...
- IOS懒加载
1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 ...
- Java框架重量级,轻量级的问题?
一般认为,SSH为重量级.SSI为轻量级. 但轻重的概念怎么界定?
- 关于vue.js中条件渲染的练习
html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...
- SQL语句小总结
无论是面试过程中,还是未来工作中,SQL都是一定会考到和用到的.所以,在此对之前看过的一些SQL知识点进行一下总结和记录,算是起到一个笔记本的作用.没有深入学习过SQL的和对SQL印象不太深的朋友可以 ...
- css3新增的属性选择器
使用css选择器,可以实现一个样式对应多个html文档的元素,在{}前面的部分就是"选择器",指明了样式的作用对象. 在CSS中追加了三个属性选择器:[att*=val].[att ...
- 如何在Jenkins CI 里调试
背景 厂内的CI系统把 Jenkins 和Github 连接了起来,这样Dev 只要通过github pr 就能够了解到测试job 运行的情况.有的时候,Dev会找到QA问,如何在Jenkins CI ...
- sqlalchemy 实体属性提前加载
在flask里需要给视图传送数据,肯定需要把模型的实体属性提前加载,可以使用 sqlalchemy.orm.subqueryload 或 sqlalchemy.orm.joinedload 示例: @ ...
- mysql内存使用以及优化中需要的几点注意
1.从内存中读取数据是微秒级别的.而从磁盘读则是毫秒级别的.二者相差一个数量级.所以想优化数据库,第一个要做到的就是优化io. 2.key_buffer_size[global]设置的内存区域大小缓存 ...