`

Poi的一个实例——用SQL动态导出Excel文件

阅读更多

很久以前。。。自己写的一个通过SQL语句导出Excel文件下载的程序,其中用到了POI库。

程序并不完整比如需要传入一个Connection,总的来说还是比较值得回忆的吧。

By the way,我并没有写测试的main函数。

 

package com.yxhc.util.execl ;

import java.io.IOException ;
import java.io.OutputStream ;
import java.sql.Connection ;
import java.sql.PreparedStatement ;
import java.sql.ResultSet ;
import java.sql.ResultSetMetaData ;
import java.sql.SQLException ;
import java.util.Date ;
import javax.servlet.http.HttpServletResponse ;

import org.apache.commons.logging.Log ;
import org.apache.commons.logging.LogFactory ;
import org.apache.poi.hssf.usermodel.HSSFCell ;
import org.apache.poi.hssf.usermodel.HSSFCellStyle ;
import org.apache.poi.hssf.usermodel.HSSFRow ;
import org.apache.poi.hssf.usermodel.HSSFSheet ;
import org.apache.poi.hssf.usermodel.HSSFWorkbook ;
import com.yxhc.util.dbUtil.ConnectionUtil ;

/**
 * @author Great nomandia
 */
public class ExcelUtil {

    private static Log log = LogFactory.getLog( ExcelUtil.class ) ;

    private static String shtName = "" ;

    private static String[] cNames = null ;

    private static String[] cLabels = null ;

    private static int rpp = 200 ;

    private static HSSFCellStyle style = null ;

    /**
     * 通过给定的Sql导出Excel文件到Response输出流,需要指定Connection
     * @param response HttpServletResponse Response
     * @param conn Connection 指定的数据库连接
     * @param sqlStr String 查询的Sql语句
     * @param sheetName String 导出的Excel Sheet名称
     * @param columnNames String[] 导出的 Excel 列名称
     * @param rowPerPage int 每一个Sheet页的行数
     * @throws SQLException
     */
    public static void export( HttpServletResponse response , Connection conn ,
                               String sqlStr , String sheetName ,
                               String columnNames[] , int rowPerPage )
        throws SQLException {
        PreparedStatement ps = null ;
        ResultSet rs = null ;
        ps = conn.prepareStatement( sqlStr ) ;
        rs = ps.executeQuery() ;

        ResultSetMetaData rsmd = rs.getMetaData() ;
        if ( rowPerPage <= 10000 && rowPerPage >= 1 ) {
            rpp = rowPerPage ;
        }
        if ( !"".equals( sheetName ) && null != sheetName ) {
            shtName = sheetName ;
        }
        else {
            shtName = rsmd.getTableName( 0 ) ;
        }
        cNames = getColumnNames( rsmd ) ;
        if ( null != columnNames ) {
            cLabels = columnNames ; //compare( columnNames ) ;
        }
        else {
            cLabels = cNames ;
        }

        HSSFWorkbook wb = new HSSFWorkbook() ;
        style = wb.createCellStyle() ;
        style.setAlignment( HSSFCellStyle.ALIGN_CENTER ) ;

        HSSFSheet sheet = createSheet( wb , 1 ) ;
        setSheetColumnTitle( sheet ) ;
        int rowCnt = 0 ;
        int sheetNum = 2 ;

        while ( rs.next() ) {
            if ( rowCnt == rpp ) {
                sheet = createSheet( wb , sheetNum ) ;
                setSheetColumnTitle( sheet ) ;
                rowCnt = 0 ;
                sheetNum++ ;
            }
            HSSFRow row = sheet.createRow( rowCnt + 1 ) ;
            for ( int i = 0 ; i < cNames.length ; i++ ) {

                HSSFCell cell = row.createCell( ( short ) i ) ;
                cell.setEncoding( HSSFCell.ENCODING_UTF_16 ) ;
                String val = rs.getString( cNames[ i ] ) ;
                if ( null == val ) {
                    val = "" ;
                }
                cell.setCellValue( val.toUpperCase() ) ;
            }
            rowCnt++ ;
        }
        try {
            OutputStream os = response.getOutputStream() ;
            response.reset() ;
            response.setContentType( "application/vnd.ms-excel" ) ;
            response.setHeader( "Content-disposition" ,
                                "attachment; filename=" + getFileName( shtName ) ) ;
            wb.write( os ) ;
            if ( conn != null ) {
                conn.close() ;
            }
        }
        catch ( IOException ex ) {
            log.info( "Export Excel file error ! " + ex.getMessage() ) ;
        }
    }

    /**
     * 设置Sheet页的列属性
     * @param sht HSSFSheet
     */
    private static void setSheetColumnTitle( HSSFSheet sht ) {
        HSSFRow row = sht.createRow( 0 ) ;
        for ( int i = 0 ; i < cLabels.length ; i++ ) {
            HSSFCell cell = row.createCell( ( short ) ( i ) ) ;
            cell.setEncoding( HSSFCell.ENCODING_COMPRESSED_UNICODE) ;
            cell.setCellValue( cLabels[ i ] ) ;
            cell.setCellStyle( style ) ;
        }
    }

    /**
     * 获得源数据中的列名称
     * @param rsmd ResultSetMetaData
     * @return String[]
     */
    private static String[] getColumnNames( ResultSetMetaData rsmd ) {
        try {
            StringBuffer result = new StringBuffer("") ;
            for ( int i = 1 ; i <= rsmd.getColumnCount() ; i++ ) {
                result.append(rsmd.getColumnLabel( i )).append(",");
            }
            if ( result.length()>0 ) {
                return result.substring( 0 , result.length() - 1 ).toString().split( "," ) ;
            }
        }
        catch ( Exception e ) {
            return null ;
        }
        return null ;
    }

    /**
     * 创建一个Sheet页并返回该对象
     * @param wb HSSFWorkbook
     * @param seq int
     * @return HSSFSheet
     */
    private static HSSFSheet createSheet( HSSFWorkbook wb , int seq ) {
        int sup = seq * rpp ;
        int sub = ( seq - 1 ) * rpp + 1 ;
        if ( sub < 1 ) {
            sub = 1 ;
        }
        return wb.createSheet( shtName + "(" + sub + "-" + sup + ")" ) ;
    }

    /**
     * 获得导出的文件全名
     * @param tableName String
     * @return String
     */
    private static String getFileName( String tableName ) {
        return tableName + new Date().getTime() + ".xls" ;
    }
}

 

分享到:
评论
1 楼 18335864773 2017-11-29  
目前 用pageoffice组件的比较多.
POI对Office2003和Office2007的docx、xlsx文件用的是接口完全不兼容的两组对象,pageoffice 能支持各个版本的office .PageOffice提供Word、Excel的简化对象接口,功能齐全,读写文档的调用代码完全统一,并且调用代码比POI、JXL简单很多。

相关推荐

    poi多sheet页导出工具类和实例 包含多个excel导出

    Apache POI 是一个流行的 Java 库,用于读取和写入 Microsoft Office 文件格式,特别是 Excel。在处理大量数据时,由于单个 Excel 工作表(sheet)的限制,我们可能需要将数据分拆到多个 sheet 或多个 Excel 文件中...

    SSM框架利用poi导入导出Excel文件 demo

    在本示例"SSM框架利用poi导入导出Excel文件 demo"中,我们将探讨如何在SSM项目中使用Apache POI库来实现Excel文件的导入与导出功能。 Apache POI是一个流行的开源库,它允许开发者在Java应用程序中创建、修改和显示...

    POI导出操作Excel

    1. **Apache POI**: Apache POI 是一个开源项目,它允许开发人员使用Java读取、写入和修改Microsoft Office格式的文件,如Word (DOC, DOCX), Excel (XLS, XLSX), PowerPoint (PPT, PPTX)等。在本例中,主要关注的是...

    Poi动态导入导出Excel基于Struts2 Hibernate Spring源码工程实例

    1.本动态导入导出Excel工程导入Eclipse即可用行,支持所有版本的Excel导入导出。...2.程序使用Struts2+POI+SQLSever(SSH即Struts2+Hibernate+Spring)实现Excel动态数据导入和导出,压缩包内含程序源码文件。

    基于struts2 spring ibatis poi开发的导出Excel实例

    本实例提供的"exportExcel"可能包含了一个完整的示例代码,包括Struts2的动作类、Spring配置文件、iBatis的Mapper接口和XML映射文件,以及使用POI实现导出功能的具体Java类。通过学习和理解这些代码,开发者可以快速...

    POI EXCEL 导入导出工具设计 SQL2000

    在Java开发中,Apache POI 是一个非常流行的库,它允许开发者读取、写入以及修改Microsoft Office格式的文件,包括Excel(XLS和XLSX格式)。在"POI EXCEL 导入导出工具设计 SQL2000"这个项目中,你将学习到如何利用...

    java利用POI技术上传&导出Excel表格并保存数据至数据库

    1. **解析Excel文件**:使用`org.apache.poi.ss.usermodel.WorkbookFactory`类的静态方法`create()`,传入`InputStream`对象,即可创建一个Workbook实例,代表整个Excel文件。然后,你可以通过`getSheetAt()`或`...

    POI +反射导出数据库到excel

    标题中的“POI +反射导出数据库到excel”是指使用Java的Apache POI库和反射机制,将数据库中的数据高效地导出到Excel文件中。Apache POI是一个流行的开源库,它允许开发者读写Microsoft Office格式的文件,包括Excel...

    java导出excel实例

    总的来说,Java通过Apache POI库导出Excel是一个实用且功能强大的功能,可以帮助开发者轻松地将数据转化为用户友好的Excel文件。在开发过程中,不断学习和理解POI的高级特性和最佳实践,将使你的代码更加高效和健壮...

    android 导出数据到excel表格文件 .zip

    2. **创建Excel工作簿**:使用Apache POI创建一个新的Workbook对象,它是Excel文件的基础。 3. **添加工作表**:向Workbook中添加一个Sheet对象,相当于Excel的表格页。 4. **填充数据**:为每个数据库记录创建一...

    如何在jsp导出到Excel文件

    然后,在`POIExcel`类中,创建一个新的`HSSFWorkbook`实例,并向其中添加一个工作表。遍历查询结果,将每条记录添加到工作表的行中。 **关键代码示例:** ```java // POIExcel.java public void exportExcel...

    Java 使用poi导入excel 并使用xml做数据验证

    1. 加载Excel文件:使用`WorkbookFactory.create()`方法创建一个`Workbook`实例。 2. 获取工作表:通过`Workbook`对象的`getSheetAt()`或`createSheet()`方法获取或创建工作表。 3. 遍历行和单元格:使用`Sheet`对象...

    导出Excel实例项目:dbToExcel

    5. Apache POI使用:使用Apache POI,开发者可以创建一个新的Workbook对象代表Excel文件,然后添加Sheet对象代表工作表,再在Sheet中添加Row和Cell来填充数据。对于复杂的格式设置,如合并单元格、设置字体样式、...

    Excel poi java jsp

    在Java Web开发中,"Excel poi java jsp"是一个常见的技术组合,用于处理Excel文件的导入和导出功能。此组合利用Apache POI库来操作Excel文件,通过Servlet作为服务器端处理逻辑,而JSP则作为用户界面进行交互。下面...

    导出excel实例与资料.zip

    这个“导出excel实例与资料.zip”压缩包包含了一个完整的Java实现导出Excel的示例,以及相关的使用案例和问题解决经验。 首先,让我们探讨Java中导出Excel的基本原理。在Java中,最常用的库是Apache POI,这是一个...

    以数据源方式导出Excel文件,C++.net源代码编写,VisualStudio.net

    3. **操作Excel文件**:如果使用Microsoft Office Interop,需创建Excel Application实例,创建Workbook并添加Worksheet。 ```cpp using namespace Microsoft::Office::Interop::Excel; Application^ excelApp = ...

    Android 数据库并且导出Excel格式文件.zip

    总的来说,这个压缩包提供的内容可能包括一个Android项目,演示了如何从SQLite数据库读取数据并使用特定库(可能是简化版的Apache POI或替代库)将数据导出为Excel文件。开发者可以参考这个项目学习如何实现这样的...

    struts2_spring_ibatis根据模板文件导出Excel

    在这个项目中,“struts2_spring_ibatis根据模板文件导出Excel”是利用这三大框架实现了一个功能,即根据预设的模板文件生成并导出Excel电子表格。 首先,Struts2是基于Model-View-Controller(MVC)架构的Web应用...

    poi 生成 excel 文件 和 数据连接池

    Apache POI 是一个开源项目,专门用于处理 Microsoft Office 格式的文件,如 Word、Excel 和 PowerPoint。在本主题中,我们将重点关注使用 POI 库生成 Excel 文件以及与数据连接池的整合。 首先,让我们深入了解...

    Java实现Excel导入导出数据库的方法示例

    在读取Excel文件时,我们首先需要创建一个POIFSFileSystem对象,然后使用HSSFWorkbook来读取Excel文件。接着,我们可以循环遍历Excel文件中的每个工作表、每行和每列,提取其中的数据。 在将数据导入到数据库中时,...

Global site tag (gtag.js) - Google Analytics