第一步添加依赖。
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
好了,ExcelUitls弄好了,那么接下来就是如何在activity中调用了。因为excel中的数据可能会特别特别的多,所以我采用AsyncTask在后台处理数据,当数据处理完以后再展示到前台,AsyncTask的代码如下。
class ExcelAsynTask extends AsyncTask>{
//运行子主线程,执行耗时操作,防止主线程阻塞,出现ANR
@Override
protected ArrayList doInBackground(Void... voids) {
//实例化excelUitls。
ExcelUtils excelUtils=ExcelUtils.getInstance(MainActivity.this);
//将从excel读取的数据保存到数据库中(在readExcelToDB里有一个判断是不是保存)
excelUtils.readExcelToDB(MainActivity.this);
//获取parkDatabase实例
ParkDatabase parkDatabase=ParkDatabase.getInstance(MainActivity.this);
//从数据库中读取数据
ArrayList parkInfos=parkDatabase.readAllParkInfo();
//将数据返回回去,这里返回的数据会传递到onPostExecute的形参中。
return parkInfos;
}
//运行于主线程,更新进度
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
//运行于主线程,耗时操作结束后执行该方法
@Override
protected void onPostExecute(ArrayList list) {
initRecyclerView(list);//运行于主线程,刷新UI
super.onPostExecute(list);
}
}