خواندن excel نسخه XLS و XLSX
گاهی ممکنه نیاز باشه بخشی از اطلاع از طریق اکسل وارد برنامه بشه این اکسل ممکنه نسخه Excel 97-2003 Workbook یا همون XLS باشه یا نسخه XLSX که فکر میکنم 2007 به بعد هست ! هرچند که گرفتن خروجی CSV از اکسل ساده ترین راه برای پرازش کردن اون هست اما وقتی کاربر قراره این کارو انجام بده بهتره از نظر تجربه کاربری این مورد رو مدیریت کرده باشم .
خوندن نسخه های xls خیلی ساده است ، اما xlsx مستندات پر دردسری داشت
برای خوندن از روی XLS کافیه لایبری زیر رو استفاده کنید :
compile 'net.sourceforge.jexcelapi:jxl:2.6.12'
منابع :https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl
https://www.mkyong.com/java/jexcel-api-reading-and-writing-excel-file-in-java/
و نمونه کد بصورت زیر میشه :
private void jexcelapi(final String path) {
Workbook workbook = null;
try {
workbook = Workbook.getWorkbook(new File(path));
Sheet sheet = workbook.getSheet(0);
Log.i("LOG", "getRows: " + sheet.getRows());
} catch (IOException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
} finally {
if (workbook != null) {
workbook.close();
}
}
}
اما برای XLSX لایبری های زیر رو دانلود کنید :
https://github.com/andruhon/AndroidReadXLSX/tree/master/example/app/libs
نسخه ساپورت اون از اندروید 4 API 19 هست :
https://github.com/andruhon/AndroidReadXLSX/blob/master/example/app/build.gradle
منبع : http://blog.kondratev.pro/2014/09/reading-xlsx-on-android-3.html و https://github.com/andruhon/AndroidReadXLSX/tree/antbuild
برای اینکه پروژتون موقع بیلد پروژه و لایبری ها به مشکل نخوره لازمه این موارد رو هم رعایت کنید :
compile 'com.android.support:multidex:1.0.1'
و در defaultConfig مقدار multiDexEnabled true رو ست کنید
multiDexEnabled true
من تست کردم اونطوری که توی گرادل example گفته شده نیازی به خطوط زیر نیست :
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
}
در نهایت تست پروژه رو میتونید بصورت زیر انجام بدید :
private void excelTest() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
String type = "*/*";
// type = "application/vnd.ms-excel";
// type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
intent.setType(type);
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent, "Select txt file"), 200);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(G.context, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
Uri uri = data.getData();
String path = uri.getPath();
G.toast(path.contains(".xls") ? path : "NOT");
// jexcelapi(path);
if (path.contains(".xlsx")) {
apacheExcel(path);
} else {
jexcelapi(path);
}
}
}
private void apacheExcel(final String path) {
try {
XSSFWorkbook workbook = new XSSFWorkbook(path);
XSSFSheet sheet = workbook.getSheetAt(0);
Log.i("LOG", "getPhysicalNumberOfRows: " + sheet.getPhysicalNumberOfRows());
} catch (IOException e) {
e.printStackTrace();
}
}
private void jexcelapi(final String path) {
Workbook workbook = null;
try {
workbook = Workbook.getWorkbook(new File(path));
Sheet sheet = workbook.getSheet(0);
Log.i("LOG", "getRows: " + sheet.getRows());
} catch (IOException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
} finally {
if (workbook != null) {
workbook.close();
}
}
}
توی تصویر بالا هر دو نسخه XLS , XLSX دیتای مشابه دارند که نتیجه خروجی لاگ رو در صورت انتخاب هر کدوم بصورت زیر میشه :
I/LOG(14652): getRows: 33
I/LOG(16821): getPhysicalNumberOfRows: 33
لینک مفید :
http://poi.apache.org/
https://www.rgagnon.com/javadetails/java-0516.html
https://mvnrepository.com/artifact/org.apache.poi/poi
http://blog.kondratev.pro/2015/08/reading-xlsx-on-android-4-and-hopefully.html



پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .