zoukankan      html  css  js  c++  java
  • Java excel 导出 工具

      依赖:

    	<!-- excel 导出 -->
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi</artifactId>
    			<version>RELEASE</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml</artifactId>
    			<version>RELEASE</version>
    		</dependency>
    		
    

      

    核心类:

    package com.cy.common.utils;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    /**
     * excel 工具
     * 
     * @author Admin
     *
     */
    public class ExcelUtils {
    
    	@SuppressWarnings("resource")
    	public static <T> void httpDownload(HttpServletResponse response, String fileName,  List<String> fields, List<T> data) throws IOException {
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		HSSFSheet sheet = workbook.createSheet("sheet1");
    		
    		if( data == null ) {
    			data = new ArrayList<T>();
    		}
    		for(int i=0;i<data.size();i++) {
    			Object rowData = data.get(i);
    			if( rowData == null ) {
    				continue;
    			}
    			
    			Map<String, String>  map = BeanUtils.toFormatMap(rowData);
    			HSSFRow row = sheet.createRow(i);
    			for( int j=0;j<fields.size();j++ ) {
    				HSSFCell cell = row.createCell(j);
    				String value = map.get( fields.get( j ) );
    				cell.setCellValue( value==null?"":value );
    			}
    		}
    
    		response.setHeader("Content-Disposition","attachment;filename=" + new String( fileName.getBytes(), "iso-8859-1") + ".xlsx");
    		response.setContentType("application/vnd.ms-excel;fileName=");
    		ServletOutputStream out = response.getOutputStream();
    		workbook.write(out);
    	}
    	
    	
    	@SuppressWarnings("resource")
    	public static <T> void httpDownload(HttpServletResponse response, String fileName, List<String> titles , List<String> fields, List<T> data) throws IOException {
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		HSSFSheet sheet = workbook.createSheet("sheet1");
    		
    		if( data == null ) {
    			data = new ArrayList<T>();
    		}
    		
    		HSSFRow titleRow = sheet.createRow(0);
    		for( int j=0;j<titles.size();j++ ) {
    			HSSFCell cell = titleRow.createCell(j);
    			cell.setCellValue( titles.get(j) );
    		}
    		
    		for(int i=1;i<data.size();i++) {
    			Object rowData = data.get(i);
    			if( rowData == null ) {
    				continue;
    			}
    			
    			Map<String, String>  map = BeanUtils.toFormatMap(rowData);
    			HSSFRow row = sheet.createRow(i);
    			for( int j=0;j<fields.size();j++ ) {
    				HSSFCell cell = row.createCell(j);
    				String value = map.get( fields.get( j ) );
    				cell.setCellValue( value==null?"":value );
    			}
    		}
    		
    		response.setHeader("Content-Disposition","attachment;filename=" + new String( fileName.getBytes(), "iso-8859-1") + ".xlsx");
    		response.setContentType("application/vnd.ms-excel;fileName=");
    		ServletOutputStream out = response.getOutputStream();
    		workbook.write(out);
    	}
    
    	
    	
    	
    
    }
    

      

    使用到的 工具类:

    package com.cy.common.utils;
    
    import java.io.File;
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import com.github.pagehelper.Page;
    
    /**
     * bean的工具类
     * @author ZHANGYUKUN
     *
     */
    public class BeanUtils {
    
    	
    	private static Logger logger = LoggerFactory.getLogger(BeanUtils.class);
    	
    	/**
    	 * 复制一个对象到另一个对象,忽略null值字段
    	 * 
    	 * 
    	 * @param source
    	 * @param target
    	 * @param ignoreNull
    	 */
    	public static void copyProperties(Object source, Object target, Boolean ignoreNull) {
    		if( target == null ) {
    			return ;
    		} 
    		
    		if( source == null ) {
    			return ;
    		}
    		
    		if (!ignoreNull) {
    			org.springframework.beans.BeanUtils.copyProperties(source, target);
    		} else {
    			String[] ignoreFiled = getNullField(source);
    			org.springframework.beans.BeanUtils.copyProperties(source, target, ignoreFiled);
    		}
    
    	}
    	
    	public static void copyProperties(Object source, Object target) {
    		copyProperties(  source ,target ,false );
    	}
    	
    	/**
    	 * 创建并复制一个对象
    	 * @return
    	 * @throws InstantiationException
    	 * @throws IllegalAccessException
    	 */
    	public static <T> T copyNew(Object source, Class<T> targetCls) {
    		if( source == null  ) {
    			return null;
    		}
    		
    		T rt;
    		try {
    			rt = targetCls.getDeclaredConstructor().newInstance();
    		} catch (Exception e) {
    			e.printStackTrace();
    			return null;
    		}
    		org.springframework.beans.BeanUtils.copyProperties(source, rt);
    		return rt;
    	}
    	
    	/**
    	 * 复制信息到outList
    	 * 
    	 * @param list
    	 * @param cls
    	 * @return
    	 */
    	@SuppressWarnings("unchecked")
    	public static <T> List<T> copyToOutList(List<?> list, Class<T> cls) {
    		if( list == null ) {
    			return null;
    		}
    		List<T> rtList = null;
    		try {
    			rtList = list.getClass().getDeclaredConstructor().newInstance();
    			
    			if( list instanceof Page ) {
    				Page<Object> pageList = (Page<Object>) rtList;
    				Page<Object> temp = (Page<Object>) list;
    				pageList.setPageNum( temp.getPageNum() );
    				pageList.setPageSize( temp.getPageSize() );
    				pageList.setPages( temp.getPages() );
    				pageList.setTotal( temp.getTotal() );
    			}
    			
    			for( Object item :  list ) {
    				T rtItem =   cls.getDeclaredConstructor().newInstance();
    				BeanUtils.copyProperties( item  , rtItem , false );
    				rtList.add( rtItem );
    			}
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		return rtList;
    	}
    	
    	/**
    	 *复制分页信息
    	 *
    	 * @param source
    	 * @param target
    	 */
    	@SuppressWarnings("unused")
    	private static void copyPageList(Object source, Object target ) {
    		String[] ignoreFiled = new String[] {"result"};
    		org.springframework.beans.BeanUtils.copyProperties(source, target, ignoreFiled);
    	}
    
    	/**
    	 * 得到 值为null 的字段 (只找当前类,没找父类,因为我们的实体暂时没有继承关系)
    	 * 
    	 * @param source
    	 * @return
    	 */
    	public static String[] getNullField(Object source) {
    		List<String> fieldList = new ArrayList<>();
    		Field[] fields = source.getClass().getDeclaredFields();
    
    		for (Field field : fields) {
    			field.setAccessible(true);
    			try {
    				if (field.get(source) == null) {
    					fieldList.add(field.getName());
    				}
    			} catch (IllegalArgumentException | IllegalAccessException e) {
    				e.printStackTrace();
    			}
    
    		}
    
    		return fieldList.toArray(new String[] {});
    	}
    	
    	/**
    	 * 得到定义的所有字段(返回数组)
    	 * 
    	 * @return
    	 */
    	public static String[] getDeclareField(Class<?> cls) {
    		return getDeclareFieldAsList(cls).toArray(new String[] {});
    	}
    	
    	
    	/**
    	 * 得到定义的所有字段(返回list)
    	 * 
    	 * @return
    	 */
    	public static List<String> getDeclareFieldAsList(Class<?> cls) {
    		List<String> fieldList = new ArrayList<>();
    		Field[] fields = cls.getDeclaredFields();
    		
    		for (Field field : fields) {
    			fieldList.add( field.getName() );
    		}
    		
    		return fieldList;
    	}
    	
    	
    	
    	
    
    	/**
    	 * 检查 in对象(如果有必填字段name就会抛出异常)
    	 */
    	@SuppressWarnings("unchecked")
    	public static void checkInObjectRequired(Object inObj) {
    		Class<?> cls = inObj.getClass();
    		Field[] fields = cls.getDeclaredFields();
    		for (Field field : fields) {
    			
    			Class<? extends Annotation> apiParamCls;
    			try {
    				apiParamCls = (Class<? extends Annotation>) Class.forName("io.swagger.annotations.ApiModelProperty");
    			} catch (ClassNotFoundException e) {
    				return ;
    			}
    			
    			if (field.isAnnotationPresent( apiParamCls )) {
    				Annotation apiParam = field.getAnnotation( apiParamCls );
    
    				Object fieldValue = null;
    				Boolean requiredValue = false;
    				String allowableValues = null;
    				try {
    					field.setAccessible(true);
    					// 取值-是否必填
    					Method method = apiParamCls.getMethod("required");
    					requiredValue = (Boolean) method.invoke( apiParam );
    					// 取值-限制条件
    					method = apiParamCls.getMethod("allowableValues");
    					allowableValues = (String) method.invoke( apiParam );
    					// 取值-field的值
    					fieldValue = field.get(inObj);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    
    		}
    
    	}
    
    
    	/**
    	 * 检查某个out对象
    	 * 
    	 * @param cls
    	 */
    	public static void checkOutObject(Class<?> cls) {
    		Field[] fields = cls.getDeclaredFields();
    		for (Field field : fields) {
    			Class<?> fieldCls = field.getType();
    			if (fieldCls.equals(Long.class) || fieldCls.equals(long.class)) {
    				if (!field.getName().equals("serialVersionUID")) {
    					if (!field.isAnnotationPresent(JsonSerialize.class)) {
    						if( logger.isWarnEnabled() ) {
    							logger.warn("类" + cls +"字段" +field.getName() +"是Long,写成向前端放回的时候可能丢失精度,你大概可以在字段上面加上:@JsonSerialize(using = LongJsonSerializer.class) 来改善这个问题 "  );
    						}
    					}
    				}
    			}
    
    		}
    
    	}
    	
    	
    	/**
    	 * 检查这个类和他的同包下面的out对象
    	 * @param clss
    	 */
    	public static void checkOutObjectAll( Class<?> clss ) {
    		File file =new File(  clss.getResource("").getPath() ) ;
    		
    		if (file.exists() && file.isDirectory()) {
    			for (File itemFile : file.listFiles()) {
    
    				if (itemFile.isDirectory() || !itemFile.getName().endsWith(".class")) {
    					continue;
    				}
    
    				String className = ClassUtils.getSimpleClassName(itemFile.getName());
    				try {
    					Class<?> cls = BeanUtils.class.getClassLoader().loadClass( clss.getPackage().getName()+"."  + className);
    					
    					checkOutObject( cls );
    				} catch (ClassNotFoundException e) {
    					e.printStackTrace();
    				}
    
    			}
    
    		}
    		
    	}
    	
    	/**
    	 * 得到枚举数组的 names
    	 * @param enums
    	 * @return 枚举的names
    	 */
    	public static List<String> enumArraysNames( Enum<?>[] enums ) {
    		List<String> names = new ArrayList<>();
    		for( Enum<?> em : enums ) {
    			names.add( em.name() );
    		}
    		return names;
    	}
    	
    	/**
    	 * 对象 装换成 有格式的 Map( 打印,导出专用 )
    	 * @param data
    	 * @return
    	 */
    	public static Map<String, String> toFormatMap(Object obj) {
    		Map<String, String> map = new HashMap<String, String>();
    		Method[] methods = obj.getClass().getMethods();
    
    		for (Method method : methods) {
    			try {
    				int mod = method.getModifiers();
    				if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
    					continue;
    				}
    				if (!method.getName().startsWith("get")) {
    					continue;
    				}
    				Object value = method.invoke(obj);
    
    				if (value != null) {
    					String name = method.getName().substring(3, 4).toLowerCase() + method.getName().substring(4);
    					
    					if( value instanceof Enum && value.getClass().getPackage().getName().contains("com.cy.order") ) {
    						Method emM =  value.getClass().getMethod("getValue");
    						map.put(name, emM.invoke( value )+"" );
    					}else if( value instanceof Date ){
    						map.put(name,  DateUtils.format( (Date)value , 3) );
    					}else if( method.getName().contains("Amount") ){
    						map.put(name,  MoneyJsonSerializer.format(  (Long)value) );
    					}else {
    						map.put(name, value.toString());
    					}
    				}
    			} catch (IllegalArgumentException e) {
    				e.printStackTrace();
    			} catch (IllegalAccessException e) {
    				e.printStackTrace();
    			} catch (InvocationTargetException e) {
    				e.printStackTrace();
    			} catch (NoSuchMethodException e) {
    				e.printStackTrace();
    			} catch (SecurityException e) {
    				e.printStackTrace();
    			}
    		}
    		return map;
    	}
    
    
    
    }
    

      

    使用例子:

    	Result<List<OrderStatusView>> data = listPayOrder(in);
    		
    		List<String> titles  = Arrays.asList( "订单号","病人名","病人Id","交易类型","交易金额","支付方式","交易单号","交易时间","交易状态","平台商户");
    		List<String> fileNames  = Arrays.asList( "id","name","cardNum","tradeType","amount","payType","payOrderId","payOrderDate","ph","merchantName");
    		
    		ExcelUtils.httpDownload(response, "查询支付单列表",titles, fileNames , data.getData());
    

      

    效果图:

  • 相关阅读:
    vscode配置c++以及美化插件
    自适应辛普森积分法
    [SDOI2014]数表
    [JSOI2009]等差数列
    MUI的踩坑笔记
    笔记:《吴恩达机器学习》——网易云课堂课程[绪论+单变量线性回归]
    CocoStuff—基于Deeplab训练数据的标定工具【五、训练成果分析】
    CocoStuff—基于Deeplab训练数据的标定工具【四、用该工具标定个人数据】
    CocoStuff—基于Deeplab训练数据的标定工具【三、标注工具的使用】
    CocoStuff—基于Deeplab训练数据的标定工具【二、用已提供的标注数据跑通项目】
  • 原文地址:https://www.cnblogs.com/cxygg/p/12859034.html
Copyright © 2011-2022 走看看