很多时候我们都会去操作一下excel文件,或者将数据专为excel供用户下载。
用的最多的就是将 一个报表生成excel文件供用户下载。而报表基本上就是标题,标题下显示内容。
如果你的报表也是这样的,就能用下面的类方便的生成excel文件,并输出到用户端。
用的最多的就是将 一个报表生成excel文件供用户下载。而报表基本上就是标题,标题下显示内容。
如果你的报表也是这样的,就能用下面的类方便的生成excel文件,并输出到用户端。
- /**
- *
- */
- package com.royalstone.workbook;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.sql.ResultSet;
- import java.sql.ResultSetMetaData;
- import java.sql.SQLException;
- import java.sql.Types;
- import javax.servlet.http.HttpServletResponse;
- import jxl.write.DateTime;
- import jxl.write.Label;
- import jxl.write.WritableCell;
- import jxl.write.WritableCellFormat;
- import jxl.write.WritableFont;
- import jxl.write.WritableSheet;
- import jxl.write.WritableWorkbook;
- import jxl.write.WriteException;
- import jxl.write.biff.RowsExceededException;
- import com.royalstone.util.daemon.LangAdapter;
- /**
- * @author 造币机器
- * 为兼容以前的excel导入而写的替代类
- */
- public class Workbook {
- public Workbook(OutputStream os) throws IOException{
- book = jxl.Workbook.createWorkbook(os);
- }
- /**
- * 增加一个工作表格
- * @param rs 记录结果集
- * @param sheetName 表格名
- * @param title 标题
- * @throws RowsExceededException
- * @throws WriteException
- * @throws SQLException
- */
- public void addSheet(ResultSet rs, String sheetName, String[] title) throws RowsExceededException, WriteException, SQLException{
- WritableSheet sheet = book.createSheet(sheetName, sheetCount++);
- addTitle(title, sheet);
- addBody(rs, sheet);
- }
- /**
- * 输出到客户端
- * @param response 这个就不详细解释了
- * @param fileName 客户下载时的文件名
- * @throws IOException
- * @throws WriteException
- */
- public void output(HttpServletResponse response,String fileName) throws IOException, WriteException{
- response.reset();
- response.setContentType( "application/vnd.ms-excel" );
- response.setHeader( "Content-disposition", "attachment; filename=" + fileName );
- book.write();
- book.close();
- }
- /**
- * 添加标题
- * @param title
- * @param sheet
- * @throws RowsExceededException
- * @throws WriteException
- */
- private void addTitle(String[] title,WritableSheet sheet) throws RowsExceededException, WriteException{
- for (int i = 0; i < title.length; i++) {
- Label label=new Label(i,0,title[i],formatTitle);
- sheet.addCell(label);
- }
- }
- /**
- * 添加主体内容
- * @param rs
- * @param sheet
- * @throws SQLException
- * @throws RowsExceededException
- * @throws WriteException
- */
- private void addBody(ResultSet rs,WritableSheet sheet) throws SQLException, RowsExceededException, WriteException{
- ResultSetMetaData meta = rs.getMetaData();
- int row = 1;
- while(rs.next()){
- for(int i=1;i<=meta.getColumnCount();i++){
- sheet.addCell((WritableCell) parseMetaData(rs, meta, i, row));
- }
- row++;
- }
- }
- /**
- * 根据字段类型自动生成格式
- * @param rs
- * @param meta
- * @param col
- * @param row
- * @return
- * @throws SQLException
- */
- private Object parseMetaData(ResultSet rs,ResultSetMetaData meta,int col,int row) throws SQLException{
- Object o = null;
- switch(meta.getColumnType(col)){
- case Types.DATE:
- case Types.TIME:
- case Types.TIMESTAMP:
- o = new DateTime(col-1,row,rs.getDate(col),formatDate);
- break;
- case Types.DECIMAL:
- case Types.DOUBLE:
- o = new jxl.write.Number(col-1,row,rs.getDouble(col),formatNumber);
- break;
- case Types.SMALLINT:
- case Types.INTEGER:
- case Types.NUMERIC:
- o = new jxl.write.Number(col-1,row,rs.getInt(col),formatNumber);
- break;
- default:
- o = new Label(col-1,row,adapter.fromLocal(rs.getString(col)));
- }
- return o;
- }
- final private LangAdapter adapter = new LangAdapter();
- private int sheetCount=0;
- private WritableWorkbook book ;
- final static WritableCellFormat formatTitle=new WritableCellFormat(new WritableFont(WritableFont.COURIER,12,WritableFont.BOLD));
- final static WritableCellFormat formatNumber=new WritableCellFormat(new WritableFont(WritableFont.TAHOMA,10));
- final static WritableCellFormat formatDate=new WritableCellFormat(new WritableFont(WritableFont.TIMES,10));
- }