一個好用的導出工具類崭孤,java自帶的導出

@JsonInclude(JsonInclude.Include.NON_NULL) :前端要求空對象不返回給前端类嗤;

?@ExcelField(title ="次數(shù)",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;

/**

* 敏感詞統(tǒng)計查詢

*

* @author lht

*/

@Document(collection ="sensitive_count_stat")

@Data

@NoArgsConstructor

@ToString

@AllArgsConstructor

@JsonInclude(JsonInclude.Include.NON_NULL)

public class SensitiveCountStat {

? ? @ExcelField(title ="次數(shù)",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("導出敏感詞異常。敏感詞數(shù)據(jù):{},傳參:{}",listResult,param);

? ? ? ? ? throw new Exception("導出異常");

? ? ? }

? ? ? return Result.success(ErrorCodeEnum.SUCCESS);

? }

工具類:

package com.unisound.iot.smart.utils;

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”格式嗤形,支持大數(shù)據(jù)量導出? @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();

? /**

? ? * 構(gòu)造函數(shù)

? ? * @param title 表格標題精偿,傳“空值”,表示無標題

? ? * @param cls 實體對象赋兵,通過annotation.ExportField獲取標題

? ? */

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

? ? ? this(title, cls, 1);

? }

? /**

? ? * 構(gòu)造函數(shù)

? ? * @param title 表格標題笔咽,傳“空值”,表示無標題

? ? * @param cls 實體對象霹期,通過annotation.ExportField獲取標題

? ? * @param type 導出類型(1:導出數(shù)據(jù)叶组;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);

? }

? /**

? ? * 構(gòu)造函數(shù)

? ? * @param title 表格標題历造,傳“空值”甩十,表示無標題

? ? * @param headers 表頭數(shù)組

? ? */

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

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

? }

? /**

? ? * 構(gòu)造函數(shù)

? ? * @param title 表格標題,傳“空值”吭产,表示無標題

? ? * @param headerList 表頭列表

? ? */

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

? ? ? initialize(title, headerList);

? }

? /**

? ? * 初始化函數(shù)

? ? * @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.");

? }

? /**

? ? * 創(chuàng)建表格樣式

? ? * @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;

? }

? /**

? ? * 添加數(shù)據(jù)(通過annotation.ExportField添加數(shù)據(jù))

? ? * @return list 數(shù)據(jù)列表

? ? */

? 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;

? }

? ? /**

? ? ? * 添加列數(shù)據(jù)驗證

? ? * @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添加下拉數(shù)據(jù)校驗

? ? * @param sheet 哪個 sheet 頁添加校驗

? ? * @param dataSource 數(shù)據(jù)源數(shù)組

? ? * @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("提示", "只能選擇下拉框里面的數(shù)據(jù)");

? ? ? ? return dataValidation;

? ? }

? ? /**

? ? ? * 填寫整型數(shù)據(jù)

? ? * @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);// 規(guī)則二單元格范圍

? ? ? DataValidationHelper helper =sheet.getDataValidationHelper();

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

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

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

? ? ? ? dataValidation.createErrorBox("請?zhí)顚懻_整型數(shù)字荒典!", "請?zhí)顚懻_整型數(shù)字酪劫!");

? ? ? ? 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);// 規(guī)則二單元格范圍

? ? ? DataValidationHelper helper =sheet.getDataValidationHelper();

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

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

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

? ? ? dataValidation.createErrorBox("請?zhí)顚懻_數(shù)字!", "請?zhí)顚懻_數(shù)字寺董!");

? ? ? dataValidation.setEmptyCellAllowed(false);

? ? ? dataValidation.setShowErrorBox(true);

? ? ? //sheet.addValidationData(dataValidation);

? ? ? return dataValidation;

? }

? /**

? ? * 輸出數(shù)據(jù)流

? ? * @param os 輸出數(shù)據(jù)流

? ? */

? 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("數(shù)據(jù)"+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.");

//

// }

}


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末覆糟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遮咖,更是在濱河造成了極大的恐慌滩字,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件御吞,死亡現(xiàn)場離奇詭異麦箍,居然都是意外死亡,警方通過查閱死者的電腦和手機陶珠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門挟裂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揍诽,你說我怎么就攤上這事诀蓉±跏” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵渠啤,是天一觀的道長狐肢。 經(jīng)常有香客問我,道長沥曹,這世上最難降的妖魔是什么份名? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮架专,結(jié)果婚禮上同窘,老公的妹妹穿的比我還像新娘。我一直安慰自己部脚,他們只是感情好想邦,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著委刘,像睡著了一般丧没。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锡移,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天呕童,我揣著相機與錄音,去河邊找鬼淆珊。 笑死夺饲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的施符。 我是一名探鬼主播往声,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戳吝!你這毒婦竟也來了浩销?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤听哭,失蹤者是張志新(化名)和其女友劉穎慢洋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陆盘,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡普筹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了隘马。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片太防。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祟霍,靈堂內(nèi)的尸體忽然破棺而出杏头,到底是詐尸還是另有隱情,我是刑警寧澤沸呐,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布醇王,位于F島的核電站,受9級特大地震影響崭添,放射性物質(zhì)發(fā)生泄漏寓娩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一呼渣、第九天 我趴在偏房一處隱蔽的房頂上張望棘伴。 院中可真熱鬧,春花似錦屁置、人聲如沸焊夸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱穗。三九已至,卻和暖如春使鹅,著一層夾襖步出監(jiān)牢的瞬間揪阶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工患朱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲁僚,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓裁厅,卻偏偏與公主長得像冰沙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姐直,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容