apache POI 导入导出excel

 

本帖最后由 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文件:

apache POI 导入导出excel

控制台输出:

apache POI 导入导出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,输出: apache POI 导入导出excel
如此可设置数据的表现格式

读取 excel2007:

将代码块a 02行的文件换成2007版本的excel文件: String file = "C:\\Users\\LONMID\\Desktop\\POI\\pirate.xlsx";

2007版本的excel文件如图:

apache POI 导入导出excel

将代码块a 05行代码改成: Workbook wb = new XSSFWorkbook(fis);

再次运行代码块a,输出结果:

apache POI 导入导出excel


导出 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>

模板文件: apache POI 导入导出excel

导出文件截图:apache POI 导入导出excel

 

设置单元格格式:

 /**
         * 设置单元格格式
	 */
	private static CellStyle setStyle(HSSFWorkbook wb){
		// 创建字体
		HSSFFont font = wb.createFont();
		// 设置字体为红色
		font.setColor(HSSFFont.COLOR_RED); 
		// 设置字体为粗体
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
		// 创建单元格格式
		HSSFCellStyle cellStyle= wb.createCellStyle();
		// 设置字体
		cellStyle.setFont(font); 
		// 设置水平居中
		cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
		// 设置垂直靠下
		cellStyle.setVerticalAlignment(CellStyle.VERTICAL_BOTTOM);
		// 设置左边框为双线
		cellStyle.setBorderLeft(CellStyle.BORDER_DOUBLE);
		// 设置背景色为蓝色
		cellStyle.setFillBackgroundColor(new HSSFColor.BLUE().getIndex());
		// 设置前景色为黄色
		cellStyle.setFillForegroundColor(new HSSFColor.YELLOW().getIndex());
		return cellStyle;
	}