导出excel

转载自  http://blog.csdn.net/u011900448/article/details/53097382

(1)将数据库里的数据导出到excel

项目中很多都会用到将数据导出到excel,然后对数据进行整理分析,在之前的项目中,多处用到此功能,也走了很多弯路,从一开始的tableExcel到现在的poi,从一开始用HSSFWorkbook

再到XSSFWorkbook,一步步优化,废话少说,直接开始.

项目框架

1,后台:spring+springmvc+mybatis

2,前台: bootstrap+jQuery+ajax

3,项目管理:maven

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

[html] view plain copy
 
  1. <!-- POI -->    
  2. <dependency>    
  3.     <groupId>org.apache.poi</groupId>    
  4.     <artifactId>poi</artifactId>    
  5.     <version>3.8</version>    
  6.     <exclusions>    
  7.         <exclusion>    
  8.             <artifactId>commons-codec</artifactId>    
  9.             <groupId>commons-codec</groupId>    
  10.         </exclusion>    
  11.     </exclusions>    
  12. </dependency>    
  13. <dependency>    
  14.     <groupId>org.apache.poi</groupId>    
  15.     <artifactId>poi-ooxml</artifactId>    
  16.     <version>3.8</version>    
  17. </dependency>    

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

实现的功能说明:将用户信息(姓名,性别,年龄)通过excel上传,并保存到数据库

具体代码如下

1,前台html代码

[html] view plain copy
 
  1. <span>  
  2.     <label>姓名:</label>  
  3.     <input id="name"  placeholder="请输入姓名"  type="text">  
  4. </span>  
  5. <span>  
  6.     <label>性别:</label>  
  7.     <select id="sex"  style="height: 24px; 163px;">  
  8.         <option value="">请选择性别</option>  
  9.         <option value="1">男</option>  
  10.         <option value="2">女</option>  
  11.     </select>  
  12. </span>  
  13. <span>  
  14.     <label>年龄:</label>  
  15.     <input id="age"  placeholder="请输入年龄"  type="text">  
  16. </span>  
  17. <button class="btn" id="deviceExport">导出</button>        
  18. <script type="text/javascript" src="user.js"></script>  



前台页面效果图

前台效果图

2,js代码

[javascript] view plain copy
 
  1. var User = function(){  
  2.       
  3.     this.init = function(){  
  4.          // 用于导出excel  
  5.         $("#userExport").click(function() {  
  6.             var url =  '/user/export/';  
  7.             location.href = url + "?queryJson="+JSON.stringify(user.acquireInquireData());  
  8.         });  
  9.     };  
  10.       
  11.     //获取查询条件  
  12.     this.acquireInquireData = function(){  
  13.         var inquireCondition = {  
  14.                 name:$('#name').val(),//名称  
  15.                 sex: $('#sex').val(),//性别  
  16.                 age: $('#age').val(),//年龄  
  17.         };  
  18.         return inquireCondition;  
  19.     };  
  20. }  
  21.       
  22. var user;  
  23. $(function(){  
  24.     user = new User();  
  25.     user.init();  
  26. });  

3,domain的user实体类

[java] view plain copy
 
  1. /**   
  2.  * @author  李光光(编码小王子)  
  3.  * @QQ      826331692 
  4.  * @date    2016年11月7日 下午2:57:03   
  5.  * @version 1.0     
  6.  */    
  7. public class User {    
  8.     private  String name;    
  9.     private String sex;    
  10.     private String age;    
  11.     public String getName() {    
  12.         return name;    
  13.     }    
  14.     public void setName(String name) {    
  15.         this.name = name;    
  16.     }    
  17.     public String getSex() {    
  18.         return sex;    
  19.     }    
  20.     public void setSex(String sex) {    
  21.         this.sex = sex;    
  22.     }    
  23.     public String getAge() {    
  24.         return age;    
  25.     }    
  26.     public void setAge(String age) {    
  27.         this.age = age;    
  28.     }    
  29. }    



4,controller层代码

[java] view plain copy
 
  1. /** 
  2.  * @author 李光光(编码小王子) 
  3.  * @date 2015年12月29日 下午4:04:00 
  4.  * @qq  826331692 
  5.  * @version 1.0 
  6.  * @return 
  7.  */  
  8. @Controller  
  9. @RequestMapping("/user")  
  10. public class UserController {  
  11.       
  12.     @Autowired  
  13.     private UserService userService;  
  14.     /** 
  15.      * 用于导出excel的查询结果 
  16.      * @param queryJson 
  17.      * @return 
  18.      */  
  19.     @RequestMapping("/export")  
  20.     public void export(HttpServletRequest request, HttpServletResponse response,  
  21.                         @RequestParam(value = "queryJson") String queryJson) {  
  22.         User user = JSON.parseObject(queryJson, User.class);  
  23.         List<User> userlList = userService.getUserForExcel(user);  
  24.         ExportExcel<User> ee= new ExportExcel<User>();  
  25.         String[] headers = { "序号", "姓名", "性别", "年龄" };  
  26.         String fileName = "用户信息表";  
  27.         ee.exportExcel(headers,userlList,fileName,response);  
  28.     }  
  29. }  

5,service层代码

[java] view plain copy
 
  1. public interface UserService {    
  2.     
  3.     /** 
  4.      * 根据查询条件查询出所有的记录,不用分页,用于excel导出功能   
  5.      * @param userDeviceVo 
  6.      * @return 
  7.      */  
  8.     public List<User> getUserDeviceForExcel(User user);   
  9.     
  10. }    

6,service实现层代码

[java] view plain copy
 
  1. /** 
  2.  * @author  李光光(编码小王子) 
  3.  * @date 2015年12月29日 下午3:43:08  
  4.  * @Email 826331692@qq.com  
  5.  * @version 1.0 
  6.  * @return 
  7.  */  
  8.   
  9. public class UserServiceImpl implements UserService {  
  10.       
  11.     @Autowired  
  12.     private UserDao  userDao;  
  13. /** 
  14.      * 根据查询条件查询出所有的记录,不用分页,用于excel导出功能   
  15.      * @param userDeviceVo 
  16.      * @return 
  17.      */  
  18.     @Override  
  19.     public List<User> getUserDeviceForExcel(User user) {  
  20.         List<User> list = userDeviceDao.getUserForExcel(user);  
  21.         Integer order;  
  22.         for (int i = 0; i < list.size(); i++) {  
  23.             order = i + 1;  
  24.             list.get(i).setOrder(order.toString());  
  25.             if (list.get(i).getSex().equals("1")) {  
  26.                 list.get(i).setSex("男");  
  27.             } else {  
  28.                 list.get(i).setSex("女");  
  29.             }  
  30.         }  
  31.         return list;  
  32.     }  
  33. }  


6dao层代码

[java] view plain copy
 
  1. public interface UserDao {    
  2.     
  3.   /** 
  4.      * 根据查询条件查询出所有的记录,不用分页,用于excel导出功能   
  5.      * @param userDeviceVo 
  6.      * @return 
  7.      */  
  8.     List<User> getUserForExcel(User user);  
  9.   
  10.     
  11. }    


7mybatis代码

[html] view plain copy
 
  1.   <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  3. <mapper namespace="XXX .UserDao">  
  4.   
  5.   <!--根据查询条件查询出所有的记录,不用分页,用于excel导出功能  -->  
  6.     <select id="getUserForExcel" parameterType="User" resultType="User">  
  7.         select name,sex,age  
  8.         from juser_table   
  9.         where  1=1 and   
  10.         <if test="name != null and name !=''">and  name=#{name}</if>  
  11.         <if test="sex != null and sex !=''">and  sex=#{sex}</if>  
  12.         <if test="age != null and age !=''">and  age=#{age}</if>  
  13.     </select>  
  14. </mapper>  


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

[java] view plain copy
 
  1. package com.jd.xe.web.service.userDevice;  
  2.   
  3. import java.io.BufferedOutputStream;  
  4. import java.lang.reflect.Field;  
  5. import java.lang.reflect.Method;  
  6. import java.util.Collection;  
  7. import java.util.Date;  
  8. import java.util.Iterator;  
  9.   
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.poi.xssf.usermodel.XSSFCell;  
  13. import org.apache.poi.xssf.usermodel.XSSFRichTextString;  
  14. import org.apache.poi.xssf.usermodel.XSSFRow;  
  15. import org.apache.poi.xssf.usermodel.XSSFSheet;  
  16. import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  17.   
  18. import com.jd.xe.web.utils.DateUtil;  
  19.   
  20.   
  21. /**  
  22.  * @author  李光光(编码小王子) 
  23.  * @Email   826331692@qq.com  
  24.  * @date    2016年7月18日 下午9:03:29  
  25.  * @version 1.0    
  26.  */  
  27. public class ExportExcel<T> {  
  28.     public void exportExcel(String[] headers,Collection<T> dataset, String fileName,HttpServletResponse response) {  
  29.         // 声明一个工作薄  
  30.         XSSFWorkbook workbook = new XSSFWorkbook();  
  31.         // 生成一个表格  
  32.         XSSFSheet sheet = workbook.createSheet(fileName);  
  33.         // 设置表格默认列宽度为15个字节  
  34.         sheet.setDefaultColumnWidth((short) 20);  
  35.         // 产生表格标题行  
  36.         XSSFRow row = sheet.createRow(0);  
  37.         for (short i = 0; i < headers.length; i++) {  
  38.             XSSFCell cell = row.createCell(i);  
  39.             XSSFRichTextString text = new XSSFRichTextString(headers[i]);  
  40.             cell.setCellValue(text);  
  41.         }  
  42.         try {  
  43.             // 遍历集合数据,产生数据行  
  44.             Iterator<T> it = dataset.iterator();  
  45.             int index = 0;  
  46.             while (it.hasNext()) {  
  47.                 index++;  
  48.                 row = sheet.createRow(index);  
  49.                 T t = (T) it.next();  
  50.                 // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值  
  51.                 Field[] fields = t.getClass().getDeclaredFields();  
  52.                 for (short i = 0; i < headers.length; i++) {  
  53.                     XSSFCell cell = row.createCell(i);  
  54.                     Field field = fields[i];  
  55.                     String fieldName = field.getName();  
  56.                     String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);  
  57.                     Class tCls = t.getClass();  
  58.                     Method getMethod = tCls.getMethod(getMethodName, new Class[] {});  
  59.                     Object value = getMethod.invoke(t, new Object[] {});  
  60.                     // 判断值的类型后进行强制类型转换  
  61.                     String textValue = null;  
  62.                     // 其它数据类型都当作字符串简单处理  
  63.                     if(value != null && value != ""){  
  64.                         textValue = value.toString();  
  65.                     }  
  66.                     if (textValue != null) {  
  67.                         XSSFRichTextString richString = new XSSFRichTextString(textValue);  
  68.                         cell.setCellValue(richString);  
  69.                     }  
  70.                 }  
  71.             }  
  72.             getExportedFile(workbook, fileName,response);  
  73.         } catch (Exception e) {  
  74.             e.printStackTrace();  
  75.         }   
  76.     }  
  77.       
  78.     /** 
  79.      *  
  80.      * 方法说明: 指定路径下生成EXCEL文件 
  81.      * @return 
  82.      */  
  83.     public void getExportedFile(XSSFWorkbook workbook, String name,HttpServletResponse response) throws Exception {  
  84.         BufferedOutputStream fos = null;  
  85.         try {  
  86.             String fileName = name+DateUtil.parseSmallDate(new Date()) + ".xlsx";  
  87.             response.setContentType("application/x-msdownload");  
  88.             response.setHeader("Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ));  
  89.             fos = new BufferedOutputStream(response.getOutputStream());  
  90.             workbook.write(fos);  
  91.         } catch (Exception e) {  
  92.             e.printStackTrace();  
  93.         } finally {  
  94.             if (fos != null) {  
  95.                 fos.close();  
  96.             }  
  97.         }  
  98.     }  
  99.   
  100. }  
原文地址:https://www.cnblogs.com/ctaixw/p/6340331.html