@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.");
//
// }
}