Firebase Realtime Database es el servicio de back-end proporcionado por Google para manejar tareas de back-end para sus aplicaciones de Android, aplicaciones de IOS y sus sitios web. Proporciona tantos servicios como almacenamiento, base de datos y muchos más. La función por la que Firebase es famoso por su Firebase Realtime Database. Al usar Firebase Realtime Database en su aplicación, puede brindar actualizaciones de datos en vivo a sus usuarios sin tener que actualizar su aplicación. En este artículo, cargaremos datos de hojas de Excel en la base de datos entiempo real de Firebase. Esto puede ser útil cuando está creando una aplicación de prueba en la que tiene que cargar muchas preguntas. En ese caso, puede cargar sus datos utilizando una hoja de Excel.
¿Qué vamos a construir en este artículo?
Construiremos una aplicación simple en la que cargaremos datos en la base de datos en tiempo real de Firebase usando Excel Sheet. En primer lugar, seleccionaremos un archivo de Excel y luego se cargará en Firebase tomando el número total de filas y columnas y luego se generará una identificación aleatoria en la que se almacenarán los datos de las filas. Tenga en cuenta que vamos a implementar este proyecto utilizando el lenguaje Java .
Implementación paso a paso
Paso 1: crear un nuevo proyecto
Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.
Paso 2: trabajar con el archivo AndroidManifest.xml
Para agregar datos a Firebase, deberíamos otorgar permisos para acceder a Internet. Para agregar estos permisos, vaya a la aplicación > AndroidManifest.xml y, dentro de ese archivo, agregue los siguientes permisos.
<usos-permiso android:name=”android.permission.INTERNET” />
<usos-permiso android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
<usos-permiso android:name=”android.permission.READ_EXTERNAL_STORAGE” />
Paso 3: Trabajar con el archivo build.gradle(app)
Agregue estas implementaciones en él
implementación fileTree(dir: ‘libs’, include: [‘*.jar’])
implementación ‘com.google.firebase:firebase-database:16.0.4’
archivos de implementación (‘libs/poi-3.12-android-a.jar’)
Paso 4: trabajar con el archivo activity_main.xml
Vaya a la aplicación > res > diseño > actividad_principal.xml y agregue el siguiente código a ese archivo. A continuación se muestra el código para el archivo activity_main.xml .
XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" tools:context=".MainActivity"> <Button android:id="@+id/excel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Here to upload excel Sheet" /> </LinearLayout>
Paso 5: trabajar con el archivo MainActivity.java
Abra el archivo MainActivity.java allí dentro de la clase, primero que nada, cree el objeto de la clase Button.
public static final int cellCount=2; Button excel;
En segundo lugar, dentro del método onCreate(), tenemos que vincular esos objetos con sus respectivos ID que hemos proporcionado en el archivo .XML.
excel = findViewById(R.id.excel);
Comprobación de permiso para el archivo de Excel desde el almacenamiento del teléfono
if(requestCode == 101){ if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ // if permission granted them select file selectfile(); } else { Toast.makeText(MainActivity.this, "Permission Not granted",Toast.LENGTH_LONG).show(); } }
Seleccionar archivo de Excel desde el teléfono
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // file is selected now start activity function to proceed startActivityForResult(Intent.createChooser(intent, "Select File"),102);
Obtener una hoja de Excel y verificar el total de filas y columnas y agregará esos valores a la base de datos.
XSSFSheet sheet=workbook.getSheetAt(0); FormulaEvaluator formulaEvaluator=workbook.getCreationHelper().createFormulaEvaluator(); int rowscount=sheet.getPhysicalNumberOfRows(); if(rowscount > 0){ // check row wise data for (int r=0;r<rowscount;r++){ Row row=sheet.getRow(r); if(row.getPhysicalNumberOfCells()==cellCount) { // get cell data String A = getCellData(row,0,formulaEvaluator); String B = getCellData(row,1,formulaEvaluator); } else { Toast.makeText(MainActivity.this,"row no. "+(r+1)+" has incorrect data",Toast.LENGTH_LONG).show(); return; } }
Java
import android.Manifest; import android.app.ProgressDialog; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.database.FirebaseDatabase; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.UUID; public class MainActivity extends AppCompatActivity { // initialising the cell count as 2 public static final int cellCount = 2; Button excel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); excel = findViewById(R.id.excel); // click on excel to select a file excel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { selectfile(); } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 101); } } }); } // request for storage permission if not given @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 101) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { selectfile(); } else { Toast.makeText(MainActivity.this, "Permission Not granted", Toast.LENGTH_LONG).show(); } } } private void selectfile() { // select the file from the file storage Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(Intent.createChooser(intent, "Select File"), 102); } protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 102) { if (resultCode == RESULT_OK) { String filepath = data.getData().getPath(); // If excel file then only select the file if (filepath.endsWith(".xlsx") || filepath.endsWith(".xls")) { readfile(data.getData()); } // else show the error else { Toast.makeText(this, "Please Select an Excel file to upload", Toast.LENGTH_LONG).show(); } } } } ProgressDialog dialog; private void readfile(final Uri file) { dialog = new ProgressDialog(this); dialog.setMessage("Uploading"); dialog.setCanceledOnTouchOutside(false); dialog.show(); AsyncTask.execute(new Runnable() { @Override public void run() { final HashMap<String, Object> parentmap = new HashMap<>(); try { XSSFWorkbook workbook; // check for the input from the excel file try (InputStream inputStream = getContentResolver().openInputStream(file)) { workbook = new XSSFWorkbook(inputStream); } final String timestamp = "" + System.currentTimeMillis(); XSSFSheet sheet = workbook.getSheetAt(0); FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); int rowscount = sheet.getPhysicalNumberOfRows(); if (rowscount > 0) { // check row wise data for (int r = 0; r < rowscount; r++) { Row row = sheet.getRow(r); if (row.getPhysicalNumberOfCells() == cellCount) { // get cell data String A = getCellData(row, 0, formulaEvaluator); String B = getCellData(row, 1, formulaEvaluator); // initialise the hash map and put value of a and b into it HashMap<String, Object> quetionmap = new HashMap<>(); quetionmap.put("A", A); quetionmap.put("B", B); String id = UUID.randomUUID().toString(); parentmap.put(id, quetionmap); } else { dialog.dismiss(); Toast.makeText(MainActivity.this, "row no. " + (r + 1) + " has incorrect data", Toast.LENGTH_LONG).show(); return; } } // add the data in firebase if everything is correct runOnUiThread(new Runnable() { @Override public void run() { // add the data according to timestamp FirebaseDatabase.getInstance().getReference().child("Data"). child(timestamp).updateChildren(parentmap).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { dialog.dismiss(); Toast.makeText(MainActivity.this, "Uploaded Successfully", Toast.LENGTH_LONG).show(); } else { dialog.dismiss(); Toast.makeText(MainActivity.this, "Something went wrong", Toast.LENGTH_LONG).show(); } } }); } }); } // show the error if file is empty else { runOnUiThread(new Runnable() { @Override public void run() { dialog.dismiss(); Toast.makeText(MainActivity.this, "File is empty", Toast.LENGTH_LONG).show(); } }); return; } } // show the error message if failed // due to file not found catch (final FileNotFoundException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); } }); } // show the error message if there // is error in input output catch (final IOException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); } }); } } }); } private String getCellData(Row row, int cellposition, FormulaEvaluator formulaEvaluator) { String value = ""; // get cell from excel sheet Cell cell = row.getCell(cellposition); switch (cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: return value + cell.getBooleanCellValue(); case Cell.CELL_TYPE_NUMERIC: return value + cell.getNumericCellValue(); case Cell.CELL_TYPE_STRING: return value + cell.getStringCellValue(); default: return value; } } }
Producción:
Datos guardados en la base de datos de esta manera
Enlace GitHub: https://github.com/Anni1123/UploadDataExcelSheet