• 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中每个值并且都要有值,不允许为空,若有不足的地方还望各位大神多多指点!

    未经博主允许,请勿转载

  • 相关阅读:
    【Loadrunner】使用LR录制HTTPS协议的三种方法
    【Loadrunner】使用LoadRunner上传及下载文件
    【Loadrunner】平台1.9环境APP成功录制并调试成功后的脚本备份
    JavaScript命令模式
    JavaScript享元模式
    JavaScript适配器模式
    安装MySQL
    idea创建web项目,springboot项目,maven项目
    spring自定义注解
    服务器访问数据库表mysql
  • 原文地址:https://www.cnblogs.com/zmengj/p/5765622.html
Copyright © 2020-2023  润新知