封装下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类中 ...
随机推荐
- Java8 日期和时间实用技巧
新的日期API ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则 Instant: 用来表示时间线上的一个点 LocalDate: 表示没有时区的日期, Lo ...
- Python之函数目录(自定义函数,内置函数,装饰器,迭代器,生成器)
1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数 9.函数相关定义 10.三元表达式.列表推导式.生成器表达式 11.函数与方法的区别
- 清除SUN服务器部件的suspect状态
对于suspect状态的部件,可以用setchs命令清除其状态.如果ScApp的版本在5.20.15之前,需要进入service模式后才能使用setchs命令.如果ScApp版本 升级到5.20.15 ...
- IRedisClient
事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这 ...
- linux命令-sudo普通用户拥有root权限
普通用户权限不够 [root@wangshaojun ~]# su - dennywang[dennywang@wangshaojun ~]$ ls /root/ls: 无法打开目录/root/: 权 ...
- js中substring和substr用法与区别
String.substring( ):用于返回一个字符串的子串 用法如下:string.substring(from, to) 其中from指代要抽去的子串第一个字符在原字符串中的位置 to指代所要 ...
- 用SSIS包导入数据
创建一个简单ETL包.打开 Step 1:创建新的Integration Services项目 在开始菜单中找到SQL Server Data Tools并打开,在Microsoft SQL Serv ...
- SQL语句兼容性规范
一.DDL兼容性规范(防止表结构变更后,原有的SQL执行报错)只能增加字段或修改字段长度(字段长度改大),不能修改字段名字和类型,不能删除字段不能删除表或者修改表名称 二.DML兼容性规范insert ...
- ASCII\UNICODE编码的区别
前几天,Google给我Hotmail邮箱发了封确认信.我看不懂,不是因为我英文不行,而是"???? ????? ??? ????"的内容让我不知所措.有好多程序员处理不好编码问题 ...
- CF 959E Mahmoud and Ehab and the xor-MST
第一反应是打表找规律……(写了个prim)但是太菜了没找到 于是开始怀疑是不是我的表错了,又写了一个克鲁斯卡尔,然后结果是一样的……(捂脸) 后来从克鲁斯卡尔的算法上发现了一点东西,发现只有2的幂次长 ...