1. 程式人生 > >如何將excel表格檔案導成SQLite資料庫檔案(.xls-->.db)

如何將excel表格檔案導成SQLite資料庫檔案(.xls-->.db)

導讀:首先宣告小編剛開始開發android只有4個月左右,所以有不足之處敬請各位指出,小編在此先行謝過。
最近由於公司專案需求需要將一些固定的資料放在本地,也就是app裡面。通過查詢資料決定用一個本地資料庫檔案(.db)來儲存資料。所以需要知道怎樣匯入資料到該資料庫檔案,然後如何將其放到我的專案中。

大致思路:
先將資料生成表格形式(.xls格式 我用的是WPS表格),然後編碼將其中的所有資料讀出(我是將其讀出放到了陣列LinkedList中的),再然後就是建立資料庫檔案然後將資料放進去了,最後將該資料庫檔案複製貼上到你的專案中即可。
圖片:
用到的xls表格檔案
已經放到專案中的資料庫檔案(注意目錄)


開啟的xls檔案(請注意其格式讀出程式碼中會用到)

相關準備工作:1、將要匯入的表格檔案(小編的是.xls格式的)。2、匯入JXL.jar(excel檔案操作用的,沒有的話可以自行百度實在不行可以聯絡小編哦)。3、要放入資料庫檔案的專案。

下面開始詳細步驟:
一、將xls檔案即表格檔案資料讀出
1、直接上程式碼:

public class SelectExcelFile {
    private String fileDir;                                 //檔案路徑
    private String KEYFIRST = "English";                    //表格內容
private String KEYTWO = "Chinese"; private String KEYTHREE = "Number"; private LinkedList<HashMap<String, String>> linkedList; //存放讀出的資料的陣列 public SelectExcelFile(String file) { linkedList = null; this.fileDir = file; linkedList = new LinkedList<HashMap<String, String>>(); getAllByExcel(); } public
LinkedList<HashMap<String, String>> getLinkedList() { return linkedList; } /** * selection data of the xls file */ private void getAllByExcel(){ try { Workbook rwb = Workbook.getWorkbook(new File(fileDir)); Sheet rs = rwb.getSheet(0); int clos = rs.getColumns(); //所有列 int rows = rs.getRows(); //所有行 for (int i = 0; i < rows; i++) { for (int j = 0; j < clos; j++) {//一行行的讀出又有表格中的資料 HashMap<String, String> hashMap = new HashMap<String, String>(); String first = rs.getCell(j++, i).getContents(); String two = rs.getCell(j++, i).getContents(); String three = rs.getCell(j++, i).getContents(); hashMap.put(KEYFIRST, first); hashMap.put(KEYTWO, two); hashMap.put(KEYTHREE, three); linkedList.addFirst(hashMap); /*列印日誌判斷獨處的內容(LogUtil是我自己寫的列印日誌的類)*/ LogUtil.logw(getClass().getName(), "first:" + first + " two:" + two + " three:" + "" +i); } } } catch (Exception e) { // TODO Auto-generated catch block LogUtil.loge(getClass().getName(), e.getMessage()); } } }

程式碼說明:
註釋小編已經寫得很清楚了,不過有一點需要注意的是那個表格檔案的路徑一定要正確啊。我的路徑是/storage/sdcard0/tencent/QQfile_recv/xxx.xls ,小編是直接通過qq傳的,所以路徑用的是預設的。

資料準備工作已經完成了,接下來就是準備資料庫檔案接收他了,即將其導成.db檔案。

二、獲取新的資料庫檔案(.db)得操作物件
1、還是先上程式碼:

public class DBOpenHelperLocate {
    public final String DBNAME          = "xxx.db"; //生成的新資料庫名稱
    public final String PACKAGE_NAME    = "xxx.xxxx.xxx";//你的專案包名
    public final String DATABASE_PATH   = "/data"
            + Environment.getDataDirectory().getAbsolutePath() + "/"
            + PACKAGE_NAME; //生成的新資料庫放置的路徑(放在記憶體儲卡的手機root過的可以直接獲取)
//public final String DATABASE_PATH = "/storage/sdcard0/tencent/QQfile_recv";生成的新資料庫放置的路徑(這是我用的,我的手機沒root過所以放在外邊方便生成後複製貼上到我的專案中)
    private SQLiteDatabase db;//資料庫操作物件

    public DBOpenHelperLocate(Context context) {
        openDatabase(context);
    }

    public SQLiteDatabase getDb() {
        return db;
    }

/**
* 通過該方法獲取新的資料庫的操作物件
*/
    private SQLiteDatabase openDatabase(Context context) {
        try {
            String databaseFilename = DATABASE_PATH + "/" + DBNAME;
            File dir = new File(DATABASE_PATH);
            if (!dir.exists()) {//如果該路徑不存在則建立
                dir.mkdir();
            }
            if (!(new File(databaseFilename)).exists()) {//如果該資料庫檔案不存在,則建立(就是你最後需要放到專案中的新資料庫檔案)
                InputStream is = context.getResources().openRawResource(R.raw.hyd_locate);//獲取原本資料庫的輸入流(讀取原本的資料到新資料庫中用,如果不想存資料只想生成個空的新資料庫檔案的話,看著來吧)
                FileOutputStream fos = new FileOutputStream(databaseFilename);
                byte[] buffer = new byte[8192];
                int count;
                while ((count = is.read(buffer)) > 0) {
                    fos.write(buffer, 0, count);
                }

                fos.close();
                is.close();
            }
            db = SQLiteDatabase.openOrCreateDatabase(
                    databaseFilename, null);
            return db;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

三、對新生成的資料庫進行操作
1、通過第二步已經獲取了新的資料庫的操作物件,那麼我們自然就可以對該資料庫進行增刪改查的操作,把不想要的資料刪除掉,把需要的資料加進去;然後找到他的目錄。將其複製貼上到你的專案的目錄res/raw/下面即可,不存在raw就直接建立就好,以後你就可以用第二步的同樣方法獲取物件進行操作了。
2、還是上點小編的程式碼:

public class ManageLocateData {
    private SQLiteDatabase          dbLocate;
    private String tableProvince    = "province";
    private String tableCity        = "city";
    private static HashMap<String, String> province;
    private static HashMap<String, String> city;

    public ManageLocateData() {
        dbLocate    = HiydApplication.dbOpenHelperLocate.getDb();
        province    = new HashMap<String, String>();
        city        = new HashMap<String, String>();

        initData();
    }

    public static HashMap<String, String> getProvince() {
        return province;
    }

    public static HashMap<String, String> getCity(String gco) {
        HashMap<String, String> hash = new HashMap<String, String>();
        String current = gco.substring(0, 5);
        Iterator<Map.Entry<String, String>> iter = city.entrySet().iterator();

        while (iter.hasNext()) {
            Map.Entry<String, String> entry = iter.next();
            String key      = entry.getKey();
            String key1     = key.substring(0, 5);
            String value    = entry.getValue();

            if (key1.equals(current)) {
                hash.put(key, value);
            }
        }

        return hash;
    }

    public static String getProvinceStr(String number) {
        if (number == null || number.length() < 5) {
            return null;
        }
        number = number.substring(0, 5);
        String name = province.get(number);
        LogUtil.logw("getProvinceStr", "name=" + name + "||number=" + number);

        return name;
    }

    public static String getCityStr(String number) {
        if (number == null || number.length() < 7) {
            return null;
        }
        String name = city.get(number);
        LogUtil.logw("getCityStr", "name=" + name + "||number=" + number);

        return name;
    }

    /**
     * load data
     */
    private void initData() {
        if (GlobalVar.language.endsWith("en")) {

        } else {
            getDataOfProvinceChina();
            getDataOfCityChina();
        }
    }

    private void getDataOfProvinceChina() {
        String sql = "select Chinese, Number from " + tableProvince + " order by Number";
        Cursor cursor;

        try {
            cursor = dbLocate.rawQuery(sql, new String[]{ });

            while (cursor.moveToNext()) {
                String chinese = cursor.getString(cursor.getColumnIndex("Chinese"));
                String number = cursor.getString(cursor.getColumnIndex("Number"));

                if (number.startsWith("001")) {
                    province.put(number, chinese);
                }
            }
            if (province == null)
                LogUtil.logw(getClass().getName(), "province is null");
        } catch (Exception e) {
            LogUtil.loge(getClass().getName(), e.getMessage());
        }
    }

    private void getDataOfCityChina() {
        String sql = "select Chinese, Number from " + tableCity + " order by Number";
        Cursor cursor;

        try {
            cursor = dbLocate.rawQuery(sql, new String[]{ });

            while (cursor.moveToNext()) {
                String chinese = cursor.getString(cursor.getColumnIndex("Chinese"));
                String number = cursor.getString(cursor.getColumnIndex("Number"));

                if (number.startsWith("001")) {
                    city.put(number, chinese);
                }
            }
            if (city == null)
                LogUtil.logw(getClass().getName(), "city is null");
        } catch (Exception e) {
            LogUtil.loge(getClass().getName(), e.getMessage());
        }
    }
}

程式碼說明:這是小編對放到專案中的資料庫檔案的部分相關操作,僅作參考哦。

心得:
這個小問題當初困了小編好幾天的,現在好不容易搞定了,希望後面來的同志不要像我一樣卡著浪費時間,所以寫了這篇文章,希望對大家有所幫助。

最後附上聯絡方式有不明白的可以隨時向小編求助哦,能幫我儘量幫哦!
QQ:1076880929