用java连接Excel和SQLite3,实现从excel文件读取数据并将其存入SQLite3数据库中
java與Excel的連接用到了jxl.jar開源包,與SQLite3的連接用到了sqlitejdbc-v056.jar這個(gè)開源包,兩個(gè)開源包打包下載:傳送門
如果使用的eclipse做開發(fā),解壓后按下所示導(dǎo)入兩個(gè)開源包即可:
對(duì)著工程右擊>Build Path>Add External Archives,然后選擇這兩個(gè)開源包引入即可。
------------
1,java與Excel的連接:
(jxl.jar開源包的源碼,以及使用API下載:傳送門 )
java與Excel的連接,只需引入jxl的相關(guān)包(見最下方源碼),即可實(shí)現(xiàn)與Excel文件的連接;
String s = "" ;File file = new File("D:\\hello\\1.xls);
WorkBook wb = Workbook.getWorkbook(file); //創(chuàng)建一個(gè)工作簿對(duì)象wb,該對(duì)象的引用指向某個(gè)待讀取的Excel文件 Sheet sheet = wb.getSheet(0); // 創(chuàng)建一個(gè)工作簿wb中的工作表對(duì)象(0代表第一張工作表,工作簿、工作表的關(guān)系,就好比一個(gè)記賬本和賬本上某頁(yè)記賬表的關(guān)系) int stRows = sheet.getRows(); //得到當(dāng)前工作表中所有非空行的數(shù)目;
for(int i=0;i<stRows;i++){Cell cell = sheet.getCell(j, i); //創(chuàng)建一個(gè)單元格對(duì)象,來(lái)存放從sheet的(第j列,第i行)讀取的單元格;s += cell.getContents(); //單元格.getContents()方法,會(huì)從當(dāng)前單元格對(duì)象中獲得一個(gè)已經(jīng)轉(zhuǎn)換為字符串類型的字符串,如需獲得原型(如整形數(shù)據(jù)),可自查API中相關(guān)方法;}
使用完后,使用wb.close()的方法關(guān)閉文件流即可。
------------
2,java與SQLite3的連接:
java與SQLite3的連接,以及寫入數(shù)據(jù),需要如下的準(zhǔn)備工作:
1,通過Class.forName()方法,載入需要連接數(shù)據(jù)庫(kù)的類
Class cl = Class.forName("org.sqlite.JDBC") ; //如果想要了解關(guān)于這個(gè)方法的意義,可看百度來(lái)的這篇文章:http://goo.gl/OpXUG?2,之后與數(shù)據(jù)庫(kù)建立連接,代碼如下:
//通過JDBC:Sqlite與D:\\123目錄下的AllClasses.db文件(SQLite3的數(shù)據(jù)庫(kù)文件)建立連接;Connect conn = DriverManager.getConnection("jdbc:sqlite:d:/123/AllClasses.db");Statement stm =conn.createStatement();//下面這句sql語(yǔ)句的意思是:如果數(shù)據(jù)庫(kù)中沒有"OtherClasses"這張表,則創(chuàng)建之;//加上自加的KC_ID,一列共九個(gè)數(shù)據(jù);stm.executeUpdate("create table if not exists OtherClasses(" +"KC_ID integer primary key autoincrement," +"KC_NAME vachar(15) ," + "KC_TEACHER vachar(5) ," + "KC_CLASSES vachar(10) ," + "KC_ROOM vachar(6) ," + "KC_ENDTIME vachar(5) ," + "KC_YUANXI vachar(4) ," + "KC_POSITION vachar(3) ," + "KC_MARK vachar(3) );"); /* PreparedStatement 類,通俗來(lái)講,就像文件流的BufferedReader一樣,只不過它是用來(lái)存放Sql語(yǔ)句的緩沖內(nèi)容(如有精力,可參考java API),* 1,PreparedStatement prs = conn.prepareStatement("insert into OtherClasses values (?,?,?,?,?,?,?,?,?);"); * 這句話用來(lái)預(yù)定義你即將插入的一列數(shù)據(jù)規(guī)范,如上那個(gè)方法,就是說我準(zhǔn)備每次暫存9個(gè)待插入的數(shù)據(jù)(9個(gè)問號(hào));* 2,prs 的setString()用來(lái)設(shè)置Sql語(yǔ)句的內(nèi)容,一組共九個(gè)參數(shù),setString(2,"nihao")就是說,設(shè)置本行待插入的第二個(gè)數(shù)據(jù)為“nihao"(從2開始,共9個(gè)數(shù)據(jù),為什么不是從1開始?因?yàn)?是”KC_ID integer primary key autoincrement“,它會(huì)根據(jù)本行數(shù)據(jù)添加情況自增,無(wú)需賦值);* 3,一組九個(gè)數(shù)據(jù)設(shè)定完成后,通過prs.addBatch()方法,將這次的批處理命令添加到prs中去,* 4,通過 conn.setAutoCommit(false); prs.executeBatch(); conn.setAutoCommit(true);這三個(gè)方法,便可以將緩存于prs中的一批sql執(zhí)行命令,真正執(zhí)行,并將之前一組九個(gè)數(shù)據(jù),插入到數(shù)據(jù)庫(kù)文件中去.*/PreparedStatement prs = conn.prepareStatement("insert into OtherClasses values (?,?,?,?,?,?,?,?,?);");// 下面這段代碼,便可以插入一列數(shù)據(jù);// 為什么從2開始?因?yàn)榈谝粋€(gè)數(shù)據(jù)是自增型計(jì)數(shù)器,詳見上面第2條解釋;for( int i = 2; i<9; i++ ) {prs.setString( i, "本次插入" + i ) ;}prs.addBatch();conn.setAutoCommit(false);prs.executeBatch();conn.setAutoCommit(true);上面一段代碼執(zhí)行后,效果如下圖:
(想要這款圖形界面的SQLite3數(shù)據(jù)庫(kù)瀏覽器的朋友,可以到此下載:傳送門):
------------
3,java如何緩存數(shù)據(jù)實(shí)現(xiàn)excel與sqlite的連接?
我使用了ArrayList來(lái)緩存數(shù)據(jù)。
每一行的數(shù)據(jù),存入一個(gè)新new出來(lái)的ArrayList<String>中;
當(dāng)讀取完該行的所有數(shù)據(jù)后,將ArrayList<String>存入一個(gè)已經(jīng)new好的 ArrayList<ArrayList<String>> 當(dāng)中,直到數(shù)據(jù)表所有數(shù)據(jù)被讀取出來(lái)。
具體操作,可參考下方提供的源碼中的內(nèi)容(只需查看ReadDataFromExcel() 和?WriteDataToSQLite() 這兩個(gè)方法即可)。
------------
程序源碼說明:
源碼內(nèi)容經(jīng)過自己精心整理,注釋也很詳細(xì),是盡量做到每個(gè)小模塊都附上一段注釋,所以想要學(xué)習(xí)的就快快下載吧!
本程序源碼下載:傳送門
還是第一次寫編程技術(shù)分享類的博文,如有不到之處,還望見諒指正。
如有問題,可在下方留言,或者跟我在微博上交流。
轉(zhuǎn)載于:https://www.cnblogs.com/lyfing/archive/2012/06/27/2566074.html
總結(jié)
以上是生活随笔為你收集整理的用java连接Excel和SQLite3,实现从excel文件读取数据并将其存入SQLite3数据库中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端布局神器display:flex
- 下一篇: python 进程与线程(理论部分)