标题:
[原创]
使用POI输出Excel文件
[打印本页]
作者:
starlight
时间:
2007-10-24 14:24
标题:
使用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文件。
[attach]22547[/attach][attach]22548[/attach]
作者:
风灵风之子
时间:
2007-10-24 14:45
小伙子很有才
如果有图片就更好了
作者:
◆◆◆◆◆◆
时间:
2007-10-24 18:37
呼吸!
加油!!!!!
作者:
北极Ж凤凰
时间:
2007-10-24 20:17
果然不懂……
作者:
北极Ж凤凰
时间:
2007-10-24 20:20
觉得这样原创的技术东西该加精啊~~!
作者:
◆◆◆◆◆◆
时间:
2007-10-24 20:22
一般技术文章!必须加精华!
尤其是!原闯的!
支持LS的说法!
[
本帖最后由 ◆◆◆◆◆◆ 于 2007-10-24 20:24 编辑
]
作者:
rainmedia
时间:
2009-4-24 15:09
呼吸!
加油!!!!!
作者:
rainmedia
时间:
2009-4-24 15:10
小伙子很有才
如果有图片就更好了
欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/)
Powered by Discuz! 7.2