导出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 }

二,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 }

两者区别:

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

时间: 2024-11-09 00:07:25

导出Excel通用工具类的相关文章

javaEE开发之导出excel工具类

web开发中,一个系统的普通需求也包含导出excel,一般採用POI做统计报表导出excel. 导出excel工具类: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import o

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ?Copyright 蕃薯耀 2017年9月13日 http://www.cnblogs.com/fanshuyao/ 直接上代码: import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.ref

导出Excel帮助类

using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.OleDb; using System.Web; using System.Web.UI; namespace AIMSCommon { /// <summary> /// 导出Excel帮助类 /// </summary> public class ExcelHelper {

web开发之导出excel工具类

web开发中,一个系统的普通需求也包括导出excel,一般采用POI做统计报表导出excel. 导出excel工具类: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import o

MVC NPOI Linq导出Excel通用类

之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = 0, Float = 1, Double = 2, String = 3, DateTime = 4, Date = 5 } public class ExportFieldInfo { /// <summary> /// 字段名,用于反射获取值 /// </summary> publi

java 导出xls 通用工具类

java  导出xls 通用工具类 package org.rui..util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.M

MVC AJAX导出Excel通用类

通用类: public enum DataTypeEnum { Int = 0, Float = 1, Double = 2, String = 3, DateTime = 4, Date = 5 } public class ExportFieldInfo { /// <summary> /// 字段名,用于反射获取值 /// </summary> public string FieldName { get; set; } /// <summary> /// 中文名,

导出Excel工具类(一个主表多个明细表)

①ExcelData.java(Excel数据封装类) package com.kentra.util; import java.util.List; import java.util.Map; /**  *   * 描述:为导出Excel文件封装数据  * 封装Excel文件数据注意事项:  * 1.heads(标题行):是一个字符串, 标题与标题之间以逗号分隔如:hears="学号,姓名,性别"  * 2.data: 表示:主数据集合,data是个字符串集合,包含了所有主数据,集合

导出Excel工具类

导出Excel的工具方法,主要是生成excel文件: public static void writeFailureReasonToExcelFile(List<FailureReasonResponseEntity> queryAllFailureReasonCountList,String path){ try { //创建一个工作簿 excel文件 XSSFWorkbook workbook = new XSSFWorkbook(); //创建一个标签页 XSSFSheet sheet