本帖最后由 zhongweiwei 于 2012-7-16 16:41 编辑
Apache POI
是用
Java编写的免费开源的跨平台的
Java API,
Apache POI提供
API给
Java程式对
Microsoft Office格式档案读和写的功能。
- HSSF
-
提供读写
Microsoft ExcelXLS格式档案的功能。
- XSSF
-
提供读写
Microsoft ExcelOOXML XLSX格式档案的功能。
- HWPF
-
提供读写
Microsoft WordDOC格式档案的功能。
- HSLF
-
提供读写
MicrosoftPowerPoint格式档案的功能。
- HDGF
-
提供读
Microsoft Visio格式档案的功能。
- HPBF
-
提供读
MicrosoftPublisher格式档案的功能。
- HSMF
-
提供读
Microsoft Outlook格式档案的功能。
版本
稳定版
最新的稳定版是
Version 3.5-final (2009-09-28)
源码文件:
http://archive.apache.org/dist/poi/release/src/poi-src-3.5-FINAL-20090928.zip
二进制开发包:
http://archive.apache.org/dist/poi/release/bin/poi-bin-3.5-FINAL-20090928.zip
最新版
最新的版是
Version 3.8 (2011-3-26)还在不断的完善
二进制开发包:
http://www.fayea.com/apache-mirror/poi/release/bin/poi-bin-3.8-20120326.zip
源码文件:
http://mirror.bit.edu.cn/apache/poi/release/src/poi-src-3.8-20120326.zip
以下以一个小例子示范
POI
读取
excel
:
(此程序所用的POI版本是3.8版本,此实例重在突出POI的使用方法,对于代码格式、规范性、可拓展性暂未考虑,小女子初次发技术贴,有不足的地方欢迎大家提出)
读取
excel2003文件主要过程(代码块a):
public static void main(String[] args) throws Exception {
String file = "C:\\Users\\LONMID\\Desktop\\POI\\pirate.xls";
FileInputStream fis = new FileInputStream(file);
// 构建一个excel2003工作簿
Workbook wb = new HSSFWorkbook(fis);
List<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
int totalColumn = 0;
if(wb != null){
Sheet sheet = wb.getSheetAt(0);
int totalRows = sheet.getPhysicalNumberOfRows();
if (totalRows >= 1 && sheet.getRow(0) != null) {
totalColumn = sheet.getRow(0).getPhysicalNumberOfCells();
}
for (int r = 0; r < totalRows; r++) {
Row row = sheet.getRow(r);
if (row == null) {
continue;
}
ArrayList<String> rowList = new ArrayList<String>();
for (int c = 0; c < totalColumn; c++) {
Cell cell = row.getCell(c);
// 可根据数据类型设置数据的显示格式
rowList.add(cell.toString());
}
result.add(rowList);
}
}
// 打印到控制台
for (ArrayList<String> arrayList : result) {
for (String string : arrayList) {
System.out.print(string +"\t");
}
System.out.println();
}
读取的excel文件:

控制台输出:

设置数据类型格式:
将代码块a 23行改成
rowList.add(getCellValue(cell));
getCellValue(Cell cell)方法如下(代码块b):
private static String getCellValue(Cell cell) {
String cellValue = "";
if (cell == null) {
return cellValue;
}
// 处理数字型 可自行设置格式
if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
cellValue = NumberFormat.getInstance().format(cell.getNumericCellValue())+ ".00";
}
// 处理布尔型
else if (Cell.CELL_TYPE_BOOLEAN == cell.getCellType()) {
cellValue = cell.getBooleanCellValue() ? "是" : "否";
}
// 处理其他数据类型
else {
cellValue = cell.toString();
}
return cellValue;
}
再运行代码块a,输出:
如此可设置数据的表现格式
读取
excel2007:
将代码块a 02行的文件换成2007版本的excel文件:
String file
= "C:\\Users\\LONMID\\Desktop\\POI\\pirate.xlsx";
2007版本的excel文件如图:

将代码块a 05行代码改成:
Workbook wb = new XSSFWorkbook(fis);
再次运行代码块a,输出结果:

导出
excel文件
:
控制器代码(控制器url:"
/data.do")代码块c:
@RequestMapping(params = "action=export2003")
public void write2003(HttpServletResponse response){
OutputStream out = null;
try {
out = response.getOutputStream();
String fileName = "pirate"+new Date().getTime() + ".xls";// 生成的excel文件
String tempFile = "C:\\Users\\LONMID\\Desktop\\POI\\temp.xls";// 模版文件
Workbook wb = new HSSFWorkbook(new FileInputStream(tempFile));
List<ArrayList<String>> data = createData();// 生成数据
if(wb!=null&&data != null){
Sheet sheet = wb.getSheetAt(0);
for (int i = 0; i < data.size(); i++) {
ArrayList<String> list = data.get(i);
Row row = sheet.createRow(i+1);
for (int j = 0; j < list.size(); j++) {
row.createCell(j).setCellValue(list.get(j));
}
}
}
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
response.setContentType("application/msexcel;charset=UTF-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
wb.write(out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
jsp文件代码片段: <a href="${contextPath}/data.do?action=export2003">点击导出至Excel2003文件</a>
模板文件:

导出文件截图:
|