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章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...
随机推荐
- linux下如何安装webbench
1.上传webbench,解压 2.make&&make install进行安装 如果报没有man1目录,则要用 mkdir -p /usr/local/man/man1 然后 mak ...
- HDU 3342 Legal or Not(判断是否存在环)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Othe ...
- 【 D3.js 入门系列 --- 6 】 如何让图表动起来
[5.1]节中制作了一个比较完善的图表,但它是静态的,想做出它的动态效果吗?在D3中只需要短短的几行代码即可. 这一节将涉及4个函数的使用. 1.transition() 启动转变效果只需要添加这个即 ...
- 深入理解Bindler
Binder模型
- [SimHash] find the percentage of similarity between two given data
SimHash algorithm, introduced by Charikarand is patented by Google. Simhash 5 steps: Tokenize, Hash, ...
- ubuntu 16.04 启用root用户方法
引用:http://blog.csdn.net/sunxiaoju/article/details/51993091 1.使用:sudo passwd root设置root的密码,如下图所示: 2.使 ...
- 总是弹出visual studio 实时调试器 三种解决办法
最近服务器老是弹出visual studio 实时调试器很是郁闷呀.关还关不掉.怎么解决呢 ,现像如下图所示: 下面我们一起来分析一下这种情况的原因: 弹出应用程序: Visual Studio 实时 ...
- jquery之css操作
HTML示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- [转]PHP如何关闭notice级别的错误提示
1.在php.ini文件中改动error_reporting改为: error_reporting=E_ALL & ~E_NOTICE 2.如果你不能操作php.ini文件,你可以使用如下方法 ...
- 转载:scala中:: , +:, :+, :::, ++的区别
原文链接:https://segmentfault.com/a/1190000005083578 初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. ...