nomandia 发表于 2013-1-15 03:01:39

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

很久以前。。。自己写的一个通过SQL语句导出Excel文件下载的程序,其中用到了POI库。
程序并不完整比如需要传入一个Connection,总的来说还是比较值得回忆的吧。http://www.agoit.com/images/smiles/icon_arrow.gif
By the way,我并没有写测试的main函数。http://www.agoit.com/images/smiles/icon_biggrin.gif
 
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]
查看完整版本: Poi的一个实例——用SQL动态导出Excel文件