zoukankan      html  css  js  c++  java
  • java中使用poi导出excel表格数据并且可以手动修改导出路径

      在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板。

      这里我们选择使用poi导出excel:

      第一步:导入需要的jar包到 lib 文件夹下

      

       jar包下载路径:http://download.csdn.net/download/pumpkin09/7077011

      第二步:添加poi导出工具类

        

      1 package com.yjd.admin.util;
      2 
      3 import java.io.IOException;
      4 import java.io.OutputStream;
      5 import java.lang.reflect.Field;
      6 import java.lang.reflect.InvocationTargetException;
      7 import java.lang.reflect.Method;
      8 import java.text.SimpleDateFormat;
      9 import java.util.Collection;
     10 import java.util.Date;
     11 import java.util.Iterator;
     12 import java.util.regex.Matcher;
     13 import java.util.regex.Pattern;
     14 
     15 
     16 import org.apache.poi.hssf.usermodel.HSSFCell;
     17 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
     18 import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
     19 import org.apache.poi.hssf.usermodel.HSSFComment;
     20 import org.apache.poi.hssf.usermodel.HSSFFont;
     21 import org.apache.poi.hssf.usermodel.HSSFPatriarch;
     22 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
     23 import org.apache.poi.hssf.usermodel.HSSFRow;
     24 import org.apache.poi.hssf.usermodel.HSSFSheet;
     25 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
     26 import org.apache.poi.hssf.util.HSSFColor;
     27 
     28 /**
     29  * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
     30  * 
     31  * @author leno
     32  * @version v1.0
     33  * @param <T>
     34  *            应用泛型,代表任意一个符合javabean风格的类
     35  *            注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
     36  *            byte[]表jpg格式的图片数据
     37  */
     38 public class ExportExcel<T> {
     39     public void exportExcel(Collection<T> dataset, OutputStream out) {
     40         exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");
     41     }
     42 
     43     public void exportExcel(String[] headers, Collection<T> dataset,
     44             OutputStream out) {
     45         exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");
     46     }
     47 
     48     public void exportExcel(String[] headers, Collection<T> dataset,
     49             OutputStream out, String pattern) {
     50         exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
     51     }
     52 
     53     /**
     54      * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
     55      * 
     56      * @param title
     57      *            表格标题名
     58      * @param headers
     59      *            表格属性列名数组
     60      * @param dataset
     61      *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
     62      *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     63      * @param out
     64      *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     65      * @param pattern
     66      *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
     67      */
     68     @SuppressWarnings("unchecked")
     69     public void exportExcel(String title, String[] headers,
     70             Collection<T> dataset, OutputStream out, String pattern) {
     71         // 声明一个工作薄
     72         HSSFWorkbook workbook = new HSSFWorkbook();
     73         // 生成一个表格
     74         HSSFSheet sheet = workbook.createSheet(title);
     75         // 设置表格默认列宽度为15个字节
     76         sheet.setDefaultColumnWidth((short) 15);
     77         // 生成一个样式
     78         HSSFCellStyle style = workbook.createCellStyle();
     79         // 设置这些样式
     80         style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
     81         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
     82         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
     83         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
     84         style.setBorderRight(HSSFCellStyle.BORDER_THIN);
     85         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
     86         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
     87         // 生成一个字体
     88         HSSFFont font = workbook.createFont();
     89         font.setColor(HSSFColor.VIOLET.index);
     90         font.setFontHeightInPoints((short) 12);
     91         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
     92         // 把字体应用到当前的样式
     93         style.setFont(font);
     94         // 生成并设置另一个样式
     95         HSSFCellStyle style2 = workbook.createCellStyle();
     96         style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
     97         style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
     98         style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
     99         style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    100         style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
    101         style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
    102         style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    103         style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
    104         // 生成另一个字体
    105         HSSFFont font2 = workbook.createFont();
    106         font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
    107         // 把字体应用到当前的样式
    108         style2.setFont(font2);
    109         // 声明一个画图的顶级管理器
    110         HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
    111         // 定义注释的大小和位置,详见文档
    112         HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
    113                 0, 0, 0, (short) 4, 2, (short) 6, 5));
    114         // 设置注释内容
    115         comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
    116         // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
    117         comment.setAuthor("leno");
    118         // 产生表格标题行
    119         HSSFRow row = sheet.createRow(0);
    120         for (short i = 0; i < headers.length; i++) {
    121             HSSFCell cell = row.createCell(i);
    122             cell.setCellStyle(style);
    123             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
    124             cell.setCellValue(text);
    125         }
    126         // 遍历集合数据,产生数据行
    127         Iterator<T> it = dataset.iterator();
    128         int index = 0;
    129         while (it.hasNext()) {
    130             index++;
    131             row = sheet.createRow(index);
    132             T t = (T) it.next();
    133             // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
    134             Field[] fields = t.getClass().getDeclaredFields();
    135             for (short i = 0; i < fields.length; i++) {
    136                 HSSFCell cell = row.createCell(i);
    137                 cell.setCellStyle(style2);
    138                 Field field = fields[i];
    139                 String fieldName = field.getName();
    140                 String getMethodName = "get"
    141                         + fieldName.substring(0, 1).toUpperCase()
    142                         + fieldName.substring(1);
    143                 try {
    144                     Class tCls = t.getClass();
    145                     Method getMethod = tCls.getMethod(getMethodName,
    146                             new Class[] {});
    147                     Object value = getMethod.invoke(t, new Object[] {});
    148                     // 判断值的类型后进行强制类型转换
    149                     String textValue = null;
    150                     // if (value instanceof Integer) {
    151                     // int intValue = (Integer) value;
    152                     // cell.setCellValue(intValue);
    153                     // } else if (value instanceof Float) {
    154                     // float fValue = (Float) value;
    155                     // textValue = new HSSFRichTextString(
    156                     // String.valueOf(fValue));
    157                     // cell.setCellValue(textValue);
    158                     // } else if (value instanceof Double) {
    159                     // double dValue = (Double) value;
    160                     // textValue = new HSSFRichTextString(
    161                     // String.valueOf(dValue));
    162                     // cell.setCellValue(textValue);
    163                     // } else if (value instanceof Long) {
    164                     // long longValue = (Long) value;
    165                     // cell.setCellValue(longValue);
    166                     // }
    167                     if (value instanceof Boolean) {
    168                         boolean bValue = (Boolean) value;
    169                         textValue = "男";
    170                         if (!bValue) {
    171                             textValue = "女";
    172                         }
    173                     } else if (value instanceof Date) {
    174                         Date date = (Date) value;
    175                         SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    176                         textValue = sdf.format(date);
    177                     } else if (value instanceof byte[]) {
    178                         // 有图片时,设置行高为60px;
    179                         row.setHeightInPoints(60);
    180                         // 设置图片所在列宽度为80px,注意这里单位的一个换算
    181                         sheet.setColumnWidth(i, (short) (35.7 * 80));
    182                         // sheet.autoSizeColumn(i);
    183                         byte[] bsValue = (byte[]) value;
    184                         HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
    185                                 1023, 255, (short) 6, index, (short) 6, index);
    186                         anchor.setAnchorType(2);
    187                         patriarch.createPicture(anchor, workbook.addPicture(
    188                                 bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
    189                     } else {
    190                         // 其它数据类型都当作字符串简单处理
    191                         textValue = value.toString();
    192                     }
    193                     // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
    194                     if (textValue != null) {
    195                         Pattern p = Pattern.compile("^//d+(//.//d+)?$");
    196                         Matcher matcher = p.matcher(textValue);
    197                         if (matcher.matches()) {
    198                             // 是数字当作double处理
    199                             cell.setCellValue(Double.parseDouble(textValue));
    200                         } else {
    201                             HSSFRichTextString richString = new HSSFRichTextString(
    202                                     textValue);
    203                             HSSFFont font3 = workbook.createFont();
    204                             font3.setColor(HSSFColor.BLUE.index);
    205                             richString.applyFont(font3);
    206                             cell.setCellValue(richString);
    207                         }
    208                     }
    209                 } catch (SecurityException e) {
    210                     e.printStackTrace();
    211                 } catch (NoSuchMethodException e) {
    212                     e.printStackTrace();
    213                 } catch (IllegalArgumentException e) {
    214                     e.printStackTrace();
    215                 } catch (IllegalAccessException e) {
    216                     e.printStackTrace();
    217                 } catch (InvocationTargetException e) {
    218                     e.printStackTrace();
    219                 } finally {
    220                     // 清理资源
    221                 }
    222             }
    223         }
    224         try {
    225             workbook.write(out);
    226         } catch (IOException e) {
    227             e.printStackTrace();
    228         }
    229     }
    230 
    231 }

      第三步:由于我使用的的spring-mvc框架,所以在Controller调用上面的工具类ExportExcel

     

     1 package com.yjd.admin.vo;
     2 
     3 import java.util.Date;
     4 
     5 public class P2pLoanPlanVo {
     6          private Date repayDate;
     7         private double repayAmount;
     8         private Integer repayDays;
     9         private Integer repayYqDays;
    10         private Double lateAmount;
    11         private String isPosPaid;
    12         private String statusName;
    13         private String isSysPay;
    14         public Date getRepayDate() {
    15             return repayDate;
    16         }
    17         public void setRepayDate(Date repayDate) {
    18             this.repayDate = repayDate;
    19         }
    20         public double getRepayAmount() {
    21             return repayAmount;
    22         }
    23         public void setRepayAmount(double repayAmount) {
    24             this.repayAmount = repayAmount;
    25         }
    26         public Integer getRepayDays() {
    27             return repayDays;
    28         }
    29         public void setRepayDays(Integer repayDays) {
    30             this.repayDays = repayDays;
    31         }
    32         public Integer getRepayYqDays() {
    33             return repayYqDays;
    34         }
    35         public void setRepayYqDays(Integer repayYqDays) {
    36             this.repayYqDays = repayYqDays;
    37         }
    38         public Double getLateAmount() {
    39             return lateAmount;
    40         }
    41         public void setLateAmount(Double lateAmount) {
    42             this.lateAmount = lateAmount;
    43         }
    44         public String getIsPosPaid() {
    45             return isPosPaid;
    46         }
    47         public void setIsPosPaid(String isPosPaid) {
    48             this.isPosPaid = isPosPaid;
    49         }
    50         public String getStatusName() {
    51             return statusName;
    52         }
    53         public void setStatusName(String statusName) {
    54             this.statusName = statusName;
    55         }
    56         public String getIsSysPay() {
    57             return isSysPay;
    58         }
    59         public void setIsSysPay(String isSysPay) {
    60             this.isSysPay = isSysPay;
    61         }
    62         
    63         
    64         
    65         
    66         
    67 }
     1 /**
     2      * 导出excel数据
     3      * @param id
     4      * @param m
     5      * @return
     6      */
     7     @RequestMapping("/exportExcel")
     8     public void exportExcel(@RequestParam("id") Integer id, Model m,HttpServletRequest req, HttpServletResponse resp) {
     9         try {
    10             
    11             ExportExcel<P2pLoanPlanVo> ex = new ExportExcel<P2pLoanPlanVo>();
    12             String[] headers = {"最迟还款日", "还款金额","剩余几天","逾期几天", "罚息","是否垫付","状态","是否发放收益"};
    13             List<P2pLoanPlanVo> dataset = new ArrayList<P2pLoanPlanVo>();
    14             List<P2pLoanPlan> plans = this.planService.getListByLoan(id);
    15             for (int i = 0; i < plans.size(); i++) {
    16                 P2pLoanPlanVo p2pLoanPlanVo = new P2pLoanPlanVo();
    17                 
    18                 p2pLoanPlanVo.setRepayDate(plans.get(i).getRepayDate());
    19                 p2pLoanPlanVo.setRepayAmount(plans.get(i).getRepayAmount());
    20                 
    21                 if(plans.get(i).getRepayDays() >= 0 && plans.get(i).getStatus() == 0){
    22                     p2pLoanPlanVo.setRepayDays(plans.get(i).getRepayDays());
    23                 }else{
    24                     p2pLoanPlanVo.setRepayDays(0);
    25                 }
    26                 if(plans.get(i).getRepayDays() < 0 && plans.get(i).getStatus() == 0){
    27                     p2pLoanPlanVo.setRepayYqDays(-plans.get(i).getRepayDays());
    28                 }else{
    29                     p2pLoanPlanVo.setRepayYqDays(0);
    30                 }
    31                 
    32                 p2pLoanPlanVo.setLateAmount(plans.get(i).getLateAmount());
    33                 String IsPosPaid = "";
    34                 if(plans.get(i).getIsPosPaid()==true){
    35                     IsPosPaid = "已垫付";
    36                 }else{
    37                     IsPosPaid = "未垫付";
    38                 }
    39                 p2pLoanPlanVo.setIsPosPaid(IsPosPaid);
    40                 p2pLoanPlanVo.setStatusName(plans.get(i).getStatusName());
    41                 String IsSysPay ="";
    42                 if(plans.get(i).getIsSysPay() == true){
    43                     IsSysPay = "已发放收益";
    44                 }else{
    45                     IsSysPay = "未发放收益";
    46                 }
    47                 p2pLoanPlanVo.setIsSysPay(IsSysPay);
    48                 
    49                 dataset.add(p2pLoanPlanVo);
    50                 
    51             }
    52             try {
    53                 req.setCharacterEncoding("UTF-8");
    54                 resp.setCharacterEncoding("UTF-8");
    55                 resp.setContentType("application/x-download");
    56                 
    57                 String filedisplay = "还款计划.xls";
    58                 //防止文件名含有中文乱码
    59                 filedisplay = new String( filedisplay.getBytes("gb2312"), "ISO8859-1" );
    60                 resp.setHeader("Content-Disposition", "attachment;filename="+ filedisplay);
    61                 
    62                 OutputStream out = resp.getOutputStream();
    63                 ex.exportExcel(headers, dataset, out);
    64                 out.close();
    65             } catch (FileNotFoundException e) {
    66                 e.printStackTrace();
    67             } catch (IOException e) {
    68                 e.printStackTrace();
    69             }
    70         } catch (Exception e) {
    71             Exceptions.getExceptionMsg(e, logger);
    72         }
    73     }

    注意:此处ExportExcel<T>工具类中的泛型对应P2pLoanPlanVo这个类,P2pLoanPlanVo类中的属性要对应exportExcel()接口中headers中每个值并且都要有值,不允许为空,若有不足的地方还望各位大神多多指点!

    未经博主允许,请勿转载

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/zmengj/p/5765622.html
Copyright © 2011-2022 走看看