└── ImportExcelData ├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── app ├── .gitignore ├── build.gradle ├── libs │ ├── poi-3.12-android-a.jar │ └── poi-ooxml-schemas-3.12-20150511-a.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── tabian │ │ └── importexceldata │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── tabian │ │ │ └── importexceldata │ │ │ ├── MainActivity.java │ │ │ └── XYValue.java │ └── res │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── tabian │ └── importexceldata │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /ImportExcelData/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /ImportExcelData/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /ImportExcelData/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /ImportExcelData/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /ImportExcelData/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 46 | -------------------------------------------------------------------------------- /ImportExcelData/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ImportExcelData/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /ImportExcelData/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /ImportExcelData/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.1" 6 | defaultConfig { 7 | applicationId "com.tabian.importexceldata" 8 | minSdkVersion 18 9 | targetSdkVersion 24 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 13 | multiDexEnabled true 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | 21 | } 22 | packagingOptions { 23 | exclude 'META-INF/DEPENDENCIES' 24 | exclude 'META-INF/NOTICE' 25 | exclude 'META-INF/NOTICE.txt' 26 | exclude 'META-INF/LICENSE' 27 | exclude 'META-INF/LICENSE.txt' 28 | } 29 | } 30 | 31 | dependencies { 32 | compile fileTree(dir: 'libs', include: ['*.jar']) 33 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 34 | exclude group: 'com.android.support', module: 'support-annotations' 35 | }) 36 | compile 'com.android.support:appcompat-v7:24.2.1' 37 | testCompile 'junit:junit:4.12' 38 | compile fileTree(dir: 'libs', include: ['*.jar']) 39 | compile 'com.android.support:multidex:1.0.1' 40 | } 41 | -------------------------------------------------------------------------------- /ImportExcelData/app/libs/poi-3.12-android-a.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/ImportFromExcel/b06ad889663f312770434a15289dc14b7bd11c95/ImportExcelData/app/libs/poi-3.12-android-a.jar -------------------------------------------------------------------------------- /ImportExcelData/app/libs/poi-ooxml-schemas-3.12-20150511-a.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mitchtabian/ImportFromExcel/b06ad889663f312770434a15289dc14b7bd11c95/ImportExcelData/app/libs/poi-ooxml-schemas-3.12-20150511-a.jar -------------------------------------------------------------------------------- /ImportExcelData/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\Users\User\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /ImportExcelData/app/src/androidTest/java/com/tabian/importexceldata/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.tabian.importexceldata; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.tabian.importexceldata", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ImportExcelData/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /ImportExcelData/app/src/main/java/com/tabian/importexceldata/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.tabian.importexceldata; 2 | 3 | import android.Manifest; 4 | import android.os.Build; 5 | import android.os.Environment; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.os.Bundle; 8 | import android.util.Log; 9 | import android.view.View; 10 | import android.widget.AdapterView; 11 | import android.widget.ArrayAdapter; 12 | import android.widget.Button; 13 | import android.widget.ListView; 14 | import android.widget.Toast; 15 | 16 | import org.apache.poi.hssf.usermodel.HSSFDateUtil; 17 | import org.apache.poi.ss.usermodel.Cell; 18 | import org.apache.poi.ss.usermodel.CellValue; 19 | import org.apache.poi.ss.usermodel.FormulaEvaluator; 20 | import org.apache.poi.ss.usermodel.Row; 21 | import org.apache.poi.xssf.usermodel.XSSFSheet; 22 | import org.apache.poi.xssf.usermodel.XSSFWorkbook; 23 | 24 | import java.io.File; 25 | import java.io.FileInputStream; 26 | import java.io.FileNotFoundException; 27 | import java.io.IOException; 28 | import java.io.InputStream; 29 | import java.text.SimpleDateFormat; 30 | import java.util.ArrayList; 31 | 32 | public class MainActivity extends AppCompatActivity { 33 | 34 | private static final String TAG = "MainActivity"; 35 | 36 | // Declare variables 37 | private String[] FilePathStrings; 38 | private String[] FileNameStrings; 39 | private File[] listFile; 40 | File file; 41 | 42 | Button btnUpDirectory,btnSDCard; 43 | 44 | ArrayList pathHistory; 45 | String lastDirectory; 46 | int count = 0; 47 | 48 | ArrayList uploadData; 49 | 50 | ListView lvInternalStorage; 51 | 52 | 53 | @Override 54 | protected void onCreate(Bundle savedInstanceState) { 55 | super.onCreate(savedInstanceState); 56 | setContentView(R.layout.activity_main); 57 | lvInternalStorage = (ListView) findViewById(R.id.lvInternalStorage); 58 | btnUpDirectory = (Button) findViewById(R.id.btnUpDirectory); 59 | btnSDCard = (Button) findViewById(R.id.btnViewSDCard); 60 | uploadData = new ArrayList<>(); 61 | 62 | //need to check the permissions 63 | checkFilePermissions(); 64 | 65 | lvInternalStorage.setOnItemClickListener(new AdapterView.OnItemClickListener() { 66 | @Override 67 | public void onItemClick(AdapterView adapterView, View view, int i, long l) { 68 | lastDirectory = pathHistory.get(count); 69 | if(lastDirectory.equals(adapterView.getItemAtPosition(i))){ 70 | Log.d(TAG, "lvInternalStorage: Selected a file for upload: " + lastDirectory); 71 | 72 | //Execute method for reading the excel data. 73 | readExcelData(lastDirectory); 74 | 75 | }else 76 | { 77 | count++; 78 | pathHistory.add(count,(String) adapterView.getItemAtPosition(i)); 79 | checkInternalStorage(); 80 | Log.d(TAG, "lvInternalStorage: " + pathHistory.get(count)); 81 | } 82 | } 83 | }); 84 | 85 | //Goes up one directory level 86 | btnUpDirectory.setOnClickListener(new View.OnClickListener() { 87 | @Override 88 | public void onClick(View view) { 89 | if(count == 0){ 90 | Log.d(TAG, "btnUpDirectory: You have reached the highest level directory."); 91 | }else{ 92 | pathHistory.remove(count); 93 | count--; 94 | checkInternalStorage(); 95 | Log.d(TAG, "btnUpDirectory: " + pathHistory.get(count)); 96 | } 97 | } 98 | }); 99 | 100 | //Opens the SDCard or phone memory 101 | btnSDCard.setOnClickListener(new View.OnClickListener() { 102 | @Override 103 | public void onClick(View view) { 104 | count = 0; 105 | pathHistory = new ArrayList(); 106 | pathHistory.add(count,System.getenv("EXTERNAL_STORAGE")); 107 | Log.d(TAG, "btnSDCard: " + pathHistory.get(count)); 108 | checkInternalStorage(); 109 | } 110 | }); 111 | 112 | } 113 | 114 | /** 115 | *reads the excel file columns then rows. Stores data as ExcelUploadData object 116 | * @return 117 | */ 118 | private void readExcelData(String filePath) { 119 | Log.d(TAG, "readExcelData: Reading Excel File."); 120 | 121 | //decarle input file 122 | File inputFile = new File(filePath); 123 | 124 | try { 125 | InputStream inputStream = new FileInputStream(inputFile); 126 | XSSFWorkbook workbook = new XSSFWorkbook(inputStream); 127 | XSSFSheet sheet = workbook.getSheetAt(0); 128 | int rowsCount = sheet.getPhysicalNumberOfRows(); 129 | FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); 130 | StringBuilder sb = new StringBuilder(); 131 | 132 | //outter loop, loops through rows 133 | for (int r = 1; r < rowsCount; r++) { 134 | Row row = sheet.getRow(r); 135 | int cellsCount = row.getPhysicalNumberOfCells(); 136 | //inner loop, loops through columns 137 | for (int c = 0; c < cellsCount; c++) { 138 | //handles if there are to many columns on the excel sheet. 139 | if(c>2){ 140 | Log.e(TAG, "readExcelData: ERROR. Excel File Format is incorrect! " ); 141 | toastMessage("ERROR: Excel File Format is incorrect!"); 142 | break; 143 | }else{ 144 | String value = getCellAsString(row, c, formulaEvaluator); 145 | String cellInfo = "r:" + r + "; c:" + c + "; v:" + value; 146 | Log.d(TAG, "readExcelData: Data from row: " + cellInfo); 147 | sb.append(value + ", "); 148 | } 149 | } 150 | sb.append(":"); 151 | } 152 | Log.d(TAG, "readExcelData: STRINGBUILDER: " + sb.toString()); 153 | 154 | parseStringBuilder(sb); 155 | 156 | }catch (FileNotFoundException e) { 157 | Log.e(TAG, "readExcelData: FileNotFoundException. " + e.getMessage() ); 158 | } catch (IOException e) { 159 | Log.e(TAG, "readExcelData: Error reading inputstream. " + e.getMessage() ); 160 | } 161 | } 162 | 163 | /** 164 | * Method for parsing imported data and storing in ArrayList 165 | */ 166 | public void parseStringBuilder(StringBuilder mStringBuilder){ 167 | Log.d(TAG, "parseStringBuilder: Started parsing."); 168 | 169 | // splits the sb into rows. 170 | String[] rows = mStringBuilder.toString().split(":"); 171 | 172 | //Add to the ArrayList row by row 173 | for(int i=0; i adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, FilePathStrings); 281 | lvInternalStorage.setAdapter(adapter); 282 | 283 | }catch(NullPointerException e){ 284 | Log.e(TAG, "checkInternalStorage: NULLPOINTEREXCEPTION " + e.getMessage() ); 285 | } 286 | } 287 | 288 | private void checkFilePermissions() { 289 | if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){ 290 | int permissionCheck = this.checkSelfPermission("Manifest.permission.READ_EXTERNAL_STORAGE"); 291 | permissionCheck += this.checkSelfPermission("Manifest.permission.WRITE_EXTERNAL_STORAGE"); 292 | if (permissionCheck != 0) { 293 | 294 | this.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE}, 1001); //Any number 295 | } 296 | }else{ 297 | Log.d(TAG, "checkBTPermissions: No need to check permissions. SDK version < LOLLIPOP."); 298 | } 299 | } 300 | 301 | /** 302 | * customizable toast 303 | * @param message 304 | */ 305 | private void toastMessage(String message){ 306 | Toast.makeText(this,message, Toast.LENGTH_SHORT).show(); 307 | } 308 | 309 | 310 | } 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | -------------------------------------------------------------------------------- /ImportExcelData/app/src/main/java/com/tabian/importexceldata/XYValue.java: -------------------------------------------------------------------------------- 1 | package com.tabian.importexceldata; 2 | 3 | /** 4 | * Created by User on 1/21/2017. 5 | */ 6 | 7 | public class XYValue { 8 | 9 | private double x; 10 | private double y; 11 | 12 | public XYValue(double x, double y) { 13 | this.x = x; 14 | this.y = y; 15 | } 16 | 17 | public double getX() { 18 | return x; 19 | } 20 | 21 | public void setX(double x) { 22 | this.x = x; 23 | } 24 | 25 | public double getY() { 26 | return y; 27 | } 28 | 29 | public void setY(double y) { 30 | this.y = y; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /ImportExcelData/app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 11 | 12 |