android:利用jxl从excel中读取文件


          在开发的过程过,第一次遇到这么一个问题,应用的数据需要我从excel中读取,然后一番寻思,与搜索,找到了jxl。jxl是一个开源的java框架,可以十分方便的读取excel中的数据,那么现在我就分享如何实用化使用jxl这个开源框架从excel中读取文件。

第一步添加依赖。

compile 'com.hynnet:jxl:2.6.12.1'

因为从excel中的内容相对比较多,所我采用AsyncTask在后台处理数据,首先我们先创建一个工具类ExcelUtils。我的想法是不用每次都从excel中读取,那样太耗费时间了,所以我们第一次的时候是从excel中读取,后面的全部从数据库中读取,速度会相对快不少,所以我们需要创建一个SQLOpenHelper来帮助我们打开一个数据库。

/**
 * Created by 37266 on 2017/4/20.
 */

public class ParkSQLOpenHelper extends SQLiteOpenHelper {
    private static ParkSQLOpenHelper parkSQLOpenHelper=null;
    //构造方法(实例化一个类)
    public ParkSQLOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
    //单例模式
    public static ParkSQLOpenHelper getInstance(Context context){
            if(parkSQLOpenHelper==null){//如果数据库打开助手为空,那么我们实例化数据库打开助手。
                parkSQLOpenHelper=new ParkSQLOpenHelper(context,"park.db",null,1);
            }
        return parkSQLOpenHelper;
    }
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //创建数据表,保存我们的excel数据。
        sqLiteDatabase.execSQL("create table parkInfo(_id integer primary key autoincrement," +
                "area varchar(50)," +
                "recordId varchar(50)," +
                "id varchar(10)," +
                "parkName varchar(50)," +
                "parkType varchar(50)," +
                "parkCompany varchar(50)," +
                "parkNum varchar(50)," +
                "parkLevel varchar(50)" +
                ")");
    }
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

数据库的代码我就不上了,熟练数据库的增删改查是一个程序员的基本要求。接下来是ExcelUtils的代码,代码里也有详细介绍,我就不说了。

public class ExcelUtils {
    //数据库打开助手
    private ParkSQLOpenHelper parkSQLOpenHelper=null;
    private ParkDatabase parkDatabase=null;
    private static ExcelUtils excelUtils=null;
    //构造方法
    public ExcelUtils(Context context) {
        parkSQLOpenHelper=ParkSQLOpenHelper.getInstance(context);
        parkDatabase=ParkDatabase.getInstance(context);
    }
    //单利模式
    public static ExcelUtils getInstance(Context context){
        if(excelUtils==null){
            excelUtils=new ExcelUtils(context.getApplicationContext());
        }
        return excelUtils;
    }
    /*
    * 将excel中的数据读取到数据库中
    * */
    public void readExcelToDB(Context context){
        SQLiteDatabase sqLiteDatabase=parkSQLOpenHelper.getReadableDatabase();
        Cursor cursor=sqLiteDatabase.query("parkInfo",null,null,null,null,null,null);
//        判断是否已经将excel的数据保存在数据库,如果没有保存,就将数据保存在数据库中,为了避免重复添加,
//        所以每次添加前先都要先将数据库清空。
        SharedPreferences sharedPreferences=context.getSharedPreferences("excel",Context.MODE_PRIVATE);
        Boolean noConfig=sharedPreferences.getBoolean("readExcel",true);//默认是没有保存过
        Log.e("readExcelToDB",noConfig+"-----config---------");
        if(noConfig){//如果没有保存过而且数据库parkInfo表的内容为空
            try {
                //我们把excel放在Assset目录下,通过Workbook.getWorkbook(inputStream);获取到整个excel。
                InputStream inputStream=context.getAssets().open("data.xls");
                Workbook workbook=Workbook.getWorkbook(inputStream);
                //获取第一张excel数据表。
                Sheet sheet=workbook.getSheet(0);
                int rows=sheet.getRows();//获取该表中有多少行数据。
                Log.e("readExcelToDB",rows+"-------rows-------");
                ParkInfo parkInfo=null;
                for(int i=0;i<rows;i++){
                    //sheet.getCell(0,i)),在这里i表示第几行数据,012346表示第几列,从0开始算。
                    String area=(sheet.getCell(0,i)).getContents();
                    String recordId=(sheet.getCell(1,i)).getContents();
                    String id=(sheet.getCell(2,i)).getContents();
                    String parkName=(sheet.getCell(3,i)).getContents();
                    String parkTime=(sheet.getCell(4,i)).getContents();
                    String parkCompany=(sheet.getCell(5,i)).getContents();
                    String parkNum=(sheet.getCell(6,i)).getContents();
                    String parkLevel=(sheet.getCell(9,i)).getContents();
                    parkInfo=new ParkInfo(area,recordId,id,parkName,parkTime,parkCompany,parkNum,parkLevel);
                    Log.e("ExcelUtils",parkInfo.toString());
                    parkDatabase.saveParkInfo(parkInfo);//把数据保存到数据库中。
                }
                sharedPreferences.edit().putBoolean("readExcel",false).commit();//读取完毕后,把记录置为不读。
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


好了,ExcelUitls弄好了,那么接下来就是如何在activity中调用了。因为excel中的数据可能会特别特别的多,所以我采用AsyncTask在后台处理数据,当数据处理完以后再展示到前台,AsyncTask的代码如下。

    class ExcelAsynTask extends AsyncTask<Void,Void,ArrayList<ParkInfo>>{
        //运行子主线程,执行耗时操作,防止主线程阻塞,出现ANR
        @Override
        protected ArrayList<ParkInfo> doInBackground(Void... voids) {
            //实例化excelUitls。
            ExcelUtils excelUtils=ExcelUtils.getInstance(MainActivity.this);
            //将从excel读取的数据保存到数据库中(在readExcelToDB里有一个判断是不是保存)
            excelUtils.readExcelToDB(MainActivity.this);
            //获取parkDatabase实例
            ParkDatabase parkDatabase=ParkDatabase.getInstance(MainActivity.this);
            //从数据库中读取数据
            ArrayList<ParkInfo> parkInfos=parkDatabase.readAllParkInfo();
            //将数据返回回去,这里返回的数据会传递到onPostExecute的形参中。
            return parkInfos;
        }
        //运行于主线程,更新进度
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
        //运行于主线程,耗时操作结束后执行该方法
        @Override
        protected void onPostExecute(ArrayList<ParkInfo> list) {
            initRecyclerView(list);//运行于主线程,刷新UI
            super.onPostExecute(list);
        }
    }

关于jxl的简介到此结束。


关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com