最开始用iText生成pdf报表,可是管理流程竟然要求生成excel然后再通过人工审核,所以不得不借用组件去生成Excel文档,一开发现的就是apache的POI.因为我原来用的制作报表的工具是iReport + Jasper ,好像它支持的也是POI组件。

        我找了一些资料,大部分说得都是直接生成Excel文档,下载到本机操作,可是现在想把Excel在网页页面显示,因为这种过程比较直观,然后根据需求,看是否需要下载到本机。

        生成Excel比较简单,非常类似于网页表格的生成。

       Excel的三大元素:

       1.文档本体 HSSFSheet

       2.文档行   HSSFRow

       3.文档单元格  HSSFCell

        不过操作这一切之前,你要先建立一个工程。

       操作流程就是: 建一个工程,在此工程下建一个文档,增加行,增加单元格 我想无论多么复杂,应该大体过程都如此。

       下面这一段是一个简单构建过程:


        HSSFWorkbook wb = new HSSFWorkbook();//建立一工程    

        HSSFSheet sheet = wb.createSheet("mySheet");//生成一个文档实体(参数可选)    

      HSSFRow row = sheet.createRow((short)0);//增加一行,行号必须为短整型    

      HSSFCell cell = row.createCell((short)0);//增加单元格,可一行多格   

      cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16); //中文非要加上这一句,要不乱码    

      cell.setCellValue(1);//置值    // 你也可以一行做完全部的事    

      row.createCell((short)1).setCellValue(1.2);    

      row.createCell((short)2).setCellValue("This is a string");    

      row.createCell((short)3).setCellValue(true);    // 输出到文档 这一部也是要我们做的,就把数据流倒到jsp页    

      FileOutputStream fileOut = new FileOutputStream("workbook.xls");    

      wb.write(fileOut);    

      fileOut.close();

     这中表格很朴素,机会没有用到诸如字体设置,样式风格,甚至很严重的中文问题也没有考虑 ,不过这是万里长征第一步,也是增强自信心的第一步。那么接下来我们一步一步打造一个完整的Excel报表.


   单元格样式


        HSSFFont cf = workbook.createFont(); //基本字体                                       

      HSSFCellStyle cs =workbook.createCellStyle(); //单元格样式        

      cf.setFontHeightInPoints((short)12); //字体大小         

      cf.setColor(HSSFFont.COLOR_RED); //字体颜色 注意使用HSSFont下的颜色常量        

      cf.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体粗细        

      cs.setFont(cf);//设置字体样式        

      cs.setAlignment(HSSFCellStyle.ALIGN_RIGHT); //对齐方式


这里只简单介绍,接下来,看一下如何把这些东西搬到jsp页面。

        以下是写的一个方法,实际应该是有数据库链接的,出于简单考虑,直接写些数据就了事。 


 

大体如此。 具体细节,自己以后慢慢调试。

public ByteArrayOutputStream resultSetToExcel(ByteArrayOutputStream buffer) 
{
        HSSFWorkbook workbook =new HSSFWorkbook();
        HSSFSheet sheet =workbook.createSheet();
        HSSFRow aRow =null;
        HSSFCell  aCell =null;
        HSSFFont headFont =workbook.createFont();
        HSSFCellStyle headStyle=workbook.createCellStyle();        
headFont.setFontHeightInPoints((short)12);
        headFont.setColor(HSSFFont.COLOR_RED);
        headFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        headFont.setFontName("宋体");
        headStyle.setFont(headFont);
        short currRowNum =  0;
        try 
{
            int columnCount = 10            row =sheet.createRow(currRowNum++); 
           for (int i=0;  i < columnCount; i++) 
{
                aCell =aRow.createCell((short)i);
                aCell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
                aCell.setCellValue("字段" + i); 
               aCell.setCellStyle(headStyle);
            }
            for (int i=0; i < 10; i++) 
{
               aRow = sheet.createRow(currRowNum++);
               for(int j = 0 ; j  <  columnCount ; j ++)
{
                 aCell = aRow.createCell( (short) j);
                 aCell.setCellValue(j); 
              }
            }
            workbook.write(buffer);
        }
        catch(Exception ex1)
{
          ex1.printStackTrace();
        }
         return buffer;
    }

jsp页面的代码如下: 其中myExcel 是我写的一个用上面方法组成的一个类


<%@ page import ="java.io.*"%><%@ page import ="javax.servlet.*"%><%@ page import ="org.apache.poi.hssf.util.*"%><%         ByteArrayOutputStream buffer = new ByteArrayOutputStream();
       com.print.demo.MyExcel myExcel = new com.print.demo.MyExcel();
        buffer  = myExcel.resultSetToExcel(buffer);
        byte[] bytes = buffer.toByteArray();

        response.reset();//以前一直没写,出现乱码.
        response.setContentType("application/vnd.ms-excel");//        response.setContentLength(bytes.length);
        DataOutput output = new DataOutputStream( response.getOutputStream() );
        for( int i = 0; i < bytes.length; i++ ) 
{ output.writeByte( bytes[i] ); }%>


简单的使用是应该没问题的。