今天工作时遇到一个需求,将Excel表格中的数据导入到数据库中,下面我们来看怎么实现。
我们要用POI这个技术来实现这项功能,我们需要做的准备是下载以下jar包:
接下来我们来看怎么将Excel中的数据传到一个集合中
注意:这里展示的Excel格式是xlsx也就是Excel2007及以后的版本格式,而后缀为xls的由于版本过低现在用的也少
所要用到的类主要就是:
HSSFWorkbook : 它被用来读取和写入MS-Excel文件的xls格式。
XSSFWorkbook : 它是用于MS-Excel中XLSX文件格式
HSSFSheet:代表xls格式中的一个sheet工作表、
XSSFSheet代表xlsx格式中的一个sheet工作表
XSSFRow 代表xlsx格式中的一个sheet表中的一行
XSSFCell 代表xlsx格式中的一列
(参考POI教程)
其中HSSFWorkbook主要用来读写后缀名为xls的Excel文件,而XSSFWorkbook 则是用于读取后缀名为xlsx的文件。
HSSFWorkbook这个类的主要构造函数有俩个即为:
1.HSSFWorkbook() 从头开始创建一个新的HSSFWorkbook对象时(本来没有,新创建一个Excel文件,一般用于从内存中读出数据)。
2.HSSFWorkbook(java.io.InputStream s) 创建使用输入流中的新HSSFWorkbook对象时(本来已有Excel,使用已有的Excel文件,一般用于向内存中写数据)。
而XSSFWorkbook则有四个比较重要的构造函数:
1.XSSFWorkbook() 从头开始创建一个新的XSSFworkbook对象(和HSSFWorkbook()类似)。
2.XSSFWorkbook(java.io.File file) 构造从给定文件中的XSSFWorkbook对象。
3.XSSFWorkbook(java.io.InputStream is) 构造一个XSSFWorkbook对象,通过缓冲整个输入流到内存中,然后为它打开一个OPCPackage对象。
4.XSSFWorkbook(java.lang.String path) 构建一个给定文件的完整路径的XSSFWorkbook对象。
关于poi的大致介绍就到这,主要就是这几个类的几个方法的运用。方法的话可以查询以下网址,里面有详细的解说。
https://www.yiibai.com/apache_poi/apache_poi_core_classes.html
接下来直接看一个Demo
这是一个从Excel表格中读取数据的例子。
fis = new FileInputStream(ExcelFile);
XSSFWorkbook xssfWorkbook=new XSSFWorkbook(fis);
使用这个来将Excel文件与流建立连接,在将流用XSSFWorkbook,创建一个针对于工作簿的对象即为xssfWorkbook。
因为一个工作簿中可能会有多张表,所以要对表(sheet)进行循环遍历
for (int numSheet = 0; numSheet <=xssfWorkbook.getNumberOfSheets(); numSheet++) {
(xssfWorkbook.getNumberOfSheets();此方法是获取到所有的sheet的总数,本案例上的所有方法均不会详细说明,所有方法在上文链接中皆存在,也可查看POI的说明文档)
而我们真正想要获取的是每张表中的每一列字段的值,所以还得遍历每一行,再通过行获取到每一列的值
for (int numRow = 1; numRow <= xssfSheet.getLastRowNum(); numRow++) {
XSSFRow xssfRow=xssfSheet.getRow(numRow);
到这一步就已经获取到每一行了。
if(xssfRow!=null) {
peo=new people();
XSSFCell name=xssfRow.getCell(0);
XSSFCell sex=xssfRow.getCell(1);
XSSFCell age=xssfRow.getCell(2);
peo.setName(getValue(name));
peo.setSex(getValue(sex));
peo.setAge(Integer.parseInt(getValue(age)));
peoList.add(peo);
}
遍历每一行中的每一列,并将其赋值给people对象,放入集合中。至此就已经完成获取。但还要注意的是:
public String getValue(XSSFCell xssfCell){
if(xssfCell.getCellType()==xssfCell.CELL_TYPE_BOOLEAN) {
return String.valueOf(xssfCell.getBooleanCellValue());
}else if(xssfCell.getCellType()==xssfCell.CELL_TYPE_NUMERIC) {
return String.valueOf((int)xssfCell.getNumericCellValue());
}else {
return String.valueOf(xssfCell.getStringCellValue());
}
}
因为精确到的只是每一列,所以还得将每一列取出,而XSSFCell有多种取值方法,
1.xssfCell.getBooleanCellValue() 对布尔值进行取值
2.xssfCell.getStringCellValue() 对字符串进行取值
3.xssfCell.getNumericCellValue() 对数值类型取值(short int float double等)
注意的是String.valueOf((int)xssfCell.getNumericCellValue());
使用xssfCell.getNumericCellValue() 进行转换数值时候,会自动的将整值类型转化成float类型,