zoukankan      html  css  js  c++  java
  • 导出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. }  
  • 相关阅读:
    Codeforces 787D. Legacy 线段树优化建图+最短路
    Codeforces 1051E. Vasya and Big Integers
    BZOJ3261 最大异或和
    BZOJ3531 SDOI2014 旅行
    洛谷P2468 SDOI 2010 粟粟的书架
    2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
    HDU6280 From Tree to Graph
    HDU5985 Lucky Coins 概率dp
    (HDU)1334 -- Perfect Cubes (完美立方)
    (HDU)1330 -- Deck (覆盖物)
  • 原文地址:https://www.cnblogs.com/ctaixw/p/6340331.html
Copyright © 2011-2022 走看看