首页 > 编程知识 正文

Java 从Excel中读数据,excel读中文数据nan

时间:2023-05-06 15:04:10 阅读:202837 作者:19

今天工作时遇到一个需求,将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类型,

所以要(int)xssfCell.getNumericCellValue(),进行强转以便于回复原来数值。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。