工具类--Excel 导出poi
实现功能 --批量导出excel 文件,配置一个sheet多少条数据,根据查询数据量的多少确定生成几个sheet页。
pom 文件导入ExcelUtils工具包,依赖于poi包。
<!-- https://mvnrepository.com/artifact/org.hellojavaer/poi-excel-utils -->
<dependency>
<groupId>org.hellojavaer</groupId>
<artifactId>poi-excel-utils</artifactId>
<version>1.1.0-beta</version>
</dependency>
找到ExcelUtils工具包,重构代码。
package cn.enn.chaoscloud.master.utils; import com.lkx.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.springframework.beans.BeanUtils; import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*; @Slf4j
public class ExcelUtils implements Serializable { private static final long serialVersionUID = 1L; /**
* getMap:(将传进来的表头和表头对应的属性存进Map集合,表头字段为key,属性为value)
*
* @author likaixuan
* @param
* : String keyValue = "手机名称:phoneName,颜色:color,售价:price";
* @return
* @since JDK 1.7
*/
public static Map<String, String> getMap(String keyValue) {
Map<String, String> map = new HashMap<String, String>();
if (keyValue != null) {
String[] str = keyValue.split(",");
for (String element : str) {
String[] str2 = element.split(":");
map.put(str2[0], str2[1]);
}
}
return map;
} /**
* @author likaixuan
* @param
* @return List
* @Date 2018年5月9日 21:42:24
* @since JDK 1.7
*/
public static List<String> getList(String keyValue) {
List<String> list = new ArrayList<String>();
if (keyValue != null) {
String[] str = keyValue.split(","); for (String element : str) {
String[] str2 = element.split(":");
list.add(str2[0]);
}
}
return list;
} /**
* setter:(反射的set方法给属性赋值)
*
* @author likaixuan
* @param obj
* 具体的类
* @param att
* 类的属性
* @param value
* 赋予属性的值
* @param type
* 属性是哪种类型 比如:String double boolean等类型
* @throws Exception
* @since JDK 1.7
*/
public static void setter(Object obj, String att, Object value, Class<?> type, int row, int col, Object key)
throws Exception {
try {
Method method = obj.getClass().getMethod("set" + StringUtil.toUpperCaseFirstOne(att), type);
method.invoke(obj, value);
} catch (Exception e) {
throw new Exception("第" + (row + 1) + " 行 " + (col + 1) + "列 属性:" + key + " 赋值异常 " + e);
} } /**
* getAttrVal:(反射的get方法得到属性值)
*
* @author likaixuan
* @param obj
* 具体的类
* @param att
* 类的属性
* @param
*
* @param type
* 属性是哪种类型 比如:String double boolean等类型
* @throws Exception
* @since JDK 1.7
*/
public static Object getAttrVal(Object obj, String att, Class<?> type) throws Exception {
try {
Method method = obj.getClass().getMethod("get" + StringUtil.toUpperCaseFirstOne(att));
Object value = new Object();
value = method.invoke(obj);
return value;
} catch (Exception e) {
log.error(e.getMessage(), e);
return null;
} } /**
* getValue:(得到Excel列的值)
*
* @author likaixuan
* @param
* @return
* @throws Exception
* @since JDK 1.7
*/
public static void getValue(Cell cell, Object obj, String attr, Class attrType, int row, int col, Object key)
throws Exception {
Object val = null;
if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
val = cell.getBooleanCellValue(); } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
if (attrType == String.class) {
val = sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue()));
} else {
val = dateConvertFormat(sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())));
}
} catch (ParseException e) {
throw new Exception("第" + (row + 1) + " 行 " + (col + 1) + "列 属性:" + key + " 日期格式转换错误 ");
}
} else {
if (attrType == String.class) {
cell.setCellType(Cell.CELL_TYPE_STRING);
val = cell.getStringCellValue();
} else if (attrType == BigDecimal.class) {
val = new BigDecimal(cell.getNumericCellValue());
} else if (attrType == long.class) {
val = (long) cell.getNumericCellValue();
} else if (attrType == Double.class) {
val = cell.getNumericCellValue();
} else if (attrType == Float.class) {
val = (float) cell.getNumericCellValue();
} else if (attrType == int.class || attrType == Integer.class) {
val = (int) cell.getNumericCellValue();
} else if (attrType == Short.class) {
val = (short) cell.getNumericCellValue();
} else {
val = cell.getNumericCellValue();
}
} } else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
val = cell.getStringCellValue();
} setter(obj, attr, val, attrType, row, col, key);
} /**
* exportExcel:(导出Excel)
*
* @author likaixuan
* @param
* @return
* @throws Exception
* @since JDK 1.7
*/
public static void exportExcel(HSSFWorkbook wb,OutputStream outputStream, String keyValue, List<?> list, String classPath,int sheetNum,int pageNum)
throws Exception { Map<String, String> map = getMap(keyValue);
List<String> keyList = getList(keyValue); Class<?> demo = null;
demo = Class.forName(classPath);
Object obj = demo.newInstance(); // 建立新的sheet对象(excel的表单)
String sheetName = "sheet"+String.valueOf(sheetNum);
HSSFSheet sheet = wb.createSheet(sheetName);
// 声明样式
HSSFCellStyle style = wb.createCellStyle();
// 居中显示
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 在sheet里创建第一行为表头,参数为行索引(excel的行),可以是0~65535之间的任何一个
HSSFRow rowHeader = sheet.createRow(0);
// 创建单元格并设置单元格内容 // 存储属性信息
Map<String, String> attMap = new HashMap();
int index = 0; for (String key : keyList) {
rowHeader.createCell(index).setCellValue(key);
attMap.put(Integer.toString(index), map.get(key).toString());
index++;
} // 在sheet里创建表头下的数据
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
HSSFRow row = sheet.createRow(i + 1);
for (int j = 0; j < map.size(); j++) { Class<?> attrType = BeanUtils.findPropertyType(attMap.get(Integer.toString(j)),
new Class[] { obj.getClass() }); Object value = getAttrVal(list.get(i), attMap.get(Integer.toString(j)), attrType);
if (null == value) {
value = "";
}
row.createCell(j).setCellValue(value.toString());
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
}
}
// 输出Excel文件
try {
if(sheetNum == pageNum || pageNum == 0){
wb.write(outputStream);
outputStream.close();
}
} catch (FileNotFoundException e) {
throw new FileNotFoundException("导出失败!" + e);
} catch (IOException e) {
throw new IOException("导出失败!" + e);
} } /**
* String类型日期转为Date类型
*
* @param dateStr
* @return
* @throws ParseException
* @throws Exception
*/
public static Date dateConvertFormat(String dateStr) throws ParseException {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
date = format.parse(dateStr);
return date;
}
} 调用封装工具类
public static final int page_size = 10000;
@PostMapping("queryUnusedGasListExcel")
public byte[] queryUnusedGasListExcel(@RequestBody UnusedGasDTO unusedGasDTO) throws Exception{
byte[] bytes = null;
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
int list_count = unusedGasService.findCountList(unusedGasDTO);
// 根据行数求数据提取次数
int export_times = list_count % page_size > 0 ? list_count / page_size
+ 1 : list_count / page_size;
// 创建HSSFWorkbook对象(excel的文档对象)
HSSFWorkbook wb = new HSSFWorkbook();
for (int j = 0; j < export_times; j++) {
unusedGasDTO.setPositionNum(j*page_size);
unusedGasDTO.setShowNum(page_size);
List<UnusedGasVO> list = unusedGasService.downLoadByList(unusedGasDTO);
int len = list.size() < page_size ? list.size() : page_size;
String keyValue = "客户名称:customerName,房产名称:houseName,表钢号:meterCode,余额(元):balance,表底数:meterBase,未用气天数:unusedGasDays,客户类型编码:customerCode,联系方式:customerTel,表型名称:metersTypeName,合约号:contractNum," +
"集团id:groupId,集团编码:groupName,公司id:companyId,公司编码:companyCode,公司名称:companyName," +
"客户电话:customerTel,房产编码:houseCode,表型编码:meterType,未用气天数时间:unusedGasTime";
//HSSFWorkbook ;j+1 sheet当前页; export_times sheet总页数
/**
* HSSFWorkbook
* outputStream流
* 根据反射获取实体类,并且赋值
* list 查询到的实体集合
* classPath list 中实体的路径,反射用到
* j+1 要写入sheet的页数
* 重新查询数据的次数
*/
ExcelUtils.exportExcel(wb,byteArrayOutputStream, keyValue, list, "cn.enn.chaoscloud.domain.archives.meter.vo.UnusedGasVO", j+1,export_times);
}
bytes = byteArrayOutputStream.toByteArray();
}catch (Exception e){
log.error(e.getMessage(), e);
}
return bytes;
}
工具类--Excel 导出poi的更多相关文章
- C#常用工具类——Excel操作类
/// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...
- C#常用工具类——Excel操作类(ZT)
本文转载于: http://www.cnblogs.com/zfanlong1314/p/3916047.html /// 常用工具类——Excel操作类 /// <para> ----- ...
- .NET开发工具之Excel导出公共类
来源:Pino晨 链接:cnblogs.com/chenxygx/p/5954870.html 说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Ex ...
- 使用hutool工具类进行导出
引入依赖为: <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</ ...
- java工具类-excel jxl
jxl-2.6.9.14.jarimport net.sf.jxls.transformer.XLSTransformer;//jxls-core-1.0.2.jarimport java.io.Fi ...
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布
Excel和Word 简易工具类,JEasyPoi 2.1.5 版本发布 摘要: jeasypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导 ...
- Excel解析easyexcel工具类
Excel解析easyexcel工具类 easyexcel解决POI解析Excel出现OOM <!-- https://mvnrepository.com/artifact/com.alibab ...
- Java导出防止小数显示不全工具类
1.说明 在做项目的过程中,发现导出功能中的数据显示不全,如"0.4",会显示成".4":"-0.8"会显示成"-.8" ...
随机推荐
- 【Windows、SVN】在Windows服务器下安装SVN,并在客户端能维护代码版本
1.分别在客户端和服务器端安装软件 在网上搜索一下安装包的下载地址(这里暂不介绍) 得到2个安装文件 Server是装在服务器端的,另外一个装在客户端 2.安装SVN服务器端 基本一致下一步即可 特殊 ...
- 20175213 2018-2019-2 《Java程序设计》第10周学习总结
Java内存模型 主内存与工作内存 Java内存模型主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量(Variable)与Java编程中 ...
- vue 自定义指令(directive)实例
一.内置指令 1.v-bind:响应并更新DOM特性:例如:v-bind:href v-bind:class v-bind:title v-bind:bb 2.v-on:用于监听DOM事件: 例 ...
- Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试
文章目录 服务器集群搭建 Nginx---->php-fpm之间的优化 302机器 202机器 压力测试 搭建memcached.mysql(数据准备) 今晚就动手-.- 集群性能测试 服务器集 ...
- C++——迭代器
除了每个容器定义的迭代器外,iterator库内还定义了其他的迭代器. 1.插入迭代器:向容器中插入元素 1.1 back_inserter 1.2 front_inserter 1.3 insert ...
- vue实现轮播效果
vue实现轮播效果 效果如下:(不好意思,图有点大:) 功能:点击左侧图片,右侧出现相应的图片:同时左侧边框变颜色. 代码如下:(也可以直接下载文件) <!DOCTYPE html> &l ...
- Java继承方法隐藏(覆盖)
方法隐藏 一个类从其超类继承所有非私有静态方法.在子类中重新定义继承的静态方法称为方法隐藏.子类中的重定义静态方法隐藏其超类的静态方法.在类中重定义非静态方法称为方法覆盖.关于方法隐藏的重定义方法(名 ...
- PHP 图片裁切
PHP CLASS TO CREATE IMAGE THUMBANILS Some years ago, I wrote a PHP class to create image thumbnails ...
- springboot核心原理
1.基于你对springboot的理解描述一下什么是springboot 它是一个服务于spring框架的框架,能够简化配置文件,快速构建web应用, 内置tomcat,无需打包部署,直接运行. 2. ...
- python-装饰器初识,闭包
函数名的运⽤, 第⼀类对象 ⼀. 函数名的运⽤. 函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量 1. 函数名的内存地址 def func(): print("呵呵 ...