6

I am using Java 8.

When i am trying to access Excel data(basically this is my test data) through jdbc-odbc, i am getting "java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver"

And also i am trying to access data as non DSN.

I surfed net and came to know that Oracle deprecated support to jdbc-odbc.

So what is the easiest way to access this Excel data using Java?

Connection con=null;
    Statement stmt=null;
    ResultSet rs=null;
    String query = "select TestScript from [TS 360 Scripts$]";

    try
    {
        Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
        con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Excel Driver(*.xlsx)};DBQ=D://TS 360 Script with Count.xlsx");


        stmt=con.createStatement();
        rs=stmt.executeQuery(query);
        while(rs.next())
        {
            System.out.println(rs.getString("TestScript"));
        }

        con.close();
        rs.close();
        stmt.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
4
  • 2
    See link Commented Feb 3, 2015 at 8:02
  • Joan Colmenero, as i mentioned in my post i am using Java 8. I am getting exception at connection creation statement. con = DriverManager.getConnection( "jdbc:odbc:" + "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" + "DBQ=C:\\Users\\Gord\\Desktop\\test.xlsx;" + "ReadOnly=0;"); Commented Feb 3, 2015 at 8:27
  • Look this answer link... Commented Feb 3, 2015 at 8:31
  • Joan Colmenero, as i mentioned i am trying to access Excel as Database, when i am trying UcanAccess, i am getting "net.ucanaccess.jdbc.UcanaccessSQLException: Decoding not supported. Please choose a CodecProvider which supports reading the current database encoding" Exception. Commented Feb 3, 2015 at 9:00

3 Answers 3

2

Dont Access Excel file as a database. Instead use a jar such as Apache POI For Microsoft Documents

Download Link: Apache POI For MS Docs- Jar

An Example For using this API:

Note: you must add apache poi jar to your build path before running it

package com.dd.selenium;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

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 org.openqa.selenium.By;
import org.openqa.selenium.firefox.FirefoxDriver;


public class PerformDDTest {

    private static HSSFWorkbook xlWBook;

    private static HSSFSheet xlSheet;

    private static HSSFRow xlRow;

    private static HSSFCell xlCell;

    private static String filePath = "/home/dinesh/";

    private static String fileName = "test.xls";

    private static String url = "http://store.demoqa.com/"; 

    private static String result = "Pass";


    public static void main(String[] args) throws InterruptedException {

        try {
            FileInputStream xlFile = 
                    new FileInputStream(filePath+fileName);

            //Access the required test data sheet

            xlWBook =  new HSSFWorkbook(xlFile);

            xlSheet = xlWBook.getSheet("Sheet1");

            xlRow = xlSheet.getRow(1);

            String username = xlRow.getCell(1).getStringCellValue();
            String password = xlRow.getCell(2).getStringCellValue();

            FirefoxDriver driver = new FirefoxDriver();

            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

            driver.manage().window().maximize();


            driver.get(url);

            driver.findElement(By.xpath(".//*[@id='account']/a")).click();

            driver.findElement(By.id("log")).sendKeys(username);
            driver.findElement(By.id("pwd")).sendKeys(password);

            driver.findElement(By.id("login")).click();



            driver.findElement(By.xpath(".//*[@id='account_logout']/a")).click();

            Thread.sleep(5000);

            driver.quit();

            setResultCell();


            FileOutputStream fout = new FileOutputStream(filePath+fileName);

            xlWBook.write(fout);

            fout.flush();
            fout.close();



        } catch (IOException e) {
            // TODO Auto-generated catch block
            result = "Failed";
            setResultCell();
            e.printStackTrace();
        }



    }


    private static void setResultCell() {
        xlCell = xlRow.getCell(3, xlRow.RETURN_BLANK_AS_NULL);

        if(xlCell == null ){
            xlCell = xlRow.createCell(3);
            xlCell.setCellValue(result);
        }else{
            xlCell.setCellValue(result);
        }
    }

}
Sign up to request clarification or add additional context in comments.

1 Comment

Dinesh, i badly need it for project purpose. The reason being, i have my test cases and its data in Excel with a flag called "IsExecute", which is Yes or No. I need to find test cases with Yes. Though i may write code with POI, it is easy if we consider above situation treat excel as Database.
1

Uday- you can easily do whatever you want to do with Apache POI jar

As Your are mentioned your requirement: of all rows having isExecuted String Yes. I tried with this jar.

Try this

package com.dd.selenium;

import java.io.FileInputStream;
import java.io.IOException;

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;

public class PerformDDTest {

    private static HSSFWorkbook xlWBook;
    private static HSSFSheet xlSheet;
    private static HSSFRow xlRow;
    private static HSSFCell xlCell;
    private static String filePath = "/home/dinesh/";
    private static String fileName = "test.xls";

    public static void main(String[] args) throws InterruptedException {

        try {

            FileInputStream xlFile = new FileInputStream(filePath + fileName);

            // Access the required test data sheet

            xlWBook = new HSSFWorkbook(xlFile);

            // Assuming your data is in Sheet1- if not use your own sheet name
            xlSheet = xlWBook.getSheet("Sheet1");

            // gives row count in sheet
            int noOfRows = xlSheet.getPhysicalNumberOfRows();

            // gives column count in sheet
            xlRow = xlSheet.getRow(0);
            int noOfColumns = xlRow.getLastCellNum();

            // excelData - 2 dimm array - stores all the excel data -Sheet1 only
            String[][] excelData = new String[noOfRows][noOfColumns];

            // r - row c- column
            for (int r = 1; r < noOfRows; r++) {
                for (int c = 0; c < noOfColumns; c++) {
                    xlRow = xlSheet.getRow(r);
                    xlCell = xlRow.getCell(c);

                    // Here we have complete excel data in an array -excelData-

                    excelData[r][c] = xlCell.getStringCellValue();

                    // System.out.println("row: " + r + " column: " + c);
                    // System.out.println(excelData[r][c]);
                }
            }

            // creating an array to store isExected column
            String[][] isExecuted = new String[noOfRows][1];

            for (int row = 1; row < noOfRows; row++) {
                // here column is always only one
                // so c=0

                // extracting a isExecuted column - and considering it as last
                // column in sheet
                // in your case it is not then - count the column position : use
                // position-1
                // ex: if column position is 7 then use 6 as below
                // isExecuted[row][0]= excelData[row][6];

                isExecuted[row][0] = excelData[row][noOfColumns - 1];

                if (isExecuted[row][0].equalsIgnoreCase("yes")) {

                    // accessing complete row -which isExecuted=Yes

                    // *********IMPORTANT*****
                    for (int col = 0; col < noOfColumns; col++) {
                        // prints all the rows where isExecuted column has Yes
                        System.out.println(excelData[row][col]);
                    }
                }

                // System.out.println(isExecuted[row][0]);

            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

I used this Excel Data:

Test Case Name  Username    Password    Results IsExecute
APACHE_POI_TC   testuser_1  Test@123    Pass    Yes
APACHE_POI_TC   testuser_2  Test@124    Pass    No
APACHE_POI_TC   testuser_3  Test@125    Pass    Yes
APACHE_POI_TC   testuser_4  Test@126    Pass    Yes
APACHE_POI_TC   testuser_5  Test@127    Pass    No
APACHE_POI_TC   testuser_6  Test@128    Pass    Yes

Comments

-1

This might be a little late but in case you still have the issue you can retain access excel as a db with java 8 using Fillo: http://codoid.com/fillo/

2 Comments

Sai: This is not an open source tool which can be used under community license.
@Sam: the link shows that it's released under the Apache License. But unfortunately it does not contain a JDBC driver.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.