zoukankan      html  css  js  c++  java
  • poi实现Excel导出

    最近做了一个导出Excel的小功能,以前没接触过,现在分享下自己的代码,想让各位帮忙看看有啥地方可以优化,也方便自己以后查阅...

    首先是excelAction的代码:

     1 /**
     2  * excelAction
     3  * @author zhaoxz
     4  *
     5  */
     6 @Controller("excelAction")
     7 @Scope("prototype")
     8 public class ExcelAction extends BaseAction {
     9     /**
    10      * 
    11      */
    12     private static final long serialVersionUID = -4596726723629076906L;
    13     private static final Logger logger = Logger.getLogger(ExcelAction.class);
    14     @Resource
    15     private CkdjService ckdjSrv;
    16     private ExportExcel ex = new ExportExcel();
    17     private Ckdj ckdj;
    18     private String exportBatch;
    19     private String fileName;
    20     private InputStream excelStream;
    21     
    22 
    23     public String execute() throws Exception {
    24         return SUCCESS;
    25     }
    26     
    27     /**
    28      * 将workbook转换为InputStream
    29      * @param workbook
    30      * @param fileName
    31      */
    32     private void workbookInputStream(HSSFWorkbook workbook, String fileName) {
    33         try {
    34             this.setFileName(URLEncoder.encode(fileName, "UTF-8"));
    35             ByteArrayOutputStream baos = new ByteArrayOutputStream();
    36             workbook.write(baos);
    37             baos.flush();
    38             byte[] aa = baos.toByteArray();
    39             this.excelStream = new ByteArrayInputStream(aa, 0, aa.length);
    40             baos.close();
    41         } catch (Exception e) {
    42             logger.error("转换失败!", e);
    43         }
    44     }
    45 
    46     /**************************** get set **************************************/
    47 
    48     /**
    49      * 获取文件流
    50      * @return
    51      */
    52     public InputStream getExcelStream() {
    53         try {
    54             String[] headers =  
    55             { "序号", "名称", "规格", "序列号", "数量", "单位", "出库人"};
    56             ckdj = ckdjSrv.findById(ckdj);
    57             System.out.println(getExportBatch());
    58             HSSFWorkbook workbook = ex.exportExcel("出库列表", headers, ckdj ,exportBatch);
    59             this.workbookInputStream(workbook, fileName);
    60         } catch (Exception e) {
    61             logger.error("获取文件流失败!", e);
    62         }
    63         return excelStream;
    64     }
    65 
    66     public void setExcelStream(InputStream excelStream) {
    67         this.excelStream = excelStream;
    68     }
    69 
    70     public Ckdj getCkdj() {
    71         return ckdj;
    72     }
    73 
    74     public void setCkdj(Ckdj ckdj) {
    75         this.ckdj = ckdj;
    76     }
    77     
    78     public String getFileName() {
    79         return fileName;
    80     }
    81 
    82     public void setFileName(String fileName) {
    83         this.fileName = fileName;
    84     }
    85 
    86     public void setCkdjSrv(CkdjService ckdjSrv) {
    87         this.ckdjSrv = ckdjSrv;
    88     }
    89 
    90     public String getExportBatch() {
    91         return exportBatch;
    92     }
    93 
    94     public void setExportBatch(String exportBatch) {
    95         this.exportBatch = exportBatch;
    96     }
    97 
    98 }

    接着是struts2.xml文件

    1 <action name="exportExcel" class="excelAction">
    2    <result name="success" type="stream">
    3          <param name="contentType">application/vnd.ms-excel</param>
    4          <param name="inputName">excelStream</param>
    5          <param name="contentDisposition">attachment;filename="${fileName}.xls"</param>
    6          <param name="bufferSize">1024</param> 
    7    </result>
    8 </action>

    然后是ExportExcel.java类的代码:

      1 /**
      2  * 导出Excel文档
      3  * @author zhaoxz
      4  *
      5  */
      6 @SuppressWarnings("unchecked")
      7 public class ExportExcel {
      8     
      9     /**
     10      * 创建workbook
     11      * @param title
     12      * @param headers
     13      * @param ckdj
     14      */
     15     public HSSFWorkbook exportExcel(String title,String[] headers,Ckdj ckdj,String exportBatch){
     16         
     17         //声明一个工作薄
     18         HSSFWorkbook workbook = new HSSFWorkbook();
     19         //生成一个表格
     20         HSSFSheet sheet = workbook.createSheet(title);
     21         //设置表格默认列宽为15个字节
     22         sheet.setDefaultColumnWidth(15);
     23         //生成一个样式
     24         HSSFCellStyle style = workbook.createCellStyle();
     25         //设置样式
     26         style.setFillForegroundColor(HSSFColor.WHITE.index);
     27         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
     28         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
     29         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
     30         style.setBorderRight(HSSFCellStyle.BORDER_THIN);
     31         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
     32         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
     33         //生成一个字体
     34         HSSFFont font = workbook.createFont();
     35         font.setColor(HSSFColor.BLACK.index);
     36         font.setFontHeightInPoints((short)14);
     37         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
     38         //把字体应用到当前样式
     39         style.setFont(font);
     40         
     41         // 生成并设置另一个样式  
     42         HSSFCellStyle style2 = workbook.createCellStyle();  
     43         style2.setFillForegroundColor(HSSFColor.WHITE.index);  
     44         style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
     45         style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
     46         style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
     47         style2.setBorderRight(HSSFCellStyle.BORDER_THIN);  
     48         style2.setBorderTop(HSSFCellStyle.BORDER_THIN);  
     49         style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
     50         style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
     51         // 生成另一个字体  
     52         HSSFFont font2 = workbook.createFont();  
     53         font2.setFontHeightInPoints((short)12);
     54         font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
     55         // 把字体应用到当前的样式  
     56         style2.setFont(font2);
     57         
     58         // 生成并设置另一个样式  
     59         HSSFCellStyle style3 = workbook.createCellStyle();  
     60         style3.setFillForegroundColor(HSSFColor.WHITE.index);  
     61         style3.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
     62         style3.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
     63         style3.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
     64         style3.setBorderRight(HSSFCellStyle.BORDER_THIN);  
     65         style3.setBorderTop(HSSFCellStyle.BORDER_THIN);  
     66         style3.setAlignment(HSSFCellStyle.ALIGN_LEFT);  
     67         style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
     68         // 生成另一个字体  
     69         HSSFFont font3 = workbook.createFont();  
     70         font3.setFontHeightInPoints((short)12);
     71         font3.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
     72         // 把字体应用到当前的样式  
     73         style3.setFont(font3);
     74         
     75         // 生成并设置另一个样式   样式4
     76         HSSFCellStyle style4 = workbook.createCellStyle();  
     77         style4.setFillForegroundColor(HSSFColor.WHITE.index);  
     78         style4.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
     79         style4.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
     80         style4.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
     81         style4.setBorderRight(HSSFCellStyle.BORDER_THIN);  
     82         style4.setBorderTop(HSSFCellStyle.BORDER_THIN);  
     83         style4.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
     84         style4.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
     85         // 生成另一个字体  
     86         HSSFFont font4 = workbook.createFont();  
     87         font4.setFontHeightInPoints((short)11);
     88         // 把字体应用到当前的样式  
     89         style4.setFont(font4);
     90         
     91         //产生表格标题行
     92         HSSFRow row = sheet.createRow(0);
     93         HSSFCell cel = row.createCell(0);
     94         cel.setCellStyle(style);
     95         cel.setCellValue("天维讯达无线电设备检测(北京)有限责任公司");
     96         HSSFCell c2 = row.createCell(1);
     97         c2.setCellStyle(style);
     98         HSSFCell c3 = row.createCell(2);
     99         c3.setCellStyle(style);
    100         HSSFCell c4 = row.createCell(3);
    101         c4.setCellStyle(style);
    102         HSSFCell c5 = row.createCell(4);
    103         c5.setCellStyle(style);
    104         HSSFCell c6 = row.createCell(5);
    105         c6.setCellStyle(style);
    106         HSSFCell c7 = row.createCell(6);
    107         c7.setCellStyle(style);
    108         //合并单元格
    109         sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));
    110         
    111         //2行
    112         HSSFRow row2 = sheet.createRow(1);
    113         HSSFCell cel2l = row2.createCell(0);
    114         cel2l.setCellStyle(style2);
    115         if(exportBatch.equals("0")){
    116             cel2l.setCellValue("出库单");
    117         }else{
    118             cel2l.setCellValue("出库单(第"+ckdj.getBatch()+"批)");
    119         }
    120         HSSFCell rc2 = row2.createCell(1);
    121         rc2.setCellStyle(style);
    122         HSSFCell rc3 = row2.createCell(2);
    123         rc3.setCellStyle(style);
    124         HSSFCell rc4 = row2.createCell(3);
    125         rc4.setCellStyle(style);
    126         HSSFCell rc5 = row2.createCell(4);
    127         rc5.setCellStyle(style);
    128         HSSFCell rc6 = row2.createCell(5);
    129         rc6.setCellStyle(style);
    130         HSSFCell rc7 = row2.createCell(6);
    131         rc7.setCellStyle(style);
    132         sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 6)); //合并单元格
    133         
    134         //3行
    135         HSSFRow rowhead = sheet.createRow(2);
    136         sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 4)); //合并单元格
    137         //3行左
    138         HSSFCell cel3l = rowhead.createCell(0);
    139         cel3l.setCellStyle(style3);
    140         cel3l.setCellValue("所属项目:"+ckdj.getProjectNumber());
    141         //3行右
    142         HSSFCell cel3r = rowhead.createCell(5);
    143         cel3r.setCellStyle(style2);
    144         cel3r.setCellValue("出库单号:"+ckdj.getReleasingNumber());
    145         HSSFCell cel27 = rowhead.createCell(6);
    146         cel27.setCellStyle(style2);
    147         sheet.addMergedRegion(new CellRangeAddress(2, 2, 5, 6));
    148         
    149         HSSFRow rowbody = sheet.createRow(3);
    150         for (int i = 0; i < headers.length; i++) {
    151             HSSFCell cell = rowbody.createCell(i);
    152             cell.setCellStyle(style2);
    153             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
    154             cell.setCellValue(text);
    155         }
    156         
    157         //遍历集合数据,产生数据行
    158         Iterator it = ckdj.getGoods().iterator();
    159         int index = 3;
    160         while (it.hasNext()) {
    161             index++;
    162             row = sheet.createRow(index);
    163             CkdjDetailed t = (CkdjDetailed)it.next();
    164             
    165             //创建单元格
    166             HSSFCell cell0 = row.createCell(0);
    167             cell0.setCellStyle(style4);
    168             cell0.setCellValue(t.getNum());
    169             
    170             HSSFCell cell1 = row.createCell(1);
    171             cell1.setCellStyle(style4);
    172             cell1.setCellValue(t.getEqName());
    173             
    174             HSSFCell cell2 = row.createCell(2);
    175             cell2.setCellStyle(style4);
    176             cell2.setCellValue(t.getEqStandard());
    177             
    178             HSSFCell cell3 = row.createCell(3);
    179             cell3.setCellStyle(style4);
    180             cell3.setCellValue(t.getEqSernumber());
    181             
    182             HSSFCell cell4 = row.createCell(4);
    183             cell4.setCellStyle(style4);
    184             cell4.setCellValue(t.getEqNums());
    185             
    186             HSSFCell cell5 = row.createCell(5);
    187             cell5.setCellStyle(style4);
    188             cell5.setCellValue(t.getEqUnits());
    189             
    190             HSSFCell cell6 = row.createCell(6);
    191             cell6.setCellStyle(style4);
    192             cell6.setCellValue("");
    193         }
    194         HSSFRow last1 = sheet.createRow(index+3);
    195         HSSFCell lcel1 = last1.createCell(4);
    196         lcel1.setCellValue("送货人:");
    197         HSSFRow last2 = sheet.createRow(index+4);
    198         HSSFCell lcel2 = last2.createCell(4);
    199         lcel2.setCellValue("送货时间:");
    200         HSSFRow last3 = sheet.createRow(index+5);
    201         HSSFCell lcel3 = last3.createCell(4);
    202         lcel3.setCellValue("收货人:");
    203         HSSFRow last4 = sheet.createRow(index+6);
    204         HSSFCell lcel4 = last4.createCell(4);
    205         lcel4.setCellValue("收货时间:");
    206         return workbook;
    207     }
    208     
    209     /**
    210      * 创建仓库workbook
    211      * @param title
    212      * @param headers
    213      * @param rkdjs
    214      * @return
    215      */
    216     public HSSFWorkbook exportWareExcel(String title,String[] headers,List<Rkdj> rkdjs){
    217         
    218         //声明一个工作薄
    219         HSSFWorkbook workbook = new HSSFWorkbook();
    220         //生成一个表格
    221         HSSFSheet sheet = workbook.createSheet(title);
    222         //设置表格默认列宽为15个字节
    223         sheet.setDefaultColumnWidth(15);
    224         //生成一个样式
    225         HSSFCellStyle style = workbook.createCellStyle();
    226         //设置样式
    227         style.setFillForegroundColor(HSSFColor.WHITE.index);
    228         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    229         style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
    230         style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
    231         style.setBorderRight(HSSFCellStyle.BORDER_THIN);
    232         style.setBorderTop(HSSFCellStyle.BORDER_THIN);
    233         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    234         //生成一个字体
    235         HSSFFont font = workbook.createFont();
    236         font.setColor(HSSFColor.BLACK.index);
    237         font.setFontHeightInPoints((short)14);
    238         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    239         //把字体应用到当前样式
    240         style.setFont(font);
    241         
    242         // 生成并设置另一个样式  
    243         HSSFCellStyle style2 = workbook.createCellStyle();  
    244         style2.setFillForegroundColor(HSSFColor.WHITE.index);  
    245         style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
    246         style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
    247         style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
    248         style2.setBorderRight(HSSFCellStyle.BORDER_THIN);  
    249         style2.setBorderTop(HSSFCellStyle.BORDER_THIN);  
    250         style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
    251         style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
    252         // 生成另一个字体  
    253         HSSFFont font2 = workbook.createFont();  
    254         font2.setFontHeightInPoints((short)12);
    255         font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    256         // 把字体应用到当前的样式  
    257         style2.setFont(font2);
    258         
    259         // 生成并设置另一个样式  
    260         HSSFCellStyle style3 = workbook.createCellStyle();  
    261         style3.setFillForegroundColor(HSSFColor.WHITE.index);  
    262         style3.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
    263         style3.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
    264         style3.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
    265         style3.setBorderRight(HSSFCellStyle.BORDER_THIN);  
    266         style3.setBorderTop(HSSFCellStyle.BORDER_THIN);  
    267         style3.setAlignment(HSSFCellStyle.ALIGN_LEFT);  
    268         style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
    269         // 生成另一个字体  
    270         HSSFFont font3 = workbook.createFont();  
    271         font3.setFontHeightInPoints((short)12);
    272         font3.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    273         // 把字体应用到当前的样式  
    274         style3.setFont(font3);
    275         
    276         // 生成并设置另一个样式   样式4
    277         HSSFCellStyle style4 = workbook.createCellStyle();  
    278         style4.setFillForegroundColor(HSSFColor.WHITE.index);  
    279         style4.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
    280         style4.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
    281         style4.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
    282         style4.setBorderRight(HSSFCellStyle.BORDER_THIN);  
    283         style4.setBorderTop(HSSFCellStyle.BORDER_THIN);  
    284         style4.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
    285         style4.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
    286         // 生成另一个字体  
    287         HSSFFont font4 = workbook.createFont();  
    288         font4.setFontHeightInPoints((short)11);
    289         // 把字体应用到当前的样式  
    290         style4.setFont(font4);
    291         
    292         //列头
    293         HSSFRow rowbody = sheet.createRow(0);
    294         for (int i = 0; i < headers.length; i++) {
    295             HSSFCell cell = rowbody.createCell(i);
    296             cell.setCellStyle(style2);
    297             HSSFRichTextString text = new HSSFRichTextString(headers[i]);
    298             cell.setCellValue(text);
    299         }
    300         
    301         //遍历集合数据,产生数据行
    302         int index = 0;
    303         Iterator it = rkdjs.iterator();
    304         while (it.hasNext()) {
    305             index++;
    306             HSSFRow row = sheet.createRow(index);
    307             Rkdj t = (Rkdj) it.next();
    308             //创建单元格
    309             HSSFCell cell0 = row.createCell(0);
    310             cell0.setCellStyle(style4);
    311             cell0.setCellValue(t.getJoinTime());
    312             
    313             HSSFCell cell1 = row.createCell(1);
    314             cell1.setCellStyle(style4);
    315             cell1.setCellValue(t.getJoinNumbers());
    316             
    317             HSSFCell cell2 = row.createCell(2);
    318             cell2.setCellStyle(style4);
    319             cell2.setCellValue(t.getEquipmentName());
    320             
    321             HSSFCell cell3 = row.createCell(3);
    322             cell3.setCellStyle(style4);
    323             cell3.setCellValue(t.getStandard());
    324             
    325             HSSFCell cell4 = row.createCell(4);
    326             cell4.setCellStyle(style4);
    327             cell4.setCellValue(t.getSeriesNumber());
    328             
    329             HSSFCell cell5 = row.createCell(5);
    330             cell5.setCellStyle(style4);
    331             cell5.setCellValue(t.getLocation());
    332             
    333             HSSFCell cell6 = row.createCell(6);
    334             cell6.setCellStyle(style4);
    335             cell6.setCellValue(t.getAmount());
    336             
    337             HSSFCell cell7 = row.createCell(7);
    338             cell7.setCellStyle(style4);
    339             cell7.setCellValue(t.getStock());
    340             
    341             HSSFCell cell8 = row.createCell(8);
    342             cell8.setCellStyle(style4);
    343             cell8.setCellValue(t.getComments());
    344         }
    345         return workbook;
    346     }
    347 }

    这样基本就没什么问题了,本人小白,希望能得到更多的指导!在此多谢了....

  • 相关阅读:
    Google Chrome 默认非安全端口列表
    js判断类型的方法
    博客园样式排版自定义
    easyloader.js源代码分析
    JQuery操作cookies
    js获取iframe里面的dom
    封装GetQueryString()方法来获取URL的value值
    js 获取系统时间:年月日 星期 时分秒(动态)
    vue 滚动加载数据
    props 父组件给子组件传递参数
  • 原文地址:https://www.cnblogs.com/xinzehome/p/3760654.html
Copyright © 2011-2022 走看看