java将数据库里的数据导出到excel

项目中很多都会用到将数据导出到excel,然后对数据进行整理分析,在之前的项目中,多处用到此功能,也走了很多弯路,从一开始的tableExcel到现在的poi,从一开始用HSSFWorkbook,再到XSSFWorkbook,一步步优化,废话少说,直接开始.

一,项目框架

1,后台:spring+springmvc+mybatis

2,前台: bootstrap+jQuery+ajax

3,项目管理:maven

说明.excel处理函数需要引入poi的jar包,在pom.xml引入一下代码

  
  
    org.apache.poi  
    poi  
    3.8  
      
          
            commons-codec  
            commons-codec  
          
      
  
  
    org.apache.poi  
    poi-ooxml  
    3.8  
  

别的框架大体上也是可以的,只需稍微调整,如有问题,大家可留言讨论

实现的功能说明:将数据库中的人员信息(姓名.年龄,电话)导出到excel

二,具体代码如下

1,前台html代码


    
    


    
    


    
    

	   

前台页面效果图

前台效果图

2,js代码

var User = function(){
	this.init = function(){
		 // 用于导出excel
		$("#userExport").click(function() {
			var url =  '/user/export/';
			var params = JSON.stringify(user.acquireInquireData());
			//如果出现中文乱码情况请添加下面这句代码
			params = encodeURI(encodeURI(params)
            location.href = url + "?queryJson="+params;
		});
	};
	//获取查询条件
	this.acquireInquireData = function(){
		var inquireCondition = {
				name:$('#name').val(),//名称
				sex: $('#sex').val(),//性别
				age: $('#age').val(),//年龄
		};
		return inquireCondition;
	};
}
	
var user;
$(function(){
	user = new User();
	user.init();
});

3,domain的user实体类(该实体类如果作为最终导出结果的实体类,则该类的字段必须与需要导出的字段保持一致,且与导出列表的顺序也得保持一致)

/**  
 * @author  李光光(编码小王子) 
 * @QQ      826331692
 * @date    2016年11月7日 下午2:57:03  
 * @version 1.0    
 */  
public class User {  
    private  String name;  
    private String sex;  
    private String age;  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public String getSex() {  
        return sex;  
    }  
    public void setSex(String sex) {  
        this.sex = sex;  
    }  
    public String getAge() {  
        return age;  
    }  
    public void setAge(String age) {  
        this.age = age;  
    }  
}  

4,controller层代码

/**
 * @author 李光光(编码小王子)
 * @date 2015年12月29日 下午4:04:00
 * @qq  826331692
 * @version 1.0
 * @return
 */
@Controller
@RequestMapping("/user")
public class UserController {
	
	@Autowired
	private UserService userService;
	/**
	 * 用于导出excel的查询结果
	 * @param queryJson
	 * @return
	 */
	@RequestMapping("/export")
	public void export(HttpServletRequest request, HttpServletResponse response,@RequestParam(value = "queryJson") String queryJson) {
		//如果出现中文乱码请添加下面这句
		queryJson = URLDecoder.decode(queryJson,"utf-8"); 
		//需要导入alibaba的fastjson包
		User user = com.alibaba.fastjson.JSON.parseObject(queryJson, User.class);
		List userlList = userService.getUserForExcel(user);
		ExportExcel ee= new ExportExcel();
		String[] headers = { "序号", "姓名", "性别", "年龄" };
		String fileName = "用户信息表";
		ee.exportExcel(headers,userlList,fileName,response);
	}
}

5,service层代码

public interface UserService {  
  
    /**
	 * 根据查询条件查询出所有的记录,不用分页,用于excel导出功能  
	 * @param userDeviceVo
	 * @return
	 */
	public List getUserDeviceForExcel(User user); 
  
}  

6,service实现层代码

/**
 * @author  李光光(编码小王子)
 * @date 2015年12月29日 下午3:43:08 
 * @Email [email protected] 
 * @version 1.0
 * @return
 */
@service
public class UserServiceImpl implements UserService {
	@Autowired
	private UserDao  userDao;
	/**
	 * 根据查询条件查询出所有的记录,不用分页,用于excel导出功能  
	 * @param userDeviceVo
	 * @return
	 */
	@Override
	public List getUserDeviceForExcel(User user) {
		List list = userDao.getUserForExcel(user);
		Integer order;
		for (int i = 0; i < list.size(); i++) {
			order = i + 1;
			list.get(i).setOrder(order.toString());
			if (list.get(i).getSex().equals("1")) {
				list.get(i).setSex("男");
			} else {
				list.get(i).setSex("女");
			}
		}
		return list;
	}
}

6,dao层代码

public interface UserDao {  
  
  /**
	 * 根据查询条件查询出所有的记录,不用分页,用于excel导出功能  
	 * @param userDeviceVo
	 * @return
	 */
	List getUserForExcel(User user);

  
}  

需要在配置文件中加载UserDao的信息,否则无法找到UserDao,配置如下:




	
		
			${DB_MSSQL_DRIVER}
		
		
			${DB_MSSQL_URL}
		
		
			${DB_MSSQL_USER}
		
		
			${DB_MSSQL_PW}
		
		
			${maxActive}
		
		
			${maxIdle}
		
		
			${minIdle}
		
		
			${maxWait}
		
		
			${timeBetweenEvictionRunsMillis}
		
		
			${minEvictableIdleTimeMillis}
		
		
			${testWhileIdle}
		
		
		 
		
			${validationQuery}
		
		
			${removeAbandoned}
		 
		
			${removeAbandonedTimeout}
		 
	
	
	
		
	
	
	
    
        
        
        
            classpath:mybatis/*.xml
        
    
    
    
        
        
    

7,mybatis代码

  



  
    

8,重头戏来了,将List数据写入到excel的代码如下:

package com.jd.xe.web.service.userDevice;
import java.io.BufferedOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.jd.xe.web.utils.DateUtil;
/** 
 * @author  李光光(编码小王子)
 * @Email   [email protected] 
 * @date    2016年7月18日 下午9:03:29 
 * @version 1.0   
 */
public class ExportExcel {
	public void exportExcel(String[] headers,Collection dataset, String fileName,HttpServletResponse response) {
		// 声明一个工作薄
		XSSFWorkbook workbook = new XSSFWorkbook();
		// 生成一个表格
		XSSFSheet sheet = workbook.createSheet(fileName);
		// 设置表格默认列宽度为15个字节
		sheet.setDefaultColumnWidth((short) 20);
		// 产生表格标题行
		XSSFRow row = sheet.createRow(0);
		for (short i = 0; i < headers.length; i++) {
			XSSFCell cell = row.createCell(i);
			XSSFRichTextString text = new XSSFRichTextString(headers[i]);
			cell.setCellValue(text);
		}
		try {
			// 遍历集合数据,产生数据行
			Iterator it = dataset.iterator();
			int index = 0;
			while (it.hasNext()) {
				index++;
				row = sheet.createRow(index);
				T t = (T) it.next();
				// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
				Field[] fields = t.getClass().getDeclaredFields();
				for (short i = 0; i < headers.length; i++) {
					XSSFCell cell = row.createCell(i);
					Field field = fields[i];
					String fieldName = field.getName();
					String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
					Class tCls = t.getClass();
					Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
					Object value = getMethod.invoke(t, new Object[] {});
					// 判断值的类型后进行强制类型转换
					String textValue = null;
					// 其它数据类型都当作字符串简单处理
					if(value != null && value != ""){
						textValue = value.toString();
					}
					if (textValue != null) {
						XSSFRichTextString richString = new XSSFRichTextString(textValue);
						cell.setCellValue(richString);
					}
				}
			}
			getExportedFile(workbook, fileName,response);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	/**
	 * 
	 * 方法说明: 指定路径下生成EXCEL文件
	 * @return
	 */
	public void getExportedFile(XSSFWorkbook workbook, String name,HttpServletResponse response) throws Exception {
		BufferedOutputStream fos = null;
		try {
			String fileName = name + ".xlsx";
			response.setContentType("application/x-msdownload");
			response.setHeader("Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ));
			fos = new BufferedOutputStream(response.getOutputStream());
			workbook.write(fos);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (fos != null) {
				fos.close();
			}
		}
	}
}

至此整个代码已经完成了,如有什么不明白的地方,可以评论,我会及时回复大家,互相学习,共同进步.

你可能感兴趣的:(代码,java,excel,maven,spring,springmvc)