[原创]报表利器apache poi的使用_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3473 | 回复: 0   主题: [原创]报表利器apache poi的使用        下一篇 
fangdingyu
注册用户
等级:少校
经验:1238
发帖:55
精华:25
注册:2013-3-6
状态:离线
发送短消息息给fangdingyu 加好友    发送短消息息给fangdingyu 发消息
发表于: IP:您无权察看 2013-3-8 9:03:12 | [全部帖] [楼主帖] 楼主

     poi是apache基金会的一个开源项目.它主要是为了使用java生成对应的office文档.本案例中使用的就是其中的一个-HSSF.今天主要来看一下这个工具类的使用.在一些要求生成报表的的项目中.这个功能还是很有用的.

import org.apache.poi.hssf.util.HSSFColor;
public class ExcelFileGenerator {
      private final int SPLIT_COUNT = 15; // Excel每个工作表的行数
      @SuppressWarnings("unchecked")
      private ArrayList fieldName = null; // excel标题数据集
      @SuppressWarnings("unchecked")
      private ArrayList fieldData = null; // excel数据内容
      private HSSFWorkbook workBook = null;
      /**
  * 构造器
  *
  * @param fieldName
  *            结果集的字段名
  * @param data
  */
      @SuppressWarnings("unchecked")
      public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) {
            this.fieldName = fieldName;
            this.fieldData = fieldData;
      }
      /**
  * 创建HSSFWorkbook对象
  *
  * @return HSSFWorkbook
  */
      @SuppressWarnings("unchecked")
      public HSSFWorkbook createWorkbook() {
            workBook = new HSSFWorkbook();// poi报表的核心对象
            int rows = fieldData.size();// 获取内容的数据
            int sheetNum = 0;// 共分几页
            if (rows % SPLIT_COUNT == 0) {
                  sheetNum = rows / SPLIT_COUNT;// 分页
            } else {
            sheetNum = rows / SPLIT_COUNT + 1;
      }
      for (int i = 1; i <= sheetNum; i++) {
            HSSFSheet sheet = workBook.createSheet("Page " + i);// 使用workbook创建sheet
            HSSFRow headRow = sheet.createRow(0); // poi特点:先要创建sheet,通过sheet创建row,第1行
            for (int j = 0; j < fieldName.size(); j++) {// 循环excel的标题
                  HSSFCell cell = headRow.createCell(j);// poi特点:先要创建row,通过row创建cell
                  // 添加样式
                  cell.setCellType(HSSFCell.CELL_TYPE_STRING);// 指定导出的类型
                  // 设置列(有数据的列)的宽度
                  sheet.setColumnWidth(j, 6000);
                  // 设置样式字体加粗、颜色变红
                  // 使用workBook获取操作单元格的样式
                  HSSFCellStyle style = workBook.createCellStyle();
                  // 获取字体对象
                  HSSFFont fontnbsp&= workBook.createFont();
                  // 字体加粗
                  font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
                  // 字体颜色变红
                  short color = HSSFColor.RED.index;
                  font.setColor(color);
                  // 将字体的样式添加到HSSFCellStyle中
                  style.setFont(font);
                  if (fieldName.get(j) != null) {
                        cell.setCellStyle(style);
                        cell.setCellValue((String) fieldName.get(j));// 向excel的单元格中设置
                  } else {
                  cell.setCellStyle(style);
                  cell.setCellValue("-");
            }
      }
      for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) {
            if (((i - 1) * SPLIT_COUNT + k) >= rows)// 实现excel的分页
            break;// 到头了
            HSSFRow row = sheet.createRow(k + 1);// 创建row,+1,从excel的第二行开始写入值
            // 将数据内容放入excel单元格
            ArrayList rowList = (ArrayList) fieldData.get((i - 1)
            * SPLIT_COUNT + k); // 只有一页的话,就只有k列
            for (int n = 0; n < rowList.size(); n++) {
                  HSSFCell cell = row.createCell(n);// 创建cell
                  if (rowList.get(n) != null) {
                        cell.setCellValue((String) rowList.get(n).toString());
                  } else {
                  cell.setCellValue("");
            }
      }
}
}
return workBook;
}
public void expordExcel(OutputStream os) throws Exception {
      workBook = createWorkbook();
      workBook.write(os);// 生成excel文件
      os.close();
}
}


代码中的HSSFWorkbook()就是指的一个excel文件对象,HSSFSheet则是一个excel页对象,

HSSFRow代表excel中的一行,HSSFCell则是excel中的一个小格.依靠这个工具类,

就可以传递进去数据,生成对应的excel文件.当然了,服务器响应的时候的类型也要有所变化,

应该这样写 response.setContentType("application/vnd.ms-excel");

本案例讲完了,有什么不懂的再来问我这个前辈高人吧!哦呵呵呵呵呵!!!




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论