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. web.config中namespace的配置(针对页面中引用)

    1,在页面中使用强类型时: @model GZUAboutModel @using Nop.Admin.Models//命名空间(注意以下) 2,可以将命名空间提到web.config配置文件中去,此 ...

  2. DAY17-认证系统

    COOKIE 与 SESSION 概念 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...

  3. JavaScript去除空格的三种方法(正则/传参函数/trim)

    方法一: 个人认为最好的方法.采用的是正则表达式,这是最核心的原理. 其次.这个方法使用了JavaScript 的prototype 属性 其实你不使用这个属性一样可以用函数实现.但这样做后用起来比较 ...

  4. js中的操作符

    写在前面 js语法 DOM对象(把body,div,p等节点树看成一个对象) BOM对象(把浏览器的地址栏历史记录DOM等装在一个对象) 浏览器是宿主,但js的宿主不限于浏览器,也可以是服务器,如no ...

  5. __get(),__set(),__isset(),__unset()

    __get(),__set(),__isset(),__unset() 在给不可访问属性赋值时,__set()会被调用读取不可访问属性的值时,__get()会被调用 当对不可访问属性调用isset() ...

  6. 算法Sedgewick第四版-第1章基础-024-M/M/1 queue

    /****************************************************************************** * Compilation: javac ...

  7. Linux 性能调优

    一.简介 有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等.为了更好的优化程序性能,我们必须找到性能瓶颈点,"好钢用在刀刃上"才能取得好的效果,否则可能白做工 ...

  8. 图--生成树和最小生成树.RP

    树(自由树).无序树和有根树    自由树就是一个无回路的连通图(没有确定根)(在自由树中选定一顶点做根,则成为一棵通常的树).    从根开始,为每个顶点(在树中通常称作结点)的孩子规定从左到右的次 ...

  9. 20169219 《Linux内核原理与分析》 第十周作业

    进程地址空间 1.进程地址空间由进程可寻址的虚拟内存组成.Linux系统中的所有进程之间以虚拟方式共享内存. 2.进程只能访问有效内存区域内的内存地址. 内存区域可以包含各种内存对象: (1) 代码段 ...

  10. asp.net mvc3.0安装失败之终极解决方案

    安装失败截图 原因分析 因为vs10先安装了sp1补丁,然后安装的mvc3.0,某些文件被sp1补丁更改,导致“VS10-KB2483190-x86.exe”安装不了,造成安装失败. 解决方案 方法1 ...