失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 工具类--Excel 导出poi

工具类--Excel 导出poi

时间:2024-05-30 16:30:37

相关推荐

工具类--Excel 导出poi

实现功能 --批量导出excel 文件,配置一个sheet多少条数据,根据查询数据量的多少确定生成几个sheet页。

pom 文件导入ExcelUtils工具包,依赖于poi包。

<!-- /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 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》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。