• java 导出Excel


    package com.yicheejia.common.utils.file;

    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.lang.reflect.Field;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map.Entry;

    import javax.servlet.http.HttpServletResponse;

    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    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.hssf.util.HSSFColor;

    public class ExcelUtil { /**
    * 导出Excel 设置列宽sheet.setColumnWidth(0, 256*width+184);
    * @author 梁占豪
    * @param excelName 要导出的excel名称
    * @param list 要导出的数据集合
    * @param fieldMap 中英文字段对应Map,即要导出的excel表头
    * @param response 使用response可以导出到浏览器
    * @return
    */
    public static <T> void export(String excelName,List<T> list,LinkedHashMap<String, String> fieldMap,HttpServletResponse response){

    // 设置默认文件名为当前时间:年月日时分秒
    if (excelName==null || excelName=="") {
    excelName = new SimpleDateFormat("yyyyMMddhhmmss").format(
    new Date()).toString();
    }
    // 设置response头信息
    response.reset();
    response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件
    try {
    response.setHeader("Content-disposition", "attachment; filename="
    +new String(excelName.getBytes("gb2312"), "ISO-8859-1") + ".xls");
    } catch (UnsupportedEncodingException e1) {
    System.out.println(e1.getMessage());
    }

    try {
    //创建一个WorkBook,对应一个Excel文件
    HSSFWorkbook wb=new HSSFWorkbook();
    //在Workbook中,创建一个sheet,对应Excel中的工作薄(sheet)
    HSSFSheet sheet=wb.createSheet(excelName);

    //创建单元格,并设置值表头 设置表头居中
    HSSFCellStyle style=wb.createCellStyle();

    //字体
    HSSFFont font = wb.createFont();
    font.setFontName("仿宋_GB2312");
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示
    font.setFontHeightInPoints((short) 12);

    //设置颜色
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//前景颜色
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//填充方式,前色填充
    //边框填充
    style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
    style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
    style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    style.setFont(font);
    style.setWrapText(false);


    //创建一个居中格式
    //style.setAlignment(HSSFCellStyle.s);
    // 填充工作表
    fillSheet(sheet,list,fieldMap,style);

    //将文件输出
    OutputStream ouputStream = response.getOutputStream();
    wb.write(ouputStream);
    ouputStream.flush();
    ouputStream.close();
    } catch (Exception e) {
    System.out.println("导出Excel失败!");
    System.out.println(e.getMessage());
    }
    }

    /**
    * 根据字段名获取字段对象
    *
    * @param fieldName
    * 字段名
    * @param clazz
    * 包含该字段的类
    * @return 字段
    */
    public static Field getFieldByName(String fieldName, Class<?> clazz) {
    System.out.println("根据字段名获取字段对象:getFieldByName()");
    // 拿到本类的所有字段
    Field[] selfFields = clazz.getDeclaredFields();

    // 如果本类中存在该字段,则返回
    for (Field field : selfFields) {
    //如果本类中存在该字段,则返回
    if (field.getName().equals(fieldName)) {
    return field;
    }
    }

    // 否则,查看父类中是否存在此字段,如果有则返回
    Class<?> superClazz = clazz.getSuperclass();
    if (superClazz != null && superClazz != Object.class) {
    //递归
    return getFieldByName(fieldName, superClazz);
    }

    // 如果本类和父类都没有,则返回空
    return null;
    }

    /**
    * 根据字段名获取字段值
    *
    * @param fieldName 字段名
    * @param o 对象
    * @return 字段值
    * @throws Exception 异常
    *
    */
    public static Object getFieldValueByName(String fieldName, Object o)
    throws Exception {

    System.out.println("根据字段名获取字段值:getFieldValueByName()");
    Object value = null;
    //根据字段名得到字段对象
    Field field = getFieldByName(fieldName, o.getClass());

    //如果该字段存在,则取出该字段的值
    if (field != null) {
    field.setAccessible(true);//类中的成员变量为private,在类外边使用属性值,故必须进行此操作
    value = field.get(o);//获取当前对象中当前Field的value
    } else {
    throw new Exception(o.getClass().getSimpleName() + "类不存在字段名 "
    + fieldName);
    }

    return value;
    }

    /**
    * 根据带路径或不带路径的属性名获取属性值,即接受简单属性名,
    * 如userName等,又接受带路径的属性名,如student.department.name等
    *
    * @param fieldNameSequence 带路径的属性名或简单属性名
    * @param o 对象
    * @return 属性值
    * @throws Exception 异常
    *
    */
    public static Object getFieldValueByNameSequence(String fieldNameSequence,
    Object o) throws Exception {
    System.out.println("根据带路径或不带路径的属性名获取属性值,即接受简单属性名:getFieldValueByNameSequence()");
    Object value = null;

    // 将fieldNameSequence进行拆分
    String[] attributes = fieldNameSequence.split("\.");
    if (attributes.length == 1) {

    value = getFieldValueByName(fieldNameSequence, o);
    //用来判断是否为时间格式
    if(value instanceof Date){
    Date time=(Date) value;
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    String sDate=sdf.format(time);
    value=sDate;
    }
    } else {
    // 根据数组中第一个连接属性名获取连接属性对象,如student.department.name
    Object fieldObj = getFieldValueByName(attributes[0], o);
    //截取除第一个属性名之后的路径
    String subFieldNameSequence = fieldNameSequence
    .substring(fieldNameSequence.indexOf(".") + 1);
    //递归得到最终的属性对象的值
    value = getFieldValueByNameSequence(subFieldNameSequence, fieldObj);
    }
    return value;

    }

    /**
    * 向工作表中填充数据
    *
    * @param sheet
    * excel的工作表名称
    * @param list
    * 数据源
    * @param fieldMap
    * 中英文字段对应关系的Map
    * @param style
    * 表格中的格式
    * @throws Exception
    * 异常
    *
    */
    public static <T> void fillSheet(HSSFSheet sheet, List<T> list,
    LinkedHashMap<String, String> fieldMap,HSSFCellStyle style) throws Exception {
    System.out.println("向工作表中填充数据:fillSheet()");
    // 定义存放英文字段名和中文字段名的数组
    String[] enFields = new String[fieldMap.size()];
    String[] cnFields = new String[fieldMap.size()];

    // 填充数组
    int count = 0;
    for (Entry<String, String> entry : fieldMap.entrySet()) {
    enFields[count] = entry.getKey();
    cnFields[count] = entry.getValue();
    count++;
    }

    //在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
    HSSFRow row=sheet.createRow((int)0);

    // 填充表头
    for (int i = 0; i < cnFields.length; i++) {
    HSSFCell cell=row.createCell(i);
    cell.setCellValue(cnFields[i]);
    cell.setCellStyle(style);
    sheet.autoSizeColumn(i);
    }

    // 填充内容
    for (int index = 0; index < list.size(); index++) {
    row = sheet.createRow(index + 1);
    // 获取单个对象
    T item = list.get(index);
    for (int i = 0; i < enFields.length; i++) {
    Object objValue = getFieldValueByNameSequence(enFields[i], item);
    String fieldValue = objValue == null ? "" : objValue.toString();

    row.createCell(i).setCellValue(fieldValue);
    }
    }
    //设置自适应列宽
    for(int i = 0; i < cnFields.length; i++){
    sheet.autoSizeColumn(i);
    }

    }

    }

    controller层调用方法

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    public void checkExport(HttpServletRequest request, HttpServletResponse response,Integer[] ids){
    // String ids=request.getParameter("ids");
    List<Entity> userlList = Service.getDataForExcel(Arrays.asList(ids));
    LinkedHashMap<String, String> fieldMap = new LinkedHashMap<String, String>();
    fieldMap.put("","");
    fieldMap.put("","");
    fieldMap.put("","");
    String excelName = "";
    ExcelUtil.export(excelName, userlList, fieldMap, response);
    }

    依赖

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>${poi.version}</version>
    <exclusions>
    <exclusion>
    <artifactId>commons-codec</artifactId>
    <groupId>commons-codec</groupId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>${poi.version}</version>
    </dependency>

  • 相关阅读:
    分治算法
    【原创】KFold函数 __init__() got an unexpected keyword argument 'n_folds' or 'n_splits'
    【原创】【Mac】创建可以双击执行Shell脚本文件(类似windows批处理脚本)
    【原创】【Python】随机生成中文姓名
    【原创】【word】两步搞定姓名2个字加空格对齐
    数据结构与算法——冒泡排序及其各种优化变形详解
    CobaltStrike去除流量特征
    Fastjson1.2.24RCE漏洞复现
    Redis奇怪的姿势
    Apache Druid 远程代码执行 CVE-2021-25646 漏洞复现
  • 原文地址:https://www.cnblogs.com/sanhao/p/9299774.html
Copyright © 2020-2023  润新知