POI的基本使用
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
POI可以到www.apache.org下载到。实际运行时,需要有poi包就可以了。HSSF提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象
下面详细介绍POI操作的具体实例和思路:
导出大体思路如下:
1.先创建文件对象,
2.文件对象创建sheet页对象,
3.sheet页对象创建行对象,
4.行对象创建单元格填入数据
5.保存文档使用流将文件导出到服务器中转站
6.在由服务器中转站导出(下载功能)到指定文件夹
7.导出完成
实际操作poi报表进行导出excel文档时的实例如下:
第一步,创建一个webbook,对应一个Excel文件
步骤1:HSSFWorkbook wb = new HSSFWorkbook();
第二步,在webbook中添加一个sheet页,对应Excel文件中的sheet页
以下createSheet中填写sheet页名称 并非文件名称
步骤2:HSSFSheet sheet = wb.createSheet(“学生表一”);
第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
步骤3:HSSFRow row = sheet.createRow((int) 0);
第四步,创建一个居中格式,在创建单元格是设置居中格式
步骤4:
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
第五步,创建单元格填入数据并设置居中格式
步骤5:
①创建单元格:
HSSFCell cell = row.createCell((short) 0);
②设置单元格内容:
cell.setCellValue(“内容”);
③将以上创建好的居中格式添加进单元格:cell.setCellStyle(style);
第六步,使用字节输出流将文件存入指定路径
FileOutputStream fout = new FileOutputStream(“指定路径”);
wb.write(fout);
fout.close();
注意:区分创建行使用(int)创建列使用(short)
基本操作:
创建Excel对象:new HSSFWorkbook();
创建sheet页:(Excel对象).createSheet(“学生表一”);
创建行:(sheet对象).createRow((int) 0);
创建列:(行对象).createCell((short) 0);
创建一个样式对象:(Excel对象).createCellStyle();
添加居中格式:**(样式对象).setAlignment(HSSFCellStyle.ALIGN_CENTER);
导入大体思路如下
1.使用 BufferedInputStream输入流 读取Excel文档
2.得到文件后采用POIFSFileSystem 进行解析并转为HSSFWorkbook对象
3.使用HSSFWorkbook对象.getSheetAt(0);获取该Excel的第一个sheet页
4.Sheet. getLastRowNum()获取该sheet页的数据条数进行for循环每一条数据【for(int i= 0 ; i< Sheet. getLastRowNum();i++)】
5.HSSFRow row =Sheet.getRow(i)获取此行数据
6.Row. getLastCellNum()获取本行有N条数据
7.row.getCell(columnIndex);获取单元格并导出值存入相应的对象中
8.使用存好的对象进行数据库添加操作
9.导入完成
具体导入操作实例:
第一步、创建输入流并转换为HSSFWorkbook对象
1、BufferedInputStream in = new
BufferedInputStream(new FileInputStream(new File(“文件路径”)));
2、POIFSFileSystem fs = new POIFSFileSystem(in);
3、HSSFWorkbook wb = new HSSFWorkbook(fs);
第二步、用HSSFWorkbook获取第一个sheet页(sheet页下标从0开始)
HSSFSheet st = wb.getSheetAt(0);
第三步使用for循环循环每条数据(行)并获取行对象
for (int rowIndex = 0; rowIndex <= st.getLastRowNum(); rowIndex++) {
HSSFRow row = st.getRow(rowIndex);
}
第四步循环行对象并获取单元格对象
for (short columnIndex = 0, size = row.getLastCellNum(); columnIndex <= size; columnIndex++) {
cell = row.getCell(columnIndex);
}
第五步将单元格中不同格式的的值以不同方式导出(可以直接复制使用)最终value为单元中的值可进行任意操作
if (cell != null) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (date != null) {
value = new SimpleDateFormat(“yyyy-MM-dd HH:mm:SS”)
.format(date);
} else {
value = “”;
}
} else {
value = new DecimalFormat(“0”).format(cell
.getNumericCellValue());
}
break;
case HSSFCell.CELL_TYPE_FORMULA:
// 导入时如果为公式生成的数据则无值
if (!cell.getStringCellValue().equals(“”)) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + “”;
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
value = “”;
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? “Y”
: “N”);
break;
default:
value = “”;
}
}