Java读取Excel中数据时怎么判断Excel中的最后一行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java读取Excel中数据时怎么判断Excel中的最后一行相关的知识,希望对你有一定的参考价值。

通过poi读取Excel中的数据,怎么去判断最后一行是哪一行呢?就是实际有数据的最后一行,哪怕中间隔了很多行的空行也能获取最后一行的行号,比如:
abcdefg

d
怎么获取d所在的行号,我用getLastRowNum试过了,没用。。请各位大神帮帮忙。。。

int realRowCount = sheet.getPhysicalNumberOfRows();/* 获取有数据的行数,即:最后有数据的行是第n行,前面有m行是空行没数据,则返回n-m */
int rowIndex=0; /* 行号下标,从0开始 */
Row row = null;
for (int j = 0; j < realRowCount ; j++) 
    row = sheet.getRow(rowIndex++);
    if(row !=null)
        /* 处理数据 */
    else
        j--;
    

if(rowIndex>0)
    rowIndex--;

参考技术A sheet.getLastRowNum()

参考技术B Sheet对象的getLastRowNum()方法。

参考技术C BOF,EOF,查找一下这个相关的。 参考技术D 用ctrl+f搜索数据中的关键字再看是几行

java中怎么把excel导入数据库

1、利用Excel第三方工具,将Excel文件读取到内存中。使用最简单,方便的工具是apache的poi工具包,自己网上下载 http://poi.apache.org/ ,使用方法网上一搜一大片。

2、如果是对于特别大的excel(大于20M的话),简单的读取方法就容易内存溢出了,需要采用流式读取的方式,参考http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api 

3、将已读入内存的Excel数据,整理成写数据库的数据结构,然后插入数据库。这部分工作应该不用介绍了,就是基本的数据库操作方法,与excel无关了

具体如下:

1、简介

编程是编写程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,是计算体系按照该计算方式运行,并最终得到相应结果的过程。

为了使计算机能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。

2、汇编程序

汇编程序。使用汇编语言编写计算机程序,程序员仍然需要十分熟悉计算机系统的硬件结构,所以从程序设计本身上来看仍然是低效率的、繁琐的。但正是由于汇编语言与计算机硬件系统关系密切,在某些特定的场合,如对时空效率要求很高的系统核心程序以及实时控制程序等,迄今为止汇编语言仍然是十分有效的程序设计工具。

3、执行原理

计算机对除机器语言以外的源程序不能直接识别、理解和执行,都必须通过某种方式转换为计算机能够直接执行的。这种将高级编程硬件程序设计语言编写的源程序转换到机器目标程序的方式有两种:解释方式和编译方式。

参考技术A

1、加入依赖的jar文件:

引用:
*mysql的jar文件 
*Spring_HOME/lib/poi/*.jar

2、编写数据库链接类 

package com.zzg.db;  
  
import java.sql.Connection;  
import java.sql.DriverManager;  
  
public class DbUtils   
    private static Connection conn;  
  
    static   
        try   
            Class.forName("com.mysql.jdbc.Driver");  
            conn = DriverManager.getConnection("jdbc:mysql://localhost/test","root","123456");  
         catch (Exception e)   
            e.printStackTrace();  
          
      
  
    public static Connection getConn()   
        return conn;  
      
  
    public static void setConn(Connection conn)   
        DbUtils.conn = conn;  
      

3、编写数据库操作类 

package com.zzg.db;  
  
import java.sql.Connection;  
import java.sql.PreparedStatement;  
import java.sql.SQLException;  
  
public class ExcuteData   
    private PreparedStatement pstmt;  
    public boolean ExcuData(String sql)   
        Connection conn = DbUtils.getConn();  
        boolean flag=false;  
        try   
            pstmt = conn.prepareStatement(sql);  
            flag=pstmt.execute();  
         catch (SQLException e)   
            e.printStackTrace();  
          
        return flag;  
      

4、编写Excel表格实体类 

package com.zzg.model;  
  
public class TableCell   
    private String _name;  
    private String _value;  
  
    public String get_name()   
        return _name;  
      
  
    public void set_name(String _name)   
        this._name = _name;  
      
  
    public String get_value()   
        return _value;  
      
  
    public void set_value(String _value)   
        this._value = _value;  
      

5、编写主键生成方法

package com.zzg.util;  
  
import java.text.SimpleDateFormat;  
import java.util.Date;  
import java.util.Random;  
  
public class GenericUtil   
    public static String getPrimaryKey()  
      
        String primaryKey;  
        primaryKey = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());  
        Random r = new Random();  
        primaryKey +=r.nextInt(100000)+100000;  
        return primaryKey;  
      

6、编写Excel操作类 

package com.zzg.deployData;  
  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.Serializable;  
import java.util.ArrayList;  
import java.util.List;  
import org.apache.poi.hssf.usermodel.HSSFCell;  
import org.apache.poi.hssf.usermodel.HSSFRow;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import com.zzg.db.ExcuteData;  
import com.zzg.model.TableCell;  
import com.zzg.util.GenericUtil;  
  
public class OperExcel<T extends Serializable>   
    private HSSFWorkbook workbook;  
    private String tableName;  
    private Class<T> type;  
    private String sheetName;  
  
    public OperExcel(File excelFile, String tableName, Class<T> type,  
            String sheetName) throws FileNotFoundException,  
            IOException   
        workbook = new HSSFWorkbook(new FileInputStream(excelFile));  
        this.tableName = tableName;  
        this.type = type;  
        this.sheetName = sheetName;  
        InsertData();  
      
  
    // 向表中写入数据  
    public void InsertData()   
        System.out.println("yyy");  
        ExcuteData excuteData = new ExcuteData();  
        List<List> datas = getDatasInSheet(this.sheetName);  
        // 向表中添加数据之前先删除表中数据  
        String strSql = "delete from " + this.tableName;  
        excuteData.ExcuData(strSql);  
        // 拼接sql语句  
        for (int i = 1; i < datas.size(); i++)   
            strSql = "insert into " + this.tableName + "(";  
            List row = datas.get(i);  
            for (short n = 0; n < row.size(); n++)   
                TableCell excel = (TableCell) row.get(n);  
                if (n != row.size() - 1)  
                    strSql += excel.get_name() + ",";  
                else  
                    strSql += excel.get_name() + ")";  
              
            strSql += " values (";  
            for (short n = 0; n < row.size(); n++)   
                TableCell excel = (TableCell) row.get(n);  
                try   
                    if (n != row.size() - 1)   
                        strSql += getTypeChangeValue(excel) + ",";  
                     else  
                        strSql += getTypeChangeValue(excel) + ")";  
                 catch (RuntimeException e)   
                    e.printStackTrace();  
                 catch (Exception e)   
                    e.printStackTrace();  
                  
              
            //执行sql  
            excuteData.ExcuData(strSql);  
          
      
  
    /** 
     * 获得表中的数据 
     * @param sheetName 表格索引(EXCEL 是多表文档,所以需要输入表索引号) 
     * @return 由LIST构成的行和表 
     */  
    public List<List> getDatasInSheet(String sheetName)   
        List<List> result = new ArrayList<List>();  
        // 获得指定的表  
        HSSFSheet sheet = workbook.getSheet(sheetName);  
        // 获得数据总行数  
        int rowCount = sheet.getLastRowNum();  
        if (rowCount < 1)   
            return result;  
          
        // 逐行读取数据  
        for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)   
            // 获得行对象  
            HSSFRow row = sheet.getRow(rowIndex);  
            if (row != null)   
                List<TableCell> rowData = new ArrayList<TableCell>();  
                // 获得本行中单元格的个数  
                int columnCount = sheet.getRow(0).getLastCellNum();  
                // 获得本行中各单元格中的数据  
                for (short columnIndex = 0; columnIndex < columnCount; columnIndex++)   
                    HSSFCell cell = row.getCell(columnIndex);  
                    // 获得指定单元格中数据  
                    Object cellStr = this.getCellString(cell);  
                    TableCell TableCell = new TableCell();  
                    TableCell.set_name(getCellString(  
                            sheet.getRow(0).getCell(columnIndex)).toString());  
                    TableCell.set_value(cellStr == null ? "" : cellStr  
                            .toString());  
                    rowData.add(TableCell);  
                  
                result.add(rowData);  
              
          
        return result;  
      
  
    /** 
     * 获得单元格中的内容 
     *  
     * @param cell 
     * @return result 
     */  
    protected Object getCellString(HSSFCell cell)   
        Object result = null;  
        if (cell != null)   
            int cellType = cell.getCellType();  
            switch (cellType)   
  
            case HSSFCell.CELL_TYPE_STRING:  
                result = cell.getStringCellValue();  
                break;  
            case HSSFCell.CELL_TYPE_NUMERIC:  
                result = cell.getNumericCellValue();  
                break;  
            case HSSFCell.CELL_TYPE_FORMULA:  
                result = cell.getNumericCellValue();  
                break;  
            case HSSFCell.CELL_TYPE_ERROR:  
                result = null;  
                break;  
            case HSSFCell.CELL_TYPE_BOOLEAN:  
                result = cell.getBooleanCellValue();  
                break;  
            case HSSFCell.CELL_TYPE_BLANK:  
                result = null;  
                break;  
              
          
        return result;  
      
  
    // 根据类型返回相应的值  
    @SuppressWarnings("unchecked")  
    public String getTypeChangeValue(TableCell excelElement)  
            throws RuntimeException, Exception   
        String colName = excelElement.get_name();  
        String colValue = excelElement.get_value();  
        String retValue = "";  
        if (colName.equals("id"))   
            retValue = "'" + GenericUtil.getPrimaryKey() + "'";  
            return retValue;  
          
        if (colName == null)   
            retValue = null;  
          
        if (colName.equals("class_createuser"))   
            retValue = "yaa101";  
            return "'" + retValue + "'";  
          
        retValue = "'" + colValue + "'";  
        return retValue;  
      

7、编写调用操作Excel类的方法 

package com.zzg.deployData;  
  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
  
public class DeployData   
    private File fileOut;  
  
    public void excute(String filepath)   
        fileOut = new File(filepath);  
        this.deployUserInfoData();  
      
  
    public void deployUserInfoData()   
        try   
            new OperExcel(fileOut, "test", Object.class, "Sheet1");  
         catch (FileNotFoundException e)   
            e.printStackTrace();  
         catch (IOException e)   
            e.printStackTrace();  
          
      

8、编写客户端 

package com.zzg.client;  
  
import com.zzg.deployData.DeployData;  
  
public class DeployClient   
    public static void main(String[] args)   
        DeployData deployData = new DeployData();  
        deployData.excute("D://test.xls");  
      

参考技术B

这个问题分两步走:

    利用Excel第三方工具,将Excel文件读取到内存中。使用最简单,方便的工具是apache的poi工具包,自己网上下载 http://poi.apache.org/ ,使用方法网上一搜一大片。

    如果是对于特别大的excel(大于20M的话),简单的读取方法就容易内存溢出了,需要采用流式读取的方式,参考http://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api 

    将已读入内存的Excel数据,整理成写数据库的数据结构,然后插入数据库。这部分工作应该不用介绍了,就是基本的数据库操作方法,与excel无关了

参考技术C

Java的poi实现Excel导入导出【导出支持多个sheet,导入支持高低版本的excel】

场景:
在很多企业管理系统中都会碰到,excel的poi导入导出功能;需求很大,解决方案也很多,(不过我没用过别人的,喜欢用自己写的^_^,没毛病),

工具源码:

1、Excel导出支持多sheet:    >>>快速使用<<<<  
2、excel简单导入代码 [支持2007前后版本]  >>>快速使用<<<<

功能描述:  

导出:支持多sheet ,支持导出list<bean> list<Map> 写的比较糙,有相关需求的随便看看,参考着自己个儿改改用
导入:根据配置,导入得到List<Map>数据,可以自己实现List<JavaBean>的扩展(比如使用反射),支持2007前后版本Excel的处理

以上是关于Java读取Excel中数据时怎么判断Excel中的最后一行的主要内容,如果未能解决你的问题,请参考以下文章

java导入excel时怎么判断excel文件

java读取excel时间格式出现数字怎么处理

java怎样判断excel表格是不是为空

java poi读取Excel,怎么判断空行

java poi读取Excel,怎么判断空行

java中 BufferedReader类读取文件时