青岛做网站
        行业新闻
行业新闻
当前位置:首页> 新闻动态 > 行业新闻

建设jsp网站时如何实现数据导出Excel

来源:华软创信  ‌|  ‌类型:青岛做网站/网站建设  |  ‌时间:2013-04-09
  大家好,我是青岛网建设。最近在做一个学校的报名系统,开发语言是jsp,并且客户要求具有在网站后台把数据导出为Excel文件的功能,经过自己查阅资料,总结了一下三种实现方法,今天分享出来,希望对有需要的朋友有所帮助。

方法一: 使用javaexcel(jxl)实现导出Excel数据。

1、需先下载对应的jar包下载地址:http://www.andykhan.com/jexcelapi/jexcelapi_2_6_3.tar.gz

解压后将jxl.jar放入lib下。

2public ActionForward down_excel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

   try {

    String fileName= "test";

     response.setContentType("aplication/msexcel");   //设置文件类型

    response.setHeader("Content-disposition","attachment; filename=" + fileName + ".xls");

    WritableWorkbook book= Workbook.createWorkbook(response.getOutputStream()); //创建文件

    WritableSheet sheet= book.createSheet("sheet", 0);    //创建工作薄

  jxl.write.WritableFont titleFont= new jxl.write.WritableFont(WritableFont.ARIAL, 12, WritableFont.BOLD, false,UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.DARK_BLUE);

    jxl.write.WritableCellFormat titleCellFormat= new jxl.write.WritableCellFormat(titleFont);

  //设置表头

   String[] titles= new String[]{ "手机号码", "订购栏目", "栏目价格", "订购退订时间", "发送时间", "订购来源" , "计费情况","业务状态" };

  int columnLength[]= { 20, 30, 10, 30, 20, 15, 15,15 };

    for (int i= 0; i < titles.length; i++) {

     sheet.setColumnView(i, columnLength[i]); //设置列的宽度

     Label label= new Label(i, 0, titles[i], titleCellFormat);

     sheet.addCell(label);

    }

   //动态填充数据

     Vector vector= this.getDownExcelDao().excel();

     for (int i= 0; i < vector.size(); i++) {

     String[] sdata= (String[]) vector.elementAt(i); 

     for (int j= 0; j < sdata.length; j++) {

      Label wlabel1= new Label(j, i, sdata[j]);

      sheet.addCell(wlabel1);

     }

    }

    book.write();

    book.close();

   } catch (Exception e) {

    e.printStackTrace();

   }

  return null ;

}

3、实现层(JdbcDaoSupport)

public Vector excel(){

   try{

    Vector vect = new Vector();

    StringBuffer sb= new StringBuffer();

    sb.append( " SELECT u.telephone ,i.ITEM_NAME, i.ITEM_PRICE ,t.input_date,u.send_date,t.state,t.account_state,t.dispose_state ");

    sb.append( " FROM user_temp u ,temp_item t ,ITEM_INF i where u.id= t.id and t.item_id= i.ITEM_ID");

    Connection cnn= this.getJdbcTemplate().getDataSource().getConnection();

    Statement st = cnn.createStatement();

    ResultSet rs = st.executeQuery( sb.toString());

    int collength= 0;

    while (rs.next()) {

     collength= rs.getMetaData().getColumnCount();

     String[] rowdata= new String[collength];

     for (int k= 1; k <= collength; k++) {

      rowdata[k - 1]= rs.getString(k);

     }

     vect.add(rowdata);

    }

    rs.close();

    st.close();

    cnn.close();

  

    return vect ;

   }catch (Exception e) {

    e.printStackTrace();

    return null ;

   }

}

4、页面调用

<a href="DownAction?method=down_excel">Excel</a>如此即完成了使用jxl生成excel的例子

/*以下是需注意比较的地方

1:下载时如果出现文件下载 安全警告原因在于生成的文件名带有中文需转码

       actionfileName处如下转码(和一般转码不同特别注意顺序)

         fileName= new String( fileName.getBytes("gbk"),"ISO-8859-1");

2:此例子是根据返回的Vector填充数据的,

该方法若一个结果集包含的数据过多时会出现溢出异常( the exceptino: java heap space)

若采用返回list集合来填充,需变动2 >>1:action中从Vector vector= this.getDownExcelDao().excel();

开始修改如下:

List list= this.getDownExcelDao().excel();

for (int i= 0; i < list.size(); i++) {

   String[] sdata= new String[]{bean.getTelephone(),bean.getITEM_NAME(),bean.getITEM_PRICE(),bean.getInput_date(),bean.getSend_date(),bean.getDispose_state(),bean.getAccount_state(),bean.getState() };

    for (int j= 0; j < sdata.length; j++) {

     Label wlabel1= new Label(j, i, sdata[j]);

     sheet.addCell(wlabel1);

    }

}

>>2:改动实现层的excel()方法如下

               List user_dg_item_list= this.getJdbcTemplate().queryForList( sb.tiString);

   List excel_list= new ArrayList();

    if ( user_dg_item_list !=null && user_dg_item_list.size() > 0 ){

     Iterator it= user_dg_item_list.iterator();

     while( it.hasNext() ){

      Map map= (Map) it.next();

      //DownExcelBean 是封装数据的实体类VO(根据对应字段建立即可)

      DownExcelBean bean= new DownExcelBean();

      bean.setId( Integer.toString( Integer.parseInt( map.get("id").toString())) );

      bean.setITEM_ID( Integer.toString( Integer.parseInt( map.get("ITEM_ID").toString())) );

      bean.setTelephone( map.get("telephone").toString());

      bean.setITEM_NAME( map.get("ITEM_NAME").toString());

      bean.setITEM_PRICE( Double.toString( Double.parseDouble( map.get("ITEM_PRICE").toString())) );

      bean.setInput_date( map.get("input_date").toString() );

      bean.setSend_date( map.get("send_date").toString() );

    

      excel_list.add( bean);

     }

    }

方法二 使用poi实现导出Excel数据。

1、需先下载对应的jar包解压后将poi.jar放入lib

2、在down_excel.jsp中写入

<%@ page contentType="text/html;charset=UTf-8"%>

<%@ page import="java.io.*,org.apache.poi.hssf.usermodel.*"%>

<%

HSSFWorkbook workbook= new HSSFWorkbook(); //创建新的Excel工作薄

 

HSSFSheet sheet= workbook.createSheet("JSP"); //Excel工作薄中建工作表,名为缺省

 

HSSFRow row= sheet.createRow((short) 0);

HSSFCell cell= row.createCell((short) 0);

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

cell.setCellValue("作者"); //在单元格输入一些内容

cell= row.createCell((short) 1);

cell.setEncoding(HSSFCell.ENCODING_UTF_16); //定义单元格为字符串类型

cell.setCellValue("编辑"); //在单元格输入一些内容

row= sheet.createRow((short) 1); //在索引1的位置创建行(最顶端的行)

cell= row.createCell((short) 0); //在索引0的位置创建单元格(左上端)

cell.setEncoding(HSSFCell.ENCODING_UTF_16); //定义单元格为字符串类型

cell.setCellValue("张三"); //在单元格输入一些内容

cell= row.createCell((short) 1);

cell.setEncoding(HSSFCell.ENCODING_UTF_16); //定义单元格为字符串类型

cell.setCellValue("李四");

String filename= application.getRealPath("/") + "text.xls"; //filename是工作薄的存放位置,存放在当前应用程序的根目录下

FileOutputStream fOut= new FileOutputStream(filename); //新建输出文件流

workbook.write(fOut); //把相应的Excel工作薄存盘

fOut.flush();

fOut.close(); //操作结束,关闭文件

out.println("excel文件已经生成,存放在<BR>" + filename);

%>

方法三 最简单的方法使用Displaytag标签。

1、需先下载对应的jar包解压后将

displaytag-1.1.jardisplaytag-export-poi-1.1.jardisplaytag-portlet-1.1.jar放入lib

alternative.cssdisplaytag.cssscreen.css放入文件里,此处是放在了displaytag_css

2、在web.xml中注册

<filter>

<filter-name>ResponseOverrideFilter</filter-name>

<filter-class>

     org.displaytag.filter.ResponseOverrideFilter

</filter-class>

</filter>

<filter-mapping>

    <filter-name>ResponseOverrideFilter</filter-name>

    <url-pattern>*.do</url-pattern>

</filter-mapping>

<filter-mapping>

    <filter-name>ResponseOverrideFilter</filter-name>

    <url-pattern>*.jsp</url-pattern>

</filter-mapping>

3、页面中引入

<%@ taglib uri="http://displaytag.sf.net" prefix="display"%>

<%@ taglib uri="http://displaytag.sf.net/el" prefix="display-el"%>

<LINK href="./displaytag_css/alternative.css" type=text/css rel=stylesheet><!-- 标题控制样式 -->

<LINK href="./displaytag_css/displaytag.css" type=text/css rel=stylesheet><!-- 分页标签 -->

<LINK href="./displaytag_css/screen.css" type=text/css rel=stylesheet><!-- 分页标签 -->

<display:table name="create_list" export="true" class="mars" style="width: 60%; border-spacing:1px; border-collapse:1px;" >

<display:setProperty name="export.pdf" value="false" />

<display:setProperty name="export.xml" value="false" />

</display:table>

其中name="create_list"create_listaction中经过查询数据库返回的list结果集后用request保存的域值。用这种方法最简单,基本上能满足大多数情况的需要,不过如果是需要导出类似身份证号码大于17位的数字,导出的数据会按科学计算法显示,就是最后三位变成0

 

 

免责声明:本站所有资讯内容搜集整理于互联网或者网友提供,并不代表本网赞同其观点,仅供学习与交流使用,如果不小心侵犯到你的权益,如果你对文章内容、图片和版权等问题存在异议,请及时联系我们删除该信息。