返回列表 发帖

[原创] 使用POI输出Excel文件

大概是上个月由于工作需要,需要将页面数据输出到excel,后来选择用POI来实现这个功能。在看了风灵风之子、鹦鹉的POI帖子以及网上流行的那个POI例子后,我根据具体业务逻辑实现了这个功能。现在我就简化我的业务逻辑来说下POI输出Excel文件的功能。
       首先去http://www.apache.org/dyn/closer.cgi/poi/release/下载需要的POI包,我使用的是poi-3.0-rc4-20070503.jar,poi-contrib-3.0-rc4-20070503.jar,poi-scratchpad-3.0-rc4-20070503.jar这三个jar包,随着版本的变化,这三个包的名字会和最新的jar包名字有点出入。
       下面是我根据业务流程改的示例代码,一个java文件就可以做到输出Execel文件的效果。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFFooter;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
* @author starlight
* Copyright (c)  www.thysea.com
*/

public class PoiExpExcel {
private static int resultCount = 0;
private static String reportName = "";
private static String[] blankString = null;
static// 创建工作本
HSSFWorkbook demoWorkBook = new HSSFWorkbook();
/**
  * 得到结果列数
  *
  * @return
  */
public int getColmunRows() {
  return resultCount;
}
/**
  * 得到当前报表名
  *
  * @return
  */
public String getReportName() {
  return reportName;
}
/**
  * 得到空白列,计算中间位置显示报表名称
  *
  * @return
  */
public String[] getBlankString() {
  return blankString;
}
/**
  * 创建表头
  *
  * @return
  */
public static void createTableHeader(ArrayList arr, HashMap tmpMap,
   HSSFSheet demoSheet) {
  String[] headName = { "A", "B", "C" };
  blankString = headName;
  short cellNumber = (short) headName.length;// 表头的单元格个数目
  resultCount = cellNumber;
  HSSFRow headerRow = demoSheet.createRow((short) 0);
  for (int i = 0; i < cellNumber; i++) {
   HSSFCell headerCell = headerRow.createCell((short) i);
   headerCell.setEncoding(HSSFCell.ENCODING_UTF_16);
   headerCell.setCellValue(headName);
  }
}
/**
  * 创建行
  *
  * @param cells
  * @param rowIndex
  */
public static void createTableRow(List cells, short rowIndex, int rows,
   HSSFSheet demoSheet) {
  // 创建第rowIndex行
  HSSFRow row = demoSheet.createRow((short) rowIndex);
  for (short i = 0; i < cells.size(); i++) {
   // 创建第i个单元格
   HSSFCell cell = row.createCell((short) i);
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(String.valueOf(cells.get(i)));
  }
}
/**
  * 创建整个Excel表
  *
  *
  */
public static void createExcelSheeet(ArrayList arrList, HashMap tmpMap,
   int rows, HSSFSheet demoSheet) {
  createTableHeader(arrList, tmpMap, demoSheet);// 创建表头
  ArrayList resultList = new ArrayList();
  int rowIndex = 2;
  resultList.add("A1");
  resultList.add("A2");
  resultList.add("B1");
  resultList.add("B2");
  resultList.add("C1");
  resultList.add("C2");
  //此处压到ArrayList里的将是显示的为“查询结果”,具体业务中可以用具体的ArrayList数据显示
  createTableRow(resultList, (short) rowIndex, rows, demoSheet);// 创建行
}
/**
  * 导出表格
  *
  * @param sheet
  * @param os
  * @throws IOException
  */
public static void exportExcel(HSSFSheet sheet, OutputStream os)
   throws IOException {
  sheet.setGridsPrinted(true);
  HSSFFooter footer = sheet.getFooter();
  footer.setRight("Page " + HSSFFooter.page() + " of "
    + HSSFFooter.numPages());
  demoWorkBook.write(os);
}
/**
  * 当前报表查询条件
  *
  */
public static void getSearchValue(HSSFSheet demoSheet) {
  int rows = 2;
  short rowIndex = 1;// 此处是用来设置查询条件显示的行数,从0开始为第一行
  ArrayList searchList = new ArrayList();
  searchList.add("查询条件");
  searchList.add("abcdef");
  // 具体的导出可以根据需要把“查询条”件放在一个ArrayList里
  createTableRow(searchList, (short) rowIndex, rows, demoSheet);
}
/**
  * main方法
  *
  * @param args
  */
public static void main(String[] args) {
  String filePath = "D:" + "[url=file://\\]\\";//[/url] 指定文件生成位置,在具体业务中可以通过参数传递个具体的位置,这里暂时放在D盘
  reportName = "PoiExpExcel";
  String fileName = reportName + ".xls";// 在指定位置生成uSql加当前USqlId、USqlName的excel文件
  FileOutputStream fos = null;
  // 创建表
  HSSFSheet demoSheet = demoWorkBook.createSheet("test_20071024");// 此处用来表示excel左下角内容
  try {
   ArrayList arrList = new ArrayList();
   HashMap tmpMap = new HashMap();
   int rows = 0;
   getSearchValue(demoSheet);// 当前报表查询条件
   createExcelSheeet(arrList, tmpMap, rows, demoSheet);// 创建整个Excel表
   fos = new FileOutputStream(filePath + fileName);
   exportExcel(demoSheet, fos);// 导出表格
   System.out.println("表格已成功导出到 : " + filePath + fileName);
  } catch (Exception e) {
   System.out.println("表格导出出错,错误信息 :" + e + "\n错误原因可能是表格已经打开。");
   e.printStackTrace();
  } finally {
   try {
    fos.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
}
}

    在你建的工程里导入那三个jar包再输入上面代码,运行后就会在D盘发现PoiExpExcel.xls这个文件了。当再次运行程序时,上次的文件会自动被覆盖重写,如果文件是打开的状态下,重新生成就会报错。控制台会出现这样提示,“表格导出出错,错误信息 :java.io.FileNotFoundException: D:\PoiExpExcel.xls (请求的操作无法在使用用户映射区域打开的文件上执行。)错误原因可能是表格已经打开。”。所以应该关闭此文件再次运行程序,就会成功覆盖重写。
     下面是原文件和输出的excel文件。
附件: 您需要登录才可以下载或查看附件。没有帐号?注册

小伙子很有才
如果有图片就更好了
天行健,君子以自强不息
地势坤,君子以厚德载物
   黑色海岸线欢迎您

TOP

呼吸!
加油!!!!!

TOP

果然不懂……
勾勾の小指头﹎説好﹎永远Ъù分手メ_愛伱↘又怎能ヽoo轻易說ツ放棄. ↗單純﹎Dé`﹎開始.o
           勾勾の小指头﹎説好﹎永远Ъù分手メ_愛伱↘又怎能ヽoo轻易說ツ放棄. ↗單純﹎Dé`﹎開始.o     

TOP

觉得这样原创的技术东西该加精啊~~!
勾勾の小指头﹎説好﹎永远Ъù分手メ_愛伱↘又怎能ヽoo轻易說ツ放棄. ↗單純﹎Dé`﹎開始.o
           勾勾の小指头﹎説好﹎永远Ъù分手メ_愛伱↘又怎能ヽoo轻易說ツ放棄. ↗單純﹎Dé`﹎開始.o     

TOP

一般技术文章!必须加精华!
尤其是!原闯的!
支持LS的说法!

[ 本帖最后由 ◆◆◆◆◆◆ 于 2007-10-24 20:24 编辑 ]

TOP

呼吸!
加油!!!!!

TOP

小伙子很有才
如果有图片就更好了

TOP

返回列表 回复 发帖