封装下Excel导出
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导出的更多相关文章
- 也谈Excel导出
吐槽 Excel导出在天朝的软件大环境下,差点成为软件开发必备.俺就遇到过,所有报表不提供导出功能,就能不验收的囧事.报表能查看能打印能形成图表已经完美,实在搞不懂导出excel有个毛用,但是公司依靠 ...
- flex+java将数据库里的数据导出到指定目录下excel表里(poi)
数据写入到excel中采用的是Apache POI: //java后台的一个工具类(该工具类适用于为不同字段添加,方便) /* 下面这个方法是将list转换为Excel工作表的 */ public s ...
- 封装excel导出方法
封装读取excel内容方法 /** * 获取Excel内容 * @param type $filename * @return type */ public function getExcelCont ...
- 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 ...
- 基于springboot跟poi封装的最便捷的excel导出
发布时间:2018-11-15 技术:springboot1.5.6 + maven3.0.5 + jdk1.8 概述 Springboot最便捷的Excel导出,只需要一个配置文件即可搞定 ...
- 二十六、【开源框架】EFW框架Winform前端开发之Grid++Report报表、条形码、Excel导出、图表控件
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...
- Asp.Net 常用工具类之Office—Excel导出(4)
开发过程中各类报表导入导出防不胜防,网上也是各种解决方法层出不穷,比如Excel,CSV,Word,PDF,HTML等等... 网上各种导出插件也是层出不穷,NPOI,微软Microsoft.Offi ...
- .NET Excel导出方法及其常见问题详解
摘要:.NET Excel导出方法及其常见问题详解. 一.Excel导出的实现方法 在.net 程序开发中,对于Excel文件的导出我们一共有三种导出方式: 利用文件输出流进行读写操作 这种方式的导出 ...
- excel导出功能优化
先说说优化前,怎么做EXCEL导出功能的: 1. 先定义一个VO类,类中的字段按照EXCEL的顺序定义,并且该类只能用于EXCEL导出使用,不能随便修改. 2. 将查询到的结果集循环写入到这个VO类中 ...
随机推荐
- jQuery选择器整理
最使用近工作中常用到jQuery,在过滤器的使用方面生疏,所以本文整理了些有关知识点,以便于自己查找方便,或为朋友们提供方便! 一.基本选择器 $("#test") 选取id为te ...
- eclipse DDMS导出文件失败--android Failed to push the item
我们在写安卓程序的时候,经常会用Eclipse导出模拟器的文件管理里面的文件,但有时候会报错,导致无法导出文件. 报错信息 Failed to push selection: Local path d ...
- 自定义Android Studio方法注释模板
前言 你们从Eclipse转到Android Studio的时候,是不是会怀念Eclipse的方法注释模版? 敲/**加回车,模板就出来了,而Android Studio却不能自定义(或者我没有找到) ...
- JavaScript的编译原理
尽管通常将 JavaScript 归类为“动态”或“解释执行”语言,但事实上它是一门编译语言.这个事实对你来说可能显而易见,也可能你闻所未闻,取决于你接触过多少编程语言,具有多少经验.但与传统的编译语 ...
- 【转】nginx location匹配规则
转载请保留:http://www.nginx.cn/115.html location匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写~* #表示执行一个正则匹配,不区分大小写^ ...
- ROS Learning-010 beginner_Tutorials 编写简单的启动脚本文件(.launch 文件)
ROS Indigo beginner_Tutorials-09 编写简单的启动脚本文件 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...
- 算法Sedgewick第四版-第1章基础-009一链表与数组的比较及其他数据结构
1. 2.
- R: 基本的数学运算
################################################### 问题:基本数学运算 18.4.30 R语言用于初等数学的计算,都怎么表示??加减乘除.余数. ...
- WOJ 18 动态无向图
一开始我是不会写的,后来点开了题解: 无话可说……那就写吧……然而第一发跑成暴力分,后来加了一个优化:就是在询问里面提到过的边都不用再加了. 然后……然后就过了呀…… 其实还有面向数据的编程的骚操作… ...
- cakephp数据库配置