java 中Excel 工具类,利用了java自带的导出

9 篇文章 1 订阅

注解:
@JsonInclude(JsonInclude.Include.NON_NULL) :前端要求空对象不返回给前端;

@ExcelField(title =“次数”,align =1,sort =2):导出返回的对象必加:列名;align:居中显示;sort:导出顺序;

DTO:

package com.unisound.iot.smart.dao.model;

import com.fasterxml.jackson.annotation.JsonIgnore;

import com.fasterxml.jackson.annotation.JsonInclude;

import com.unisound.iot.smart.common.utils.ExcelField;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.ToString;

import org.springframework.data.annotation.Id;

import org.springframework.data.mongodb.core.mapping.Document;

/**

* 敏感词统计查询

*

* @author lht

*/

@Document(collection ="sensitive_count_stat")

@Data

@NoArgsConstructor

@ToString

@AllArgsConstructor

@JsonInclude(JsonInclude.Include.NON_NULL)

public class SensitiveCountStat {

    @ExcelField(title ="次数",align =1,sort =2)

    Integer total;

    @ExcelField(title ="敏感词",align =1,sort =1)

    String sw;

    }

接口:

@ApiOperation(value ="导出敏感词")

  @GetMapping("exportSensitiveWordStat")

  public Result exportSensitiveWordStat(@RequestBody SensitiveWordStatParam param,

                                        HttpServletRequest request, HttpServletResponse response) throws Exception {

      Result<List<SensitiveCountStat>> listResult = sensitiveWordStat(param);

      if (ErrorCodeEnum.SUCCESS.getCode().equals(listResult.getErrorCode())){

          return Result.error(ErrorCodeEnum.SYSTEM_ERROR);

      }

      try {

          List<SensitiveCountStat> list =listResult.getResult();

          ExportExcel excel =new ExportExcel("", ProductDO.class);

          excel.setDataList(list);

          String fileName =UUIDGenerator.generateCommonUUID() +".xlsx";

          excel.write(response, fileName).dispose();

      }catch (IOException e) {

          log.error("导出敏感词异常。敏感词数据:{},传参:{}",listResult,param);

          throw new Exception("导出异常");

      }

      return Result.success(ErrorCodeEnum.SUCCESS);

  }

工具类:

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.Collections;

import java.util.Comparator;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;

import org.apache.poi.hssf.usermodel.DVConstraint;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.CellStyle;

import org.apache.poi.ss.usermodel.Comment;

import org.apache.poi.ss.usermodel.DataFormat;

import org.apache.poi.ss.usermodel.DataValidation;

import org.apache.poi.ss.usermodel.DataValidationConstraint;

import org.apache.poi.ss.usermodel.DataValidationHelper;

import org.apache.poi.ss.usermodel.Font;

import org.apache.poi.ss.usermodel.IndexedColors;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.ss.util.CellRangeAddress;

import org.apache.poi.ss.util.CellRangeAddressList;

import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import org.apache.poi.xssf.usermodel.XSSFClientAnchor;

import org.apache.poi.xssf.usermodel.XSSFDataValidation;

import org.apache.poi.xssf.usermodel.XSSFRichTextString;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

import com.unisound.iot.smart.common.utils.DictUtils;

import com.unisound.iot.smart.common.utils.Encodes;

import com.unisound.iot.smart.common.utils.ExcelField;

import com.unisound.iot.smart.common.utils.Reflections;

/**

* 导出Excel文件(导出“XLSX”格式,支持大数据量导出  @see org.apache.poi.ss.SpreadsheetVersion)

* @author

* @version 2013-04-21

*/

public class ExportExcel {

  private static Logger log =LoggerFactory.getLogger(ExportExcel.class);

  /**

    * 工作薄对象

    */

  private SXSSFWorkbook wb;

  /**

    * 工作表对象

    */

  private Sheet sheet;

  /**

    * 样式列表

    */

  private Map<String, CellStyle> styles;

  /**

    * 当前行号

    */

  private int rownum;

  /**

    * 注解列表(Object[]{ ExcelField, Field/Method })

    */

  List<Object[]> annotationList =Lists.newArrayList();

  /**

    * 构造函数

    * @param title 表格标题,传“空值”,表示无标题

    * @param cls 实体对象,通过annotation.ExportField获取标题

    */

  public ExportExcel(String title, Class<?> cls){

      this(title, cls, 1);

  }

  /**

    * 构造函数

    * @param title 表格标题,传“空值”,表示无标题

    * @param cls 实体对象,通过annotation.ExportField获取标题

    * @param type 导出类型(1:导出数据;2:导出模板)

    * @param groups 导入分组

    */

  public ExportExcel(String title, Class<?> cls, int type, int...groups){

      // Get annotation field

      Field[] fs =cls.getDeclaredFields();

      for (Field f :fs){

        ExcelField ef =f.getAnnotation(ExcelField.class);

        if (ef !=null &&(ef.type()==0 ||ef.type()==type)){

            if (groups!=null &&groups.length>0){

              boolean inGroup =false;

              for (int g :groups){

                  if (inGroup){

                    break;

                  }

                  for (int efg :ef.groups()){

                    if (g ==efg){

                        inGroup =true;

                        annotationList.add(new Object[]{ef, f});

                        break;

                    }

}

}

            }else{

              annotationList.add(new Object[]{ef, f});

            }

}

}

      // Get annotation method

      Method[] ms =cls.getDeclaredMethods();

      for (Method m :ms){

        ExcelField ef =m.getAnnotation(ExcelField.class);

        if (ef !=null &&(ef.type()==0 ||ef.type()==type)){

            if (groups!=null &&groups.length>0){

              boolean inGroup =false;

              for (int g :groups){

                  if (inGroup){

                    break;

                  }

                  for (int efg :ef.groups()){

                    if (g ==efg){

                        inGroup =true;

                        annotationList.add(new Object[]{ef, m});

                        break;

                    }

}

}

            }else{

              annotationList.add(new Object[]{ef, m});

            }

}

}

      // Field sorting

      Collections.sort(annotationList, new Comparator<Object[]>() {

        public int compare(Object[] o1, Object[] o2) {

            return new Integer(((ExcelField)o1[0]).sort()).compareTo(

                  new Integer(((ExcelField)o2[0]).sort()));

        };

      });

      // Initialize

      List<String> headerList =Lists.newArrayList();

      for (Object[] os :annotationList){

        String t =((ExcelField)os[0]).title();

        // 如果是导出,则去掉注释

        if (type==1){

            String[] ss =StringUtils.split(t, "**", 2);

            if (ss.length==2){

              t =ss[0];

            }

}

        headerList.add(t);

      }

      initialize(title, headerList);

  }

  /**

    * 构造函数

    * @param title 表格标题,传“空值”,表示无标题

    * @param headers 表头数组

    */

  public ExportExcel(String title, String[] headers) {

      initialize(title, Lists.newArrayList(headers));

  }

  /**

    * 构造函数

    * @param title 表格标题,传“空值”,表示无标题

    * @param headerList 表头列表

    */

  public ExportExcel(String title, List<String> headerList) {

      initialize(title, headerList);

  }

  /**

    * 初始化函数

    * @param title 表格标题,传“空值”,表示无标题

    * @param headerList 表头列表

    */

  private void initialize(String title, List<String> headerList) {

      this.wb =new SXSSFWorkbook(500);

      this.sheet =wb.createSheet("Export");

      this.styles = createStyles(wb);

      // Create title

      if (StringUtils.isNotBlank(title)){

        Row titleRow =sheet.createRow(rownum++);

        titleRow.setHeightInPoints(30);

        Cell titleCell =titleRow.createCell(0);

        titleCell.setCellStyle(styles.get("title"));

        titleCell.setCellValue(title);

        sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(),

              titleRow.getRowNum(), titleRow.getRowNum(), headerList.size()-1));

      }

      // Create header

      if (headerList ==null){

        throw new RuntimeException("headerList not null!");

      }

      Row headerRow =sheet.createRow(rownum++);

      headerRow.setHeightInPoints(16);

      for (int i =0; i

        Cell cell =headerRow.createCell(i);

        //当存在*时设置红色必填字体

        if(headerList.get(i).contains("*")) {

          cell.setCellStyle(styles.get("redHeader"));

        }else {

          cell.setCellStyle(styles.get("header"));

        }

        String[] ss =StringUtils.split(headerList.get(i), "**", 2);

        if (ss.length==2){

            cell.setCellValue(ss[0]);

            Comment comment =this.sheet.createDrawingPatriarch().createCellComment(

                  new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));

            comment.setString(new XSSFRichTextString(ss[1]));

            cell.setCellComment(comment);

        }else{

            cell.setCellValue(headerList.get(i));

        }

        //sheet.autoSizeColumn(i);

      }

      for (int i =0; i

        int colWidth =sheet.getColumnWidth(i)*2;

          sheet.setColumnWidth(i, colWidth <3000 ?3000 :colWidth);

      }

      log.debug("Initialize success.");

  }

  /**

    * 创建表格样式

    * @param wb 工作薄对象

    * @return 样式列表

    */

  private Map<String, CellStyle> createStyles(Workbook wb) {

      Map<String, CellStyle> styles =new HashMap<String, CellStyle>();

      CellStyle style =wb.createCellStyle();

      style.setAlignment(CellStyle.ALIGN_CENTER);

      style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

      Font titleFont =wb.createFont();

      titleFont.setFontName("Arial");

      titleFont.setFontHeightInPoints((short) 16);

      titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);

      style.setFont(titleFont);

      styles.put("title", style);

      style =wb.createCellStyle();

      style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

      style.setBorderRight(CellStyle.BORDER_THIN);

      style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

      style.setBorderLeft(CellStyle.BORDER_THIN);

      style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

      style.setBorderTop(CellStyle.BORDER_THIN);

      style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

      style.setBorderBottom(CellStyle.BORDER_THIN);

      style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());

      Font dataFont =wb.createFont();

      dataFont.setFontName("Arial");

      dataFont.setFontHeightInPoints((short) 10);

      style.setFont(dataFont);

      styles.put("data", style);

      style =wb.createCellStyle();

      style.cloneStyleFrom(styles.get("data"));

      style.setAlignment(CellStyle.ALIGN_LEFT);

      styles.put("data1", style);

      style =wb.createCellStyle();

      style.cloneStyleFrom(styles.get("data"));

      style.setAlignment(CellStyle.ALIGN_CENTER);

      styles.put("data2", style);

      style =wb.createCellStyle();

      style.cloneStyleFrom(styles.get("data"));

      style.setAlignment(CellStyle.ALIGN_RIGHT);

      styles.put("data3", style);

      style =wb.createCellStyle();

      style.cloneStyleFrom(styles.get("data"));

//    style.setWrapText(true);

      style.setAlignment(CellStyle.ALIGN_CENTER);

      style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());

      style.setFillPattern(CellStyle.SOLID_FOREGROUND);

      Font headerFont =wb.createFont();

      headerFont.setFontName("Arial");

      headerFont.setFontHeightInPoints((short) 10);

      headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);

      headerFont.setColor(IndexedColors.WHITE.getIndex());

      style.setFont(headerFont);

      styles.put("header", style);

      style =wb.createCellStyle();

      style.cloneStyleFrom(styles.get("data"));

//    style.setWrapText(true);

      style.setAlignment(CellStyle.ALIGN_CENTER);

      style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());

      style.setFillPattern(CellStyle.SOLID_FOREGROUND);

      Font headerRedFont =wb.createFont();

      headerRedFont.setFontName("Arial");

      headerRedFont.setFontHeightInPoints((short) 10);

      headerRedFont.setBoldweight(Font.BOLDWEIGHT_BOLD);

      headerRedFont.setColor(IndexedColors.RED.getIndex());//红色字体

      style.setFont(headerRedFont);

      styles.put("redHeader", style);

      //新增的四句话,设置CELL格式为文本格式

      style =wb.createCellStyle();

      style.cloneStyleFrom(styles.get("data2"));

        DataFormat format =wb.createDataFormat();

        style.setDataFormat(format.getFormat("@"));

        styles.put("StringText", style);

      return styles;

  }

  /**

    * 添加一行

    * @return 行对象

    */

  public Row addRow(){

      return sheet.createRow(rownum++);

  }

  /**

    * 添加一个单元格

    * @param row 添加的行

    * @param column 添加列号

    * @param val 添加值

    * @return 单元格对象

    */

  public Cell addCell(Row row, int column, Object val){

      return this.addCell(row, column, val, 0, Class.class);

  }

  /**

    * 添加一个单元格

    * @param row 添加的行

    * @param column 添加列号

    * @param val 添加值

    * @param align 对齐方式(1:靠左;2:居中;3:靠右)

    * @return 单元格对象

    */

  public Cell addCell(Row row, int column, Object val, int align, Class<?> fieldType){

      Cell cell =row.createCell(column);

      CellStyle style =styles.get("data"+(align>=1&&align<=3?align:""));

      try {

        if (val ==null){

            cell.setCellValue("");

        } else if (val instanceof String) {

            cell.setCellValue((String) val);

        } else if (val instanceof Integer) {

            cell.setCellValue((Integer) val);

        } else if (val instanceof Long) {

            cell.setCellStyle(styles.get("StringText"));

            cell.setCellValue((String) val);

            cell.setCellType(HSSFCell.CELL_TYPE_STRING);

        } else if (val instanceof Double) {

            cell.setCellValue((Double) val);

        } else if (val instanceof Float) {

            cell.setCellValue((Float) val);

        } else if (val instanceof Date) {

            DataFormat format =wb.createDataFormat();

              style.setDataFormat(format.getFormat("yyyy-MM-dd"));

            cell.setCellValue((Date) val);

        } else {

            if (fieldType !=Class.class){

              cell.setCellValue((String)fieldType.getMethod("setValue", Object.class).invoke(null, val));

            }else{

              cell.setCellValue((String)Class.forName(this.getClass().getName().replaceAll(this.getClass().getSimpleName(),

                  "fieldtype."+val.getClass().getSimpleName()+"Type")).getMethod("setValue", Object.class).invoke(null, val));

            }

}

      } catch (Exception ex) {

        log.error("Set cell value ["+row.getRowNum()+","+column+"] error: " +ex.toString());

        cell.setCellValue("");

      }

      cell.setCellStyle(style);

      return cell;

  }

  /**

    * 添加数据(通过annotation.ExportField添加数据)

    * @return list 数据列表

    */

  public <E> ExportExcel setDataList(List<E> list){

      for (E e :list){

        int colunm =0;

        Row row =this.addRow();

        StringBuilder sb =new StringBuilder();

        for (Object[] os :annotationList){

            ExcelField ef =(ExcelField)os[0];

            Object val =null;

            // Get entity value

            try{

              if (StringUtils.isNotBlank(ef.value())){

                  val =Reflections.invokeGetter(e, ef.value());

              }else{

                  if (os[1] instanceof Field){

                    val =Reflections.invokeGetter(e, ((Field)os[1]).getName());

                  }else if (os[1] instanceof Method){

                    val =Reflections.invokeMethod(e, ((Method)os[1]).getName(), new Class[] {}, new Object[] {});

                  }

}

              // If is dict, get dict label

              if (StringUtils.isNotBlank(ef.dictType())){

                  val =DictUtils.getDictLabel(val==null?"":val.toString(), ef.dictType(), "");

              }

            }catch(Exception ex) {

              // Failure to ignore

              log.info(ex.toString());

              val ="";

            }

            this.addCell(row, colunm++, val, ef.align(), ef.fieldType());

            sb.append(val +", ");

        }

        log.debug("Write success: ["+row.getRowNum()+"] "+sb.toString());

      }

      return this;

  }

    /**

      * 添加列数据验证

    * @param dataSource

    * @param col

    */

  public void addDataValidationDropDownList(String[] dataSource, int col) {

      sheet.addValidationData(this.createDataValidation(sheet, dataSource, col));

  }

      /**

    * 添加整型验证

    * @param dataSource

    * @param col

    */

  public void addDataValidationInteger(int col,Integer  start,Integer end) {

      sheet.addValidationData(this.CreateDataValidationForInteger(sheet, col,start,end));

  }

      /**

    * 添加整型验证

    * @param dataSource

    * @param col

    */

  public void addDataValidationDecimal(int col,Double  start,Double end) {

      sheet.addValidationData(this.CreateDataValidationForDecimal(sheet, col,start,end));

  }

  /**

    * excel添加下拉数据校验

    * @param sheet 哪个 sheet 页添加校验

    * @param dataSource 数据源数组

    * @param col 第几列校验(0开始)

    * @return

    */

    public  DataValidation createDataValidation(Sheet sheet, String[] dataSource, int col) {

        CellRangeAddressList cellRangeAddressList =new CellRangeAddressList(1, 65535, col, col);

        DataValidationHelper helper =sheet.getDataValidationHelper();

        DataValidationConstraint constraint =helper.createExplicitListConstraint(dataSource);

        DataValidation dataValidation =helper.createValidation(constraint, cellRangeAddressList);

        //处理Excel兼容性问题

        if (dataValidation instanceof XSSFDataValidation) {

            dataValidation.setSuppressDropDownArrow(true);

            dataValidation.setShowErrorBox(true);

        } else {

            dataValidation.setSuppressDropDownArrow(false);

        }

        dataValidation.setEmptyCellAllowed(true);

        dataValidation.setShowPromptBox(true);

        dataValidation.createPromptBox("提示", "只能选择下拉框里面的数据");

        return dataValidation;

    }

    /**

      * 填写整型数据

    * @param sheet

    * @param dataSource

    * @param col

    * @return

    */

    public DataValidation CreateDataValidationForInteger(Sheet sheet, int col,Integer  start,Integer end) {

      CellRangeAddressList dstAddrList2 =new CellRangeAddressList(1, 65535, col,col);// 规则二单元格范围

      DataValidationHelper helper =sheet.getDataValidationHelper();

        DataValidationConstraint dvc =helper.createNumericConstraint(DVConstraint.ValidationType.INTEGER,

                DVConstraint.OperatorType.BETWEEN, start+"", end+"");

        DataValidation dataValidation =helper.createValidation(dvc, dstAddrList2);

        dataValidation.createErrorBox("请填写正确整型数字!", "请填写正确整型数字!");

        dataValidation.setEmptyCellAllowed(false);

        dataValidation.setShowErrorBox(true);

        //sheet.addValidationData(dataValidation);

        return dataValidation;

    }

    /**

    * 填写浮点型

    * @param sheet

    * @param dataSource

    * @param col

    * @return

    */

  public DataValidation CreateDataValidationForDecimal(Sheet sheet, int col,Double  start,Double end) {

      CellRangeAddressList dstAddrList2 =new CellRangeAddressList(1, 65535, col,col);// 规则二单元格范围

      DataValidationHelper helper =sheet.getDataValidationHelper();

      DataValidationConstraint dvc =helper.createNumericConstraint(DVConstraint.ValidationType.DECIMAL,

              DVConstraint.OperatorType.BETWEEN, start+"", end+"");

      DataValidation dataValidation =helper.createValidation(dvc, dstAddrList2);

      dataValidation.createErrorBox("请填写正确数字!", "请填写正确数字!");

      dataValidation.setEmptyCellAllowed(false);

      dataValidation.setShowErrorBox(true);

      //sheet.addValidationData(dataValidation);

      return dataValidation;

  }

  /**

    * 输出数据流

    * @param os 输出数据流

    */

  public ExportExcel write(OutputStream os) throws IOException{

      wb.write(os);

      return this;

  }

  /**

    * 输出到客户端

    * @param fileName 输出文件名

    */

  public ExportExcel write(HttpServletResponse response, String fileName) throws IOException{

      response.reset();

        response.setContentType("application/octet-stream; charset=utf-8");

        response.setHeader("Content-Disposition", "attachment; filename="+Encodes.urlEncode(fileName));

      write(response.getOutputStream());

      return this;

  }

  /**

    * 输出到文件

    * @param fileName 输出文件名

    */

  public ExportExcel writeFile(String name) throws FileNotFoundException, IOException{

      FileOutputStream os =new FileOutputStream(name);

      this.write(os);

      return this;

  }

  /**

    * 清理临时文件

    */

  public ExportExcel dispose(){

      wb.dispose();

      return this;

  }
// /**

//  * 导出测试

//  */

// public static void main(String[] args) throws Throwable {

//

//    List headerList = Lists.newArrayList();

//    for (int i = 1; i <= 10; i++) {

//      headerList.add("表头"+i);

//    }

//

//    List dataRowList = Lists.newArrayList();

//    for (int i = 1; i <= headerList.size(); i++) {

//      dataRowList.add("数据"+i);

//    }

//

//    List> dataList = Lists.newArrayList();

//    for (int i = 1; i <=1000000; i++) {

//      dataList.add(dataRowList);

//    }

//

//    ExportExcel ee = new ExportExcel("表格标题", headerList);

//

//    for (int i = 0; i < dataList.size(); i++) {

//      Row row = ee.addRow();

//      for (int j = 0; j < dataList.get(i).size(); j++) {

//          ee.addCell(row, j, dataList.get(i).get(j));

//      }

//    }

//

//    ee.writeFile("target/export.xlsx");

//

//    ee.dispose();

//

//    log.debug("Export success.");

//

// }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你可以叫我老白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值