1. 使用方法

1.1 对象使用注解

@ExcelColumn(name = "页面1",freeze = "0,1,1,2",autoWidth=true)
public class ProductExcelSheetOneVO {
   private Long id; /**
* 订单号
*/
@ExcelColumn(name = "服单订单号", order = 1, hyperLinkTemplate = "https://xxx?code={}&test={}", hyperLinkPattern = {"orderCode","id"})
private String orderCode;
}

  

1.2 构造数据

List<Object> sheetOneVOS = Lists.newArrayList();
List<Object> sheetTwoVOS = Lists.newArrayList();
ExcelExportUtil.exportExcelStram(response.getOutputStream(), Lists.newArrayList(sheetData,sheetData2));

2. 注解

@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelColumn {
String name(); String hyperLinkTemplate() default ""; String[] hyperLinkPattern() default {}; int order() default 0; String datePattern() default "yyyy-MM-dd HH:mm:ss"; /**
* 冻结表头
* 有则为启用
* 格式为 1,2
* 或 1,2,3,4
* @return
*/
String freeze() default ""; boolean autoWidth() default false;
}

3. 执行方法

public class ExcelExportUtil {

    /**
* excel 文件输出
*
* @param outputStream
* @param sheetList
* @throws IOException
*/
public static void exportExcelStram(OutputStream outputStream, List<Sheet> sheetList) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();
sheetList.forEach(m -> initSheet(m.getContentList(), m.getClzz(), workbook));
workbook.write(outputStream);
} /**
* 组织单sheet
*
* @param content
* @param clzz
* @param workbook
*/
private static void initSheet(List<Object> content, Class clzz, HSSFWorkbook workbook) { /**
* get excel header from annotation
*/
List<Head> header = Lists.newArrayList();
Field[] fields = clzz.getDeclaredFields();
/**
* init header
*/
Map<String, Head> headMap = initHeader(header, fields); HSSFSheet sheet;
ExcelColumn rowColumn = (ExcelColumn) clzz.getAnnotation(ExcelColumn.class); if (rowColumn != null) {
sheet = workbook.createSheet(rowColumn.name());
} else {
sheet = workbook.createSheet();
}
Method[] methods = clzz.getDeclaredMethods();
Map<String, Method> methodMap = Maps.uniqueIndex(Lists.newArrayList(methods), input -> input.getName().toLowerCase()); /**
* init header
*/
AtomicInteger rowIndex = new AtomicInteger(0);
HSSFRow headerRow = sheet.createRow(rowIndex.getAndAdd(1));
AtomicInteger headerIndex = new AtomicInteger(0);
header.forEach((k) -> {
HSSFCell cell = headerRow.createCell(headerIndex.getAndAdd(1));
cell.setCellValue(k.getTitle());
});
/**
* init content
*/
Collections.synchronizedList(content).parallelStream().forEach(m -> { Map<String, Object> contentMap = Maps.newHashMap();
for (int i = 0; i < fields.length; i++) {
if (!headMap.keySet().contains(fields[i].getName())) {
continue;
}
fields[i].setAccessible(true);
Object val = null;
try {
// val = fields[i].get(m);
//get val from get method
System.out.println(fields[i].getName());
val = methodMap.get("get" + fields[i].getName().toLowerCase()).invoke(m);
} catch (Exception e) {
e.printStackTrace();
continue;
}
if (fields[i].getType() == Date.class) {
contentMap.put(fields[i].getName(), HikDateUtils.getDateString((Date) val, headMap.get(fields[i].getName()).getDatePattern()));
} else if (fields[i].getType() == BigDecimal.class) {
contentMap.put(fields[i].getName(), String.valueOf(val));
} else {
contentMap.put(fields[i].getName(), val == null ? "" : String.valueOf(val));
}
}
HSSFRow row = sheet.createRow(rowIndex.getAndAdd(1));
AtomicInteger cellIndex = new AtomicInteger(0);
header.forEach((k) -> {
HSSFCell cell = row.createCell(cellIndex.getAndAdd(1));
cell.setCellValue(contentMap.get(k.getCode()) + ""); if (!StringUtils.isEmpty(k.getHyperlinkTemplate())) {
String hyLink = HikStringUtils.append(k.getHyperlinkTemplate(), Lists.newArrayList(k.getHyperlinkPattern()).stream().map(p ->
contentMap.get(p) == null ? "" : contentMap.get(p).toString()
).toArray()); HSSFHyperlink link = new HSSFHyperlink(HSSFHyperlink.LINK_URL);
link.setAddress(hyLink);
cell.setHyperlink(link);
}
});
});
/**
* auto width
*/
if (rowColumn.autoWidth()) {
for (int i = 0; i < content.size(); i++) {
sheet.autoSizeColumn(i, true);
}
}
if (!StringUtils.isEmpty(rowColumn.freeze())) {
String[] freezeArray = rowColumn.freeze().split(BaseConstants.SPLITER);
if (freezeArray.length == 2) {
sheet.createFreezePane(Integer.parseInt(freezeArray[0]), Integer.parseInt(freezeArray[1]));
}
if (freezeArray.length == 4) {
sheet.createFreezePane(Integer.parseInt(freezeArray[0]), Integer.parseInt(freezeArray[1]), Integer.parseInt(freezeArray[2]), Integer.parseInt(freezeArray[3]));
} }
} private static Map<String, Head> initHeader(List<Head> header, Field[] fields) {
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
ExcelColumn excelColumn = fields[i].getAnnotation(ExcelColumn.class);
if (excelColumn == null) {
continue;
}
header.add(new Head(fields[i].getName(), excelColumn.name(), excelColumn.order(), excelColumn.datePattern(), excelColumn.hyperLinkTemplate(), excelColumn.hyperLinkPattern()));
}
Collections.sort(header);
return Maps.uniqueIndex(header, Head::getCode);
} public static class Sheet {
public Sheet(List<Object> contentList, Class clzz) {
this.contentList = contentList;
this.clzz = clzz;
} private List<Object> contentList;
private Class clzz; public List<Object> getContentList() {
return contentList;
} public void setContentList(List<Object> contentList) {
this.contentList = contentList;
} public Class getClzz() {
return clzz;
} public void setClzz(Class clzz) {
this.clzz = clzz;
}
} public static class Head implements Comparable<Head> {
/**
* code
*/
private String code;
/**
* title
*/
private String title;
/**
* order
*/
private Integer order;
/**
* hyper link template
*/
private String hyperlinkTemplate;
/**
* hyper link pattern
*/
private String[] hyperlinkPattern;
/**
* date format
*/
private String datePattern; /**
* @param title
* @param template
* @param patten
*/
public Head(String code, String title, Integer order, String datePattern, String template, String... patten) {
this.code = code;
this.title = title;
this.order = order;
this.datePattern = datePattern;
this.hyperlinkTemplate = template;
this.hyperlinkPattern = patten;
} public Head(String code, String title, Integer order) {
this.code = code;
this.title = title;
this.order = order;
} public Integer getOrder() {
return order;
} public void setOrder(Integer order) {
this.order = order;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getTitle() {
return title;
} public String getHyperlinkTemplate() {
return hyperlinkTemplate;
} public String[] getHyperlinkPattern() {
return hyperlinkPattern;
} public String getDatePattern() {
return datePattern;
} public void setDatePattern(String datePattern) {
this.datePattern = datePattern;
} @Override
public int compareTo(Head o) {
return this.getOrder().compareTo(o.getOrder());
}
}
}

封装下Excel导出的更多相关文章

  1. 也谈Excel导出

    吐槽 Excel导出在天朝的软件大环境下,差点成为软件开发必备.俺就遇到过,所有报表不提供导出功能,就能不验收的囧事.报表能查看能打印能形成图表已经完美,实在搞不懂导出excel有个毛用,但是公司依靠 ...

  2. flex+java将数据库里的数据导出到指定目录下excel表里(poi)

    数据写入到excel中采用的是Apache POI: //java后台的一个工具类(该工具类适用于为不同字段添加,方便) /* 下面这个方法是将list转换为Excel工作表的 */ public s ...

  3. 封装excel导出方法

    封装读取excel内容方法 /** * 获取Excel内容 * @param type $filename * @return type */ public function getExcelCont ...

  4. weblogic 12c下jxls导出excel报错Could not initialize class org.apache.poi.xssf.usermodel.XSSFVMLDrawing

    周一,开发反馈weblogic 12c下jxls导出excel报错,公司环境和UAT环境均报错,看日志如下: 2016-06-08 09:16:55,825 ERROR org.jxls.util.T ...

  5. 基于springboot跟poi封装的最便捷的excel导出

    发布时间:2018-11-15   技术:springboot1.5.6 + maven3.0.5 + jdk1.8   概述 Springboot最便捷的Excel导出,只需要一个配置文件即可搞定 ...

  6. 二十六、【开源框架】EFW框架Winform前端开发之Grid++Report报表、条形码、Excel导出、图表控件

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

  7. Asp.Net 常用工具类之Office—Excel导出(4)

    开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等... 网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Offi ...

  8. .NET Excel导出方法及其常见问题详解

    摘要:.NET Excel导出方法及其常见问题详解. 一.Excel导出的实现方法 在.net 程序开发中,对于Excel文件的导出我们一共有三种导出方式: 利用文件输出流进行读写操作 这种方式的导出 ...

  9. excel导出功能优化

    先说说优化前,怎么做EXCEL导出功能的: 1. 先定义一个VO类,类中的字段按照EXCEL的顺序定义,并且该类只能用于EXCEL导出使用,不能随便修改. 2. 将查询到的结果集循环写入到这个VO类中 ...

随机推荐

  1. git clone 某一特定分支<转>

    网上搜索自己想要的答案,往往会搜大一大堆感觉没用的,或者看不懂的东西, 最好终于找到了想要答案,特记录一下: ============================================= ...

  2. 正确的停止java中的线程

    stop()方法不是一个正确的停止线程方法. 正确的停止方法:设置退出旗标

  3. 如何取消WIN7的共享密码

    如何取消WIN7的共享密码 把你的Guest帐号的密码设为空.如何设置呢? 1.右键“计算机”-“管理”-“本地用户和组”-“用户”-右键帐号“Guest”-“设置密码”,然后直接点击确定,不予设置密 ...

  4. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

  5. 01 json环境搭建【spring + pringMVC】

    1 导包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o ...

  6. 【转】pecl,pear的不同

    PEAR是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写.它是一个PHP扩展及应用的一个代码仓库,基于php代码的,安装目录在/u ...

  7. ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)

    ROS Indigo beginner_Tutorials-12 编写ROS服务版的Hello World程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的 ...

  8. vray学习笔记(3)-多维子材质是个什么东西

    多维子材质是个什么东西?为什么出现这个概念? 在3dsmax官方网站,我们可以看到它的定义: The Multi/Sub-Object material lets you assign differe ...

  9. 《Spring实战》-1

    1.Spring的主要特性:依赖注入DI和面向切面编程AOP. 2.关键策略: 轻量级和最小侵入性编程:POJO 松耦合:DI和AOP 声明式编程:切面和惯例 减少样板式代码:切面和模板 3.Spri ...

  10. [jQuery]使用jQuery.Validate进行客户端验证(初级篇)

    以前在做项目的时候就有个很大心病,就是微软的验证控件,虽然微软的验证控件可以帮我们完成大部分的验证,验证也很可靠上手也很容易,但是我就是觉得不爽,主要理由有以下几点: 1.拖控件太麻烦,这个是微软控件 ...