zoukankan      html  css  js  c++  java
  • 工具类--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;
    }
  • 相关阅读:
    ? 这是个很好的问题。Go 当前的 GC 显然做了一些额外的工作,但它也跟其他的工作并行执行,所以在具有备用 CPU 的系统上,Go 正在作出合理的选择。请看 https://golang.org/issue/17969 结束语(Closing notes) 通过研究 Go 垃圾收集器,我能够理解 Go GC 当前结构的背景以及它如何克服它的弱点。Go发展得非常快。如果你对 Go感兴趣,最好继
    Kombu is a messaging library for Python.
    pencil
    io loop select
    gevent 缺点
    pyopenssl
    秒杀系统“减库存”设计的核心逻辑
    Gokit微服务-服务链路追踪
    Go 代码审查建议
    Visual Studio Team Systems
  • 原文地址:https://www.cnblogs.com/tieandxiao/p/10930754.html
Copyright © 2011-2022 走看看