简单的excel报表导出(jsp中)

本文介绍如何利用Java POI库实现Excel文件的创建与读取。包括设置单元格样式、合并单元格、读取单元格内容等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      导出excel也类似下载,就是服务器端生成数据,通过response传递到客户端,弹出保存对话框需要在servlet中设置输出类型,对于excel设置如下:

  response.setHeader("Content-disposition",  "attachment;  filename=test.xls");//设定输出文件头
  response.setContentType("application/vnd.ms-excel");//定义输出类型

 

  读写excel用的是POI,是apache的一个开源项目,需要去下载相关jar包,我首次接触,用起来感觉入门也算简单。

  下面一段代码是页面点击后,servlet中将数据以某种形式写入excel,然后传到客户端供用户导出保存,都是很简化的,没关联数据库:

        HSSFWorkbook wb = new HSSFWorkbook();        // 创建EXCEL工作簿
        HSSFSheet sheet = wb.createSheet("sheet1");  // 在EXCEL工作簿中创建名为sheet的工作表
        HSSFRow row = null;                          // 工作表中的行,从0开始
        HSSFCell cell = null;                        // 工作表中的列,从0开始
        HSSFCellStyle style = wb.createCellStyle();  // 样式
        HSSFFont font = wb.createFont();
        font.setColor(HSSFColor.YELLOW.index);
       
        // 设置单元格style
        style.setFillForegroundColor(HSSFColor.RED.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setFont(font); 
       
        // 对齐方式
        HSSFCellStyle style_align = wb.createCellStyle();
       
        style_align.setAlignment(HSSFCellStyle.ALIGN_CENTER);        // 横向对齐
        style_align.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 纵向对齐
       
       
        // 表中写入i行,j列
        for(int i = 0; i < 10; i++) {
            row = sheet.createRow(i); 
            row.setHeightInPoints((float)25.5);
            //System.out.println(row.getHeightInPoints());
            for(int j = 0; j < 5; j++) {
                if(i == 0) {
                    // 合并单元格
                    row.createCell(0).setCellStyle(style_align);   // 设置为居中对齐
                    row.createCell(3).setCellStyle(style_align);
                    row.createCell(4);
                    sheet.addMergedRegion(new CellRangeAddress(0,i,0,2));   // 合并0行-i行之间0列-2列
                    sheet.addMergedRegion(new CellRangeAddress(0,i,3,4));   // 显示的是cell(3)的值
                    sheet.getRow(i).getCell(0).setCellValue(new HSSFRichTextString("TITLE1"));
                    sheet.getRow(i).getCell(3).setCellValue(new HSSFRichTextString("TITLE2"));
                    sheet.getRow(i).getCell(4).setCellValue(new HSSFRichTextString("COL 5"));
                    break;
                }
                // 设置单元格
                cell = row.createCell(j);  
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);   //设置单元格类型为string
                cell.setCellValue(new HSSFRichTextString("row" + i + "col" + j));      //设置单元格内容
                cell.setCellStyle(style);
            }   
        }
// System.out.println(sheet.getRow(0).getCell(1).getStringCellValue());  // 报Null Pointer错误
        OutputStream  os  =  response.getOutputStream();
        wb.write(os);
        os.flush();
        os.close();

 

   就是先创建Excel工作簿对象,再有该工作薄对象创建工作表,再由工作表创建excel行,由行创建单元格,并能设置单元格的一些属性,上述都是最基本的,复杂的应用还是得看文档。。。

   上面就是简单的在excel中写入10行5列,首行1-2列合并,3-5列合并,并横向竖向都居中对齐,其它行红色前景色,字为黄色。

 

    由已有的excel文件创建HSSFWorkBook对象很简单:

        FileInputStream fis = new FileInputStream("F://test.xls");      
        HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fis));   // 由文件创建工作簿

       建立输入流,然后将excel内容映射到程序中的HSSFWorkbook对象,用起来还算是蛮简单的。

       读excel单元格信息就是由WorkBook获得工作表,再读取表中的行,行中的单元格,取得其中的内容,感觉挺方便的,但是涉及的东西也不少,毕竟excel本身功能也很强大,下面是简单的例子,未写完全:

        FileInputStream fis = new FileInputStream("F://test.xls");
        HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(fis));   // 由文件创建工作簿
        HSSFRow row = null;
        HSSFCell cell = null;
        out.println("表名称:" + wb.getSheetName(0) + "<BR>");         
        HSSFSheet sheet = wb.getSheetAt(0);   // 读取sheet,从0开始,获得第一个sheet,也可以通过名称
       
        // 遍历行
        for(int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
            row = sheet.getRow(i);       // 获得行
            if(row != null) {
                // 遍历列
                for(int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
                    cell = row.getCell(j);
                    if(cell != null) {
                        String value = null;
                        switch(cell.getCellType()) {
                        case HSSFCell.CELL_TYPE_NUMERIC:  // 数值型
                            if(HSSFDateUtil.isCellDateFormatted(cell)) {
                                // date 类型
                                value = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString();
                            } else {
                                // 数字
                                value = String.valueOf(cell.getNumericCellValue());
                            }
                            //out.println();
                            break;
                        // ......  更多case
                        }
                       
                    }
                }
            }
        }

 

     目前工作中也用不着,随便写点, 感觉这些都是看看手册就用,就能满足大部分需求的。。。似乎花时间在这些东西上面也不值得,。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值