current i am working to my school project using android studio, it is an attendance system where I store my data to Firestore and the user are able to download/export the data to become Excel file. What I am trying to do is how can I get the all data in a single document of a Collection in firestore
here’s the code but it is only getting the first data in a document and it is showing in all the rows
export.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { firebaseFirestore.collection("QR").document("QRScanned").collection(LoginProfessorTabFragment.superName) .document(TeacherDash.subjectName1).collection("Record of Attendance") .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()){ HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFSheet hssfSheet = hssfWorkbook.createSheet(TeacherDash.subjectName1); for (int i = 0; i < 4; i++) {//for creating equal amount of row from the database HSSFRow row = hssfSheet.createRow(i); for (int j = 0; j <= cellCount; j++) {//creating each cell depends on the cell counter for (DocumentSnapshot documentSnapshot : task.getResult()){ String a = documentSnapshot.getString("Name"); String b = documentSnapshot.getString("Date"); String c = documentSnapshot.getString("Time"); String d = documentSnapshot.getString("StudentNumber"); String e = documentSnapshot.getString("Course"); String f = documentSnapshot.getString("Subject"); String g = documentSnapshot.getString("Room"); String h = documentSnapshot.getString("Schedule"); arrayExport.add(a); arrayExport.add(b); arrayExport.add(c); arrayExport.add(d); arrayExport.add(e); arrayExport.add(f); arrayExport.add(g); arrayExport.add(h); arrayRemoveAll.add(a); arrayRemoveAll.add(b); arrayRemoveAll.add(c); arrayRemoveAll.add(d); arrayRemoveAll.add(e); arrayRemoveAll.add(f); arrayRemoveAll.add(g); arrayRemoveAll.add(h); row.createCell(0).setCellValue(arrayExport.get(0)); row.createCell(1).setCellValue(arrayExport.get(1)); row.createCell(2).setCellValue(arrayExport.get(2)); row.createCell(3).setCellValue(arrayExport.get(3)); row.createCell(4).setCellValue(arrayExport.get(4)); row.createCell(5).setCellValue(arrayExport.get(5)); row.createCell(6).setCellValue(arrayExport.get(6)); row.createCell(7).setCellValue(arrayExport.get(7)); } } } try { if (!filePath.exists()) { filePath.createNewFile(); Toast.makeText(TeacherDash.this, "Download success", Toast.LENGTH_SHORT).show(); } FileOutputStream fileOutputStream = new FileOutputStream(filePath); hssfWorkbook.write(fileOutputStream); if (fileOutputStream != null) { fileOutputStream.flush(); fileOutputStream.close(); } } catch (Exception exception) { exception.printStackTrace(); } } } }); } });
Advertisement
Answer
You are looping over things multiple times where you probably don’t need to be. If you want to get multiple documents from a collection and have each document be a single row in the spreadsheet where the document fields fill the columns within that row, then you only need a single loop – over documents. It would look something like this:
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); HSSFSheet hssfSheet = hssfWorkbook.createSheet(TeacherDash.subjectName1); int rowNum = 0; for (DocumentSnapshot documentSnapshot : task.getResult()){ // Create a new row for each document HSSFRow row = hssfSheet.createRow(rowNum); ++rowNum; // Get the data from the firestore document // you want to put in this row String name = documentSnapshot.getString("Name"); String date = documentSnapshot.getString("Date"); String time = documentSnapshot.getString("Time"); String num = documentSnapshot.getString("StudentNumber"); String course = documentSnapshot.getString("Course"); String sub = documentSnapshot.getString("Subject"); String room = documentSnapshot.getString("Room"); String sched = documentSnapshot.getString("Schedule"); // Fill the contents of that row row.createCell(0).setCellValue(name); row.createCell(1).setCellValue(date); row.createCell(2).setCellValue(time); row.createCell(3).setCellValue(num); row.createCell(4).setCellValue(course); row.createCell(5).setCellValue(sub); row.createCell(6).setCellValue(room); row.createCell(7).setCellValue(sched); }