封装下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类中 ...
随机推荐
- debian7 安装VMware Tools
前提:需要安装gcc.kernel 1. apt-get install gcc 2. apt-get install kernel 问题描述: 安装时如果提示更换介质 :请把标有 " de ...
- ClientDataSet + DataSetProvider + FDQuery 的bug
ClientDataSet + DataSetProvider +FDQuery 有 bug ClientDataSet + DataSetProvider +ADOQuery正常. Client ...
- Linux系统下Oracle执行SQL脚本后中文出现乱码解决方法
先确认Oracle的字符集,sqlplus登录Oracle后执行语句: [sql] select userenv('language') from dual; 返回值例如:AMERICAN_AME ...
- k8s cookbook读书笔记 第二章
走一遍概念 An overview of Kubernetes control f Working with pods f Working with a replication controller ...
- 数据库监听。数据库一次notify,Activity多次接收
今天项目中发现一个bug: (1)当uri数据库中有更新,会从数据库层DataService中通知应用层,调用notifyChange: mContext.getContentResolver().n ...
- 在发送intent启动activity之前判断是否有activity接收
通过packagemanager()的queryIntentAActivities(intent,0)的返回list<ResolveInfo>长度来判断具体代码如下: PackageMan ...
- Lucene打分公式的数学推导
原文出自:http://www.cnblogs.com/forfuture1978/archive/2010/03/07/1680007.html 在进行Lucene的搜索过程解析之前,有必要单独的一 ...
- 设置 PyCharm 软件中 Terminal 窗口 中启动的 python 交互命令的版本
设置 PyCharm 软件中 Terminal 窗口 中启动的 python 交互命令的版本 python2 和 python3 有很大的不同,使用python2 编写的程序,如果使用python3 ...
- essential C++中关于面向过程和面向对象的说明
昨天在阅读essential C++中看到了一个关于面向过程和面向对象的区别的例子,感觉挺好的.记录下来.... 这个例子是关于照相机的.照相机有三个性质,一个是控制位置:通常使用3个浮点数据来表示其 ...
- redhat图形界面启动后出现桌面但是没有登录界面解决办法
redhat图形界面启动后出现桌面但是没有登录界面解决办法 2014年07月11日 10:50:10 阅读数:7931 redhat Linux一直用着好好地,今天打开只有图像界面背景,没有出现登陆界 ...