关于POI的简单使用
关于Excel
由于Excel版本不同,所要解析的格式也不相同,Excel基本分为两种格式.xls(2003版)和.xlsx(2007版)
POI操作Excel的常用方法(得到Excel常用对象)
POIFSFileSystem ps=newPOIFSFileSystem(new FileInputStream(“G:/gd.xls”));
//得到Excel工作簿对象
HSSFWorkbook wb = new HSSFWorkbook(ps);
//得到Excel工作表对象
HSSFSheet sheet = wb.getSheetAt(0);
//得到Excel工作表的行
HSSFRow row = sheet.getRow(i);
//得到Excel工作表指定行的单元格
HSSFCell cell = row.getCell(j);
//取得有效的行数
sheet.getLastRowNum();
//取得一行的有效单元格个数
row.getLastCellNum();
POI所需要的jar包(这里使用的是3.8版本)
<!-- 解析.xls格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<!-- 解析.xlsx格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
操作
HSSFWorkbook对象用于解析.xls格式
XSSFWorkbook对象用于解析.xlsx格式
简单操作中使用的是 Workbook 至于为什么使用Workbook 下面有解释
String filepath = "G:gd.xls";
InputStream is = new FileInputStream(filepath);
//2003版本
//Workbook workbook = new HSSFWorkbook(is);
//2007版本
//Workbook workbook = new XSSFWorkbook(is);
//推荐使用poi-ooxml中的WorkbookFactory.create(is)来创建Workbook,
// 因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接口
Workbook workbook = WorkbookFactory.create(is);
//得到Excel工作表对象
Sheet sheet = workbook.getSheetAt(0);
//获取有效的行数
int number = sheet.getLastRowNum()
//遍历
for (int i = 0; i <= number; i++) {
//得到Excel工作表的行
Row row = sheet.getRow(i);
//获取有效列数
int num = row.getLastCellNum();
for (int j = 0; j < num; j++) {
//得到Excel工作表的列
//方法一:
//先设置单元格的属性为string类型
//至于为什么这里这样写 是为了防止获取的数据以科学计数法的方式出现
//正常来说应该要一个一个进行判断,判断单元格的属性,然后进行读取
//row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
//再读取
//String s= row.getCell(j).getStringCellValue();
//System.out.println(s);
//方法二:
//获取单元格
Cell cell = row.getCell(j);
//调用下面的方法
String value = getCellStringValue(cell);
System.out.println(value);
}
}
根据单元格不同属性返回字符串数值
public String getCellStringValue(Cell cell) {
String cellValue = "";
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING: //字符串类型
cellValue = cell.getStringCellValue();
if(cellValue.trim().equals("")||cellValue.trim().length()<=0)
cellValue=" ";
break;
case Cell.CELL_TYPE_NUMERIC: //数值类型
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_FORMULA: //公式
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_BLANK: //空单元格
cellValue=" ";
break;
case Cell.CELL_TYPE_BOOLEAN: //布尔
break;
case Cell.CELL_TYPE_ERROR: //错误单元格
break;
default:
break;
}
return cellValue;
}
为什么在上述案例中使用了 Workbook Sheet Row Cell
关于读取数字的问题
例如520, POI 读取变成 520.0 或者 520.3 POI 读取变成520.299999999999997
解决办法
double num= row.getCell(0).getNumericCellValue();
DecimalFormat df = new DecimalFormat("#.##");
String value = df.format(num);