`
crabdave
  • 浏览: 1295672 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JXL导出Excel数据表

    博客分类:
  • Java
阅读更多

JXL导出Excel数据表

 

封装了一个简单易用、通用、动态的从数据库导出到Excel的方法,可以动态的指定导出那些列,显示什么名字,按什么顺序显示;支持本地文件存储和JSP/Servlet文件下载。

本方法包括两个类,Column是辅助类,Excel是主类:

Column:

 

/** 
 * 用于Excel导出的辅助类,映射数据结果集(ResultSet)内列名的元数据和Excel内的显示列名  
 */  
public class Column {  
    private int index;  
    private String metaName;  
    private String displayName;  
    private int length;  
  
    /** 
     * 构造函数 
     *  
     * @param index 
     *            显示顺序,0 为显示的第一列 
     * @param meta 
     *            元列名,在ResultSet内的名字,必须大写 
     * @param display 
     *            显示列名,在Excel内的显示,可以是任何文字 
     * @param length 
     *            列名长度 
     */  
    public Column(int index, String meta, String display,int length) {  
        this.index = index;  
        this.metaName = meta;  
        this.displayName = display;  
        this.length = length;  
    }  
  
    /** 
     * 显示列名,在Excel内的显示,可以是任何文字 
     *  
     * @return 
     */  
    public String getDisplayName() {  
        return displayName;  
    }  
  
    /** 
     * 显示顺序,0 为显示的第一列 
     *  
     * @return 
     */  
    public int getIndex() {  
        return index;  
    }  
  
    /** 
     * 元列名,在ResultSet内的名字,必须大写 
     *  
     * @return 
     */  
    public String getMetaName() {  
        return metaName;  
    }  
  
    public void setDisplayName(String displayName) {  
        this.displayName = displayName;  
    }  
  
    public void setIndex(int index) {  
        this.index = index;  
    }  
  
    public void setMetaName(String metaName) {  
        this.metaName = metaName;  
    }  
  
    public int getLength() {  
        return length;  
    }  
  
    public void setLength(int length) {  
        this.length = length;  
    }  
}  

Excel:

   /**

     * 从数据库读数据,写入Excel 
     *  
     * @param os 
     *            数据流,如果是写本地文件的话,可以是FileOutputStream; 
     *            如果是写Web下载的话,可以是ServletOupputStream 
     * @param title 
     *            Excel工作簿的标题,如果不用的话,可以写null或者"" 
     * @param rs 
     *            数据结果集 
     * @param map 
     *            数据结果集对应Excel表列名映射:key对应数据结果集的列名,必须是大写; value,目前只能对应Column对象 
     * @throws Exception 
     *             方法内的父类异常有SQLException和IOException 
     */  
    public static void export(OutputStream os, String title, ResultSet rs,  
            Map map) throws Exception {    
        jxl.write.WritableWorkbook wbook = Workbook.createWorkbook(os); // 建立excel文件  
        jxl.write.WritableSheet wsheet = wbook.createSheet("第一页", 0); // sheet名称  
        jxl.write.Label wlabel = null; // Excel表格的Cell  
          
        ResultSetMetaData rsmd = rs.getMetaData();  
        int count = rsmd.getColumnCount();  
          
        // 如果有标题的话,要设置一下偏移  
        int offset = 1;  
        if (title == null || title.trim().equals(""))  
            offset = 0;  
        else {  
            // 设置标题字体  
            int numTitle = 18;// 列名字体大小  
            jxl.write.WritableFont titleFont = new jxl.write.WritableFont(  
            WritableFont.createFont("宋体"), numTitle, WritableFont.BOLD);  
            jxl.write.WritableCellFormat titleFormat = new jxl.write.WritableCellFormat(titleFont);  
            titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条  
            titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐  
            titleFormat.setAlignment(Alignment.CENTRE); // 水平对齐    
            // 添加excel标题  
            jxl.write.Label wlabel1 = new jxl.write.Label(0, 0, title, titleFormat);          
            wsheet.addCell(wlabel1);  
            wsheet.mergeCells(0, 0, count-1, 0);//合并单元格  
        }  
         // 设置列名字体  
        int charTitle = 12;// 列名字体大小  
        jxl.write.WritableFont columnFont = new jxl.write.WritableFont(  
        WritableFont.createFont("宋体"), charTitle, WritableFont.BOLD);  
  
        jxl.write.WritableCellFormat columnFormat = new jxl.write.WritableCellFormat(  
                columnFont);  
        columnFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条  
        columnFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐  
        columnFormat.setAlignment(Alignment.CENTRE); // 水平对齐  
        columnFormat.setWrap(true); // 是否换行  
        columnFormat.setBackground(Colour.GRAY_25);// 背景色暗灰-25%  
          
        // 根据原数据和map来创建Excel的列名  
          
        for (int i = 1; i <= count; i++) {  
            String name = rsmd.getColumnName(i).toUpperCase();  
            if (map.containsKey(name)) {  
                Column col = (Column) map.get(name);  
                wlabel = new jxl.write.Label(col.getIndex(), offset, col  
                        .getDisplayName(),columnFormat);  
                wsheet.setColumnView(i-1, col.getLength()); // 设置列宽,第1列  
                wsheet.addCell(wlabel);  
            }  
        }  
  
        // 设置正文字体  
        int charNormal = 10;// 标题字体大小  
        WritableFont normalFont = new WritableFont(WritableFont  
          .createFont("宋体"), charNormal);  
        jxl.write.WritableCellFormat normalFormat = new jxl.write.WritableCellFormat(  
          normalFont);  
        normalFormat.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条  
        normalFormat.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直对齐  
        normalFormat.setAlignment(Alignment.CENTRE);// 水平对齐  
        normalFormat.setWrap(true); // 是否换行  
          
        // 往Excel输出数据  
        int rowIndex = 1 + offset;  
        Collection array = map.values();  
        while (rs.next()) {  
            Iterator it = array.iterator();  
            while (it.hasNext()) {  
                Column col = (Column) it.next();  
                String value = rs.getString(col.getMetaName());  
                wlabel = new jxl.write.Label(col.getIndex(), rowIndex, value,normalFormat);  
                wsheet.addCell(wlabel);  
            }  
            rowIndex++;  
        }  
        wbook.write(); // 写入文件  
        wbook.close();  
        os.flush();  
        os.close();  
    }  
}  

 //JSP页面的下载如下,同样的代码也可以改成Servlet的

 <%
 ConnectionPool pool = ConnectionPool.getInstance();  
 Connection conn = null;  
 ResultSet rs = null;  
 Statement stmt = null;  
   
 conn = pool.getConnection();  
 stmt = conn.createStatement();  
 rs = stmt.executeQuery("Select t.*, t.rowid from mis2_personal_weekly_job_plan t Where Rownum Between 1 And 2");  
   
 HashMap map = new HashMap();  
 map.put("ID", new Column(0, "ID", "编号"));  
 map.put("JOB_CONTENT", new Column(1, "JOB_CONTENT", "工作内容"));  
 map.put("JOB_TARGET", new Column(2, "JOB_TARGET", "工作目标"));  
   
 String fileName = "周工作计划.xls";  
 response.reset();  
  
 response.setHeader("Cache-Control", "public");  
 response.setContentType("application/ms-excel;charset=gbk");  
 //response.setContentType("application/vnd.ms-excel");  
String fn=new String(fileName.getBytes("gb2312"),"ISO8859-1");// 将文件名变成中文  
 response.addHeader("Content-Disposition","attachment;filename=" + fn);  
 Excel.export(response.getOutputStream(), "", rs, map);  
%>  

 


 
补充意见:
1、需要注意在封装字段标题时需要将map的关键字置为大写,不然会找不到的,因为在excel类里将从数据库取到的字段名称进行了toUpperCase()。
2、建议使用个计数器,在map中设置value时我们只需使用var++让他自己去加去,不用去写0,1,2,3...,这样我们在修改调整字段时,就不用去改这些写死的索引号,这样更为灵活一些。
3、导出文件好像不支持中文名,如果写中文它会用字母替代,还是用英文吧。
建议写成如下这样:
 HashMap map = new HashMap();
int k=0;//计数器,这样我们在写map的value值时,就不用在Column里写0,1,2,3...了,真接用k++
//其中map中的关键字都得是大写的,不然会找不到的,因为在excel类里用了.toUpperCase()方法
 map.put("ID".toUpperCase(), new Column(k++, "ID", "编号"));
 map.put("JOB_CONTENT".toUpperCase(), new Column(k++, "JOB_CONTENT", "工作内容"));
 map.put("JOB_TARGET".toUpperCase(), new Column(k++, "JOB_TARGET", "工作目标"));
最后不要使用JSP的方式导出,如果用JSP写导出的话,会出现异常信息:
java.lang.IllegalStateException: 已获取输出流
出现这种异常,只需要把导出的代码写入Servlet即可以解决。
切忌!切忌!
分享到:
评论

相关推荐

    jxl导出excel加水印.zip

    在Java编程环境中,我们经常需要处理数据的导入和导出,Excel作为一种常见的数据存储和展示格式,被广泛应用。`jxl`库是一个流行的Java库,它允许开发者读取、写入和修改Excel文件。本教程将详细介绍如何使用`jxl`库...

    jxl导出excel工具类

    在Java编程领域,导出Excel数据是一项常见的任务,特别是在数据处理和报表生成中。`jxl`库是一个广泛使用的开源库,它允许开发者方便地读取和写入Microsoft Excel文件。本文将详细介绍如何使用`jxl`库创建一个导出...

    jxl实现导出excel数据

    在Java编程环境中,导出Excel数据是一项常见的任务,特别是在数据处理、报表生成或者数据分析的应用中。JXL库是一个广泛使用的开源库,它提供了方便的方式来读取、写入和操作Excel文件。下面我们将深入探讨如何使用...

    使用jxl导出Excel表的好例子

    在Java编程环境中,导出数据到Excel表格是一个常见的需求,特别是在数据分析、报表生成或数据交换时。`jxl`库是Java中一个广泛使用的库,它允许开发者方便地读取和写入Microsoft Excel文件。本篇文章将深入探讨如何...

    Android-Android使用jxl快速导出excel表

    Sheet sheet = workbook.createSheet("数据表", 0); ``` 3. **设置单元格内容**:在工作表上创建并设置单元格的值,使用`Row.createCell()`和`Cell.setCellValue()`方法。 ```java Row row = sheet.createRow(0...

    jxl导出excel

    标题中的“jxl导出excel”指的是使用JExcelApi(简称jxl)库来生成和导出Microsoft Excel格式的文件。JExcelApi是一个开源Java库,允许开发者在Java应用程序中读取、写入和修改Excel文件。这个工具类在处理大量数据...

    jxl读写excel数据,输出图片

    JXL库提供了方便的API,使得开发者可以轻松地处理Excel数据,包括读取单元格内容、修改工作表、添加公式,以及本文重点讨论的——插入和输出图片。 **一、JXL库介绍** JXL是一个开源的Java库,专门用于处理Excel...

    jxl模版生成excel

    JExcelAPI是一个开源项目,允许程序开发者读写Microsoft Excel文件,它支持从Java数据结构直接导出到Excel格式,同时也可读取Excel数据并转换为Java对象。 **描述解析:** 描述中提到的"采用类似EL表达式的方式...

    java利用jxl生成excel文件

    Java使用JXL库生成Excel文件是一项常见的任务,特别是在数据处理、报表生成或导出时。JXL是一个开源的Java库,允许我们读取、写入和修改Excel文件。以下将详细讲解如何使用JXL库来生成Excel文件。 首先,我们需要在...

    jxl方式生成excel表格.zip

    jxl库支持多种Excel操作,包括创建新的工作簿、添加工作表、设置单元格格式、插入公式以及读取Excel数据。这个库的使用极大地简化了在Java中处理Excel文件的工作流程。 在描述中提到的"txt转为excel Demo",这是一...

    jxl导出excel总结

    《jxl导出Excel的深度解析与应用》 在信息化高度发展的今天,Excel作为数据处理和分析的重要工具,被广泛应用于各个领域。Java作为一种强大的编程语言,如何与Excel进行交互,成为了许多开发者关注的焦点。jxl库...

    jxl导入导出excel

    四、导出Excel数据 1. **创建工作簿** 使用`Workbook.createWorkbook(File)`方法创建一个新的工作簿: ```java WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls")); ``` 2. **创建...

    jxl对excel添加水印(含有setWaterMarkImage方法).zip

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成等领域。`jxl`库是一个广泛使用的开源库,它允许开发者用Java读取、写入和修改Excel文件。在这个特定的场景中,我们将探讨如何...

    java JXL导入导出Excel源码及jfreechart 生成折线图,饼图

    java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图

    jxl 导出 excel

    在Java编程环境中,JXL库是一个非常流行...总之,使用JXL库在Java中导出Excel文件是一项常见的任务,尤其在数据分析和报表生成场景下。通过熟悉JXL的API,你可以轻松地定制化Excel文件的格式和内容,满足各种业务需求。

    JXL操作EXCEL 数据库导出EXCEL相关文件

    在IT行业中,处理和操作Excel数据是一项常见的任务,特别是在数据导入导出、分析和报告生成等领域。JXL是一个Java库,专门用于读取、写入和修改Excel文件,它为Java开发者提供了一种方便的方式来处理Excel数据,而...

    jxl读取excel数据(带实例)

    在Java编程环境中,处理Excel数据是一项常见的任务,特别是在数据分析、报表生成或数据导入导出时。JXL库是一个广泛使用的开源库,它允许开发者轻松地读取和写入Excel文件。本文将详细介绍如何使用JXL库来读取Excel...

    JXL导出excel的示例及文档

    在本示例中,我们将探讨如何使用JXL导出Excel以及JXL的API文档。 1. **JXL的基本用法** - **创建工作簿(Workbook)**: 使用`Workbook.createWorkbook()`方法创建一个新的Excel工作簿对象。 - **创建工作表...

    jxl导出excel数据的详细介绍和实例

    ### jxl导出Excel数据的详细介绍与实例 #### 一、引言 在Java开发过程中,经常需要将数据导出到Excel文件中。jxl是一个非常实用的Java库,用于读取和写入Microsoft Excel文件。本文将详细介绍如何使用jxl来导出数据...

Global site tag (gtag.js) - Google Analytics