zoukankan      html  css  js  c++  java
  • 导出Excel通用工具类

    导出Excel的两种方法:

    一,POI

    导入poi包

    poi-3.11-beta3-20141111.jar

     1 /**
     2 * 
     3 */
     4 package com.car.ots.mpckp.utils;
     5 
     6 import java.io.OutputStream;
     7 import java.net.URLEncoder;
     8 import java.util.List;
     9 
    10 import javax.servlet.http.HttpServletRequest;
    11 import javax.servlet.http.HttpServletResponse;
    12 
    13 import org.apache.commons.beanutils.BeanUtils;
    14 import org.apache.poi.hssf.usermodel.HSSFCell;
    15 import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    16 import org.apache.poi.hssf.usermodel.HSSFRow;
    17 import org.apache.poi.hssf.usermodel.HSSFSheet;
    18 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    19 
    20 /**
    21 * @author cora.guo
    22 * 
    23 */
    24 public class ExportUtils {
    25 
    26 public static void createExcel(HttpServletRequest req,
    27 HttpServletResponse resp, List<Object> datas, String sheetName,
    28 List<String> headers, List<String> colunmValueNames)
    29 throws Exception {
    30 OutputStream out = null;
    31 try {
    32 // 第一步,创建一个webbook,对应一个Excel文件
    33 resp.setContentType("application/vnd.ms-excel");
    34 resp.setCharacterEncoding("UTF-8");
    35 if (req.getHeader("User-Agent").toLowerCase().indexOf("msie") != -1) {
    36 resp.setHeader("Content-Disposition", "attachment;filename="
    37 + URLEncoder.encode(sheetName, "utf-8") + ".xls");
    38 } else {
    39 resp.setHeader("Content-Disposition", "attachment;filename="
    40 + new String(sheetName.getBytes("utf-8"), "ISO-8859-1")
    41 + ".xls");
    42 }
    43 resp.setHeader("Cache-Control", "max-age=0");
    44 HSSFWorkbook wb = new HSSFWorkbook();
    45 
    46 // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
    47 HSSFSheet sheet = wb.createSheet(sheetName);
    48 // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
    49 HSSFRow row = sheet.createRow(0);
    50 // 第四步,创建单元格,并设置值表头 设置表头居中
    51 HSSFCellStyle style = wb.createCellStyle();
    52 // 创建居中样式
    53 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    54 HSSFCell cell = null;
    55 if (headers != null && headers.size() > 0) {
    56 for (int i = 0; i < headers.size(); i++) {
    57 cell = row.createCell(i);
    58 cell.setCellValue(headers.get(i));
    59 cell.setCellStyle(style);
    60 }
    61 }
    62 // 第五步,写入实体数据 实际应用中这些数据从数据库得到,
    63 if (datas != null && datas.size() != 0) {
    64 for (int r = 0; r < datas.size(); r++) {
    65 Object obj = datas.get(r);
    66 row = sheet.createRow(r+1);
    67 if (colunmValueNames != null
    68 && colunmValueNames.size() != 0) {
    69 for (int j = 0; j < colunmValueNames.size(); j++) {
    70 String name = colunmValueNames.get(j);
    71 String value = BeanUtils.getProperty(obj, name);
    72 // 创建单元格,设置值
    73 cell = row.createCell(j);
    74 cell.setCellStyle(style);
    75 cell.setCellValue(value);
    76 }
    77 }
    78 }
    79 }
    80 out = resp.getOutputStream();
    81 wb.write(out);
    82 } catch (Exception e) {
    83 // TODO Auto-generated catch block
    84 throw new Exception(e);
    85 } finally {
    86 out.close();
    87 }
    88 }
    89 }
    View Code

    二,JXl

    导入包

     1 package com.car.ots.uis.utils;
     2 
     3 import java.net.URLEncoder;
     4 import java.util.List;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import jxl.Workbook;
    10 import jxl.format.Alignment;
    11 import jxl.format.VerticalAlignment;
    12 import jxl.write.Label;
    13 import jxl.write.WritableCellFormat;
    14 import jxl.write.WritableFont;
    15 import jxl.write.WritableSheet;
    16 import jxl.write.WritableWorkbook;
    17 
    18 import org.apache.commons.beanutils.BeanUtils;
    19 
    20 public class ExportUtil {
    21   public static void export(HttpServletRequest req, HttpServletResponse resp, List<Object> datas,
    22       String sheetName, List<String> headers, List<String> colunmValueNames) throws Exception {
    23     // 写入excel
    24     WritableWorkbook wb = null;
    25     WritableSheet ws = null;
    26     Label label = null;
    27 
    28     try {
    29       resp.setContentType("application/vnd.ms-excel");
    30       resp.setCharacterEncoding("UTF-8");
    31       if (req.getHeader("User-Agent").toLowerCase().indexOf("msie") != -1) {
    32         resp.setHeader("Content-Disposition",
    33             "attachment;filename=" + URLEncoder.encode(sheetName, "utf-8") + ".xls");
    34       } else {
    35         resp.setHeader("Content-Disposition",
    36             "attachment;filename=" + new String(sheetName.getBytes("utf-8"), "ISO-8859-1") + ".xls");
    37       }
    38       resp.setHeader("Cache-Control", "max-age=0");
    39       wb = Workbook.createWorkbook(resp.getOutputStream());
    40 
    41       ws = wb.createSheet(sheetName, 0);
    42 
    43       WritableFont bold_font = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD);
    44       WritableCellFormat f = new WritableCellFormat(bold_font);
    45       f.setVerticalAlignment(VerticalAlignment.CENTRE);
    46       f.setAlignment(Alignment.CENTRE);
    47       if(headers!=null&headers.size()!=0){
    48           for (int i = 0; i < headers.size(); i++) {
    49               ws.setColumnView(i, 25);
    50               label = new Label(i, 0, headers.get(i), f);
    51               ws.addCell(label);
    52           }
    53       }
    54 
    55       WritableFont nobold_font = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD);
    56       f = new WritableCellFormat(nobold_font);
    57       f.setVerticalAlignment(VerticalAlignment.CENTRE);
    58       f.setAlignment(Alignment.CENTRE);
    59       if(datas!=null&&datas.size()!=0){
    60           for (int r = 0; r < datas.size(); r++) {
    61               Object obj = datas.get(r);
    62               if (colunmValueNames!=null&&colunmValueNames.size()!=0) {
    63                   for (int j = 0; j < colunmValueNames.size(); j++) {
    64                       String name = colunmValueNames.get(j);
    65                       String value = BeanUtils.getProperty(obj, name);
    66                       label = new Label(j, r + 1, value, f);
    67                       ws.addCell(label);
    68                   }
    69             }
    70           }
    71       }
    72       wb.write();
    73     } catch (Exception e) {
    74       throw new Exception(e);
    75     } finally {
    76       wb.write();
    77       wb.close();
    78 
    79     }
    80   }
    81 
    82 }
    View Code

    两者区别:

    POI为apache公司的一个子项目,主要是提供一组操作windows文档的Java API
    JavaExcel俗称jxl是一开放源码项目,通过它开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。

    JVM虚拟机内存消耗的情况:

    数据量3000条数据,每条60列.JVM虚拟机内存大小64M.
    使用POI:运行到2800条左右就报内存溢出.
    使用JXL:3000条全部出来,并且内存还有21M的空间.
    可想而知,在对内存的消耗方面差距还是挺大的.
    也许是由于JXL在对资源回收利用方面做的不错.

    效率方面:

    也是基于大数据量而言的,数据量小的话基本上差别不大,也不难被发觉.但是大的数据量,POI消耗的JVM内存远比JXL消耗的多.但相比提供的功能的话,JXL又相对弱了点.所以如果要实现的功能比较复杂的情况下可以考虑使用POI,但如果只想生成一些大数据量可以考虑使用JXL

  • 相关阅读:
    并发容器梳理
    CAS总结
    原子类总结and-Git提交出现error: src refspec master does not match any的问题
    简单工厂模式小结
    JVM学习与问题总结——java内存区域与内存溢出异常
    反射机制学习记录
    观察者模式
    IDEA的一些常用设置
    建造者模式
    【[AH2017/HNOI2017]礼物】
  • 原文地址:https://www.cnblogs.com/cora/p/4203185.html
Copyright © 2011-2022 走看看