24

I am developing Android app with SQLite as a database. I want to export certain results from the database to Excel file format programmatically and store that Excel to local device path. I have come across following links:

So what is the exact procedure to implement Export to Excel for Android apps?

8
  • 1
    As per my opinion you should go with first link. one of the best way Commented Jan 30, 2014 at 4:55
  • @MD thnks but will send me some link which gives sort of tuto Commented Jan 30, 2014 at 4:57
  • Agree With MD @Aditi K Commented Jan 30, 2014 at 5:01
  • 1
    @Aditi K go to this link database-table-export-to-csv-in-android.html and export-and-import-data-db-table-to-csv.html Commented Jan 30, 2014 at 5:01
  • 1
    CSV is Comma Separated Values, so as the name suggests, get the relevant values for a particular row(s) in a Table in RDB with comma as their delimiter with each row separated with a new-line delimiter. Create this String and store the same in SD/Internal Memory for further use ! Commented Apr 27, 2014 at 19:20

5 Answers 5

14

This is the answer I have implemented successfully:

//new async task for file export to csv
private class ExportDatabaseCSVTask extends AsyncTask<String, String, Boolean> {
    private final ProgressDialog dialog = new ProgressDialog(SearchResultActivity.this);
    boolean memoryErr = false;
    
    // to show Loading dialog box
    @Override
    protected void onPreExecute() {
        this.dialog.setMessage("Exporting database...");
        this.dialog.show();
    }

    // to write process 
    protected Boolean doInBackground(final String... args) {

        boolean success = false;
        
        String currentDateString = new SimpleDateFormat(Constants.SimpleDtFrmt_ddMMyyyy).format(new Date());
        
        File dbFile = getDatabasePath("HLPL_FRETE.db");
        Log.v(TAG, "Db path is: " + dbFile); // get the path of db
        File exportDir = new File(Environment.getExternalStorageDirectory() + File.separator + Constants.FileNm.FILE_DIR_NM, "");
        
        long freeBytesInternal = new File(getApplicationContext().getFilesDir().getAbsoluteFile().toString()).getFreeSpace();           
        long megAvailable = freeBytesInternal / 1048576;
                    
        if (megAvailable < 0.1) {               
            System.out.println("Please check"+megAvailable);
            memoryErr = true;               
        }else {             
            exportDirStr = exportDir.toString();// to show in dialogbox
            Log.v(TAG, "exportDir path::" + exportDir);
            if (!exportDir.exists()) {
                exportDir.mkdirs();
            }   
            try {
                List<SalesActivity> listdata = salesLst;
                SalesActivity sa = null;
                String lob = null;
                for (int index = 0; index < listdata.size();) {
                    sa = listdata.get(index);
                    lob = sa.getLob();
                    break;
                }
                if (Constants.Common.OCEAN_LOB.equals(lob)) {

                    file = new File(exportDir, Constants.FileNm.FILE_OFS + currentDateString + ".csv");
                } else {
                    file = new File(exportDir, Constants.FileNm.FILE_AFS + currentDateString + ".csv");
                }
                file.createNewFile();
                CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
                
                
                // this is the Column of the table and same for Header of CSV
                // file
                if (Constants.Common.OCEAN_LOB.equals(lob)) {
                    csvWrite.writeNext(Constants.FileNm.CSV_O_HEADER);
                }else{
                    csvWrite.writeNext(Constants.FileNm.CSV_A_HEADER);
                }
                String arrStr1[] = { "SR.No", "CUTSOMER NAME", "PROSPECT", "PORT OF LOAD", "PORT OF DISCHARGE" };
                csvWrite.writeNext(arrStr1);

                if (listdata.size() > 0) {
                    for (int index = 0; index < listdata.size(); index++) {
                        sa = listdata.get(index);
                        String pol;
                        String pod;
                        if (Constants.Common.OCEAN_LOB.equals(sa.getLob())) {
                            pol = sa.getPortOfLoadingOENm();
                            pod = sa.getPortOfDischargeOENm();
                        } else {
                            pol = sa.getAirportOfLoadNm();
                            pod = sa.getAirportOfDischargeNm();
                        }
                        int srNo = index;
                        String arrStr[] = { String.valueOf(srNo + 1), sa.getCustomerNm(), sa.getProspectNm(), pol, pod };
                        csvWrite.writeNext(arrStr);
                    }
                    success = true;
                }
                csvWrite.close();
                
            } catch (IOException e) {
                Log.e("SearchResultActivity", e.getMessage(), e);
                return success;
            }
        }
        return success;
    }

    // close dialog and give msg
    protected void onPostExecute(Boolean success) {
        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }
        if (success) {
            dialogBox(Constants.Flag.FLAG_EXPRT_S);
        } else {                
            if (memoryErr==true) {
                dialogBox(Constants.Flag.FLAG_MEMORY_ERR);
            } else {
                dialogBox(Constants.Flag.FLAG_EXPRT_F);
            }
        }
    }
}
Sign up to request clarification or add additional context in comments.

3 Comments

Does it allow you to export any particular table from the database?
So much external variable/resources declaration that might confused new programmers
Add explanation and provide concise and clean code for easy understanding.
10

Excel file is the same as a .csv file.

  • Step 1: download this jar file https://code.google.com/p/opencsv/downloads/detail?name=opencsv-2.4.jar&can=2&q=

  • Step 2:

    private class ExportDatabaseCSVTask extends AsyncTask<String ,String, String>{
        private final ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        @Override
        protected void onPreExecute() {
            this.dialog.setMessage("Exporting database...");
            this.dialog.show();
        }
    
        protected String doInBackground(final String... args){
            File exportDir = new File(Environment.getExternalStorageDirectory(), "");
            if (!exportDir.exists()) {
                exportDir.mkdirs();
            }
    
            File file = new File(exportDir, "ExcelFile.csv");
            try {
    
                file.createNewFile();
                CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
    
                //data     
                ArrayList<String> listdata= new ArrayList<String>();
                listdata.add("Aniket");
                listdata.add("Shinde");
                listdata.add("pune");
                listdata.add("anything@anything");
                //Headers
                String arrStr1[] ={"First Name", "Last Name", "Address", "Email"};
                csvWrite.writeNext(arrStr1);
    
                String arrStr[] ={listdata.get(0), listdata.get(1), listdata.get(2), listdata.get(3)};
                csvWrite.writeNext(arrStr);   
    
                csvWrite.close();
                return "";
            }
            catch (IOException e){
                Log.e("MainActivity", e.getMessage(), e);
                return "";
            }
        }
    
        @SuppressLint("NewApi")
        @Override
        protected void onPostExecute(final String success) {
    
            if (this.dialog.isShowing()){
                this.dialog.dismiss();
            }
            if (success.isEmpty()){
                Toast.makeText(MainActivity.this, "Export successful!", Toast.LENGTH_SHORT).show();
            }
            else {
                Toast.makeText(MainActivity.this, "Export failed!", Toast.LENGTH_SHORT).show();
            }
        }
    } 
    

    Write Async task in your .java file

  • Step3: Add call this task

    ExportDatabaseCSVTask task=new ExportDatabaseCSVTask();
    task.execute();
    

ExcelFile.csv file will be created in your SD card.

1 Comment

It works with any POJO, if you want to write out a database table, write it out to a POJO that holds your data and from the POJO, you can write it into csv just as above.
6

ExportDatabaseCSVTask:

 public class ExportDatabaseCSVTask extends AsyncTask<String, Void, Boolean> {
        private final ProgressDialog dialog = new ProgressDialog(MainActivity.this);

        @Override
        protected void onPreExecute() {
            this.dialog.setMessage("Exporting database...");
            this.dialog.show();
        }

        protected Boolean doInBackground(final String... args) {
            String currentDBPath = "/data/"+ "your Package name" +"/databases/abc.db";
            File dbFile = getDatabasePath(""+currentDBPath);
            System.out.println(dbFile);  // displays the data base path in your logcat
            File exportDir = new File(Environment.getExternalStorageDirectory(), "/your Folder Name/");

            if (!exportDir.exists()) { exportDir.mkdirs(); }

            File file = new File(exportDir, "myfile.csv");
            try {
                file.createNewFile();
                CSVWriter csvWrite = new CSVWriter(new FileWriter(file));
                Cursor curCSV = simpledb.rawQuery("select * from " + tablename,null);
                csvWrite.writeNext(curCSV.getColumnNames());
                while(curCSV.moveToNext()) {
                    String arrStr[]=null;
                    String[] mySecondStringArray = new String[curCSV.getColumnNames().length];
                    for(int i=0;i<curCSV.getColumnNames().length;i++)
                    {
                        mySecondStringArray[i] =curCSV.getString(i);
                    }
                    csvWrite.writeNext(mySecondStringArray);
                }
                csvWrite.close();
                curCSV.close();
                return true;
            } catch (IOException e) {
                Log.e("MainActivity", e.getMessage(), e);
                return false;
            }
        }

        protected void onPostExecute(final Boolean success) {
            if (this.dialog.isShowing()) { this.dialog.dismiss(); }
            if (success) {
                 Toast.makeText(MainActivity.this, "Export successful!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Export failed", Toast.LENGTH_SHORT).show();
            }
        }
    }

CSVWriter:

 public class CSVWriter {

private PrintWriter pw;

private char separator;

private char quotechar;

private char escapechar;

private String lineEnd;

/** The character used for escaping quotes. */
public static final char DEFAULT_ESCAPE_CHARACTER = '"';

/** The default separator to use if none is supplied to the constructor. */
public static final char DEFAULT_SEPARATOR = ',';

/**
 * The default quote character to use if none is supplied to the
 * constructor.
 */
public static final char DEFAULT_QUOTE_CHARACTER = '"';

/** The quote constant to use when you wish to suppress all quoting. */
public static final char NO_QUOTE_CHARACTER = '\u0000';

/** The escape constant to use when you wish to suppress all escaping. */
public static final char NO_ESCAPE_CHARACTER = '\u0000';

/** Default line terminator uses platform encoding. */
public static final String DEFAULT_LINE_END = "\n";

/**
 * Constructs CSVWriter using a comma for the separator.
 *
 * @param writer
 *            the writer to an underlying CSV source.
 */
public CSVWriter(Writer writer) {
    this(writer, DEFAULT_SEPARATOR, DEFAULT_QUOTE_CHARACTER,
        DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END);
}

/**
 * Constructs CSVWriter with supplied separator, quote char, escape char and line ending.
 *
 * @param writer
 *            the writer to an underlying CSV source.
 * @param separator
 *            the delimiter to use for separating entries
 * @param quotechar
 *            the character to use for quoted elements
 * @param escapechar
 *            the character to use for escaping quotechars or escapechars
 * @param lineEnd
 *            the line feed terminator to use
 */
public CSVWriter(Writer writer, char separator, char quotechar, char escapechar, String lineEnd) {
    this.pw = new PrintWriter(writer);
    this.separator = separator;
    this.quotechar = quotechar;
    this.escapechar = escapechar;
    this.lineEnd = lineEnd;
}

/**
 * Writes the next line to the file.
 *
 * @param nextLine
 *            a string array with each comma-separated element as a separate
 *            entry.
 */
public void writeNext(String[] nextLine) {

    if (nextLine == null)
        return;

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < nextLine.length; i++) {

        if (i != 0) {
            sb.append(separator);
        }

        String nextElement = nextLine[i];
        if (nextElement == null)
            continue;
        if (quotechar !=  NO_QUOTE_CHARACTER)
            sb.append(quotechar);
        for (int j = 0; j < nextElement.length(); j++) {
            char nextChar = nextElement.charAt(j);
            if (escapechar != NO_ESCAPE_CHARACTER && nextChar == quotechar) {
                sb.append(escapechar).append(nextChar);
            } else if (escapechar != NO_ESCAPE_CHARACTER && nextChar == escapechar) {
                sb.append(escapechar).append(nextChar);
            } else {
                sb.append(nextChar);
            }
        }
        if (quotechar != NO_QUOTE_CHARACTER)
            sb.append(quotechar);
    }

    sb.append(lineEnd);
    pw.write(sb.toString());

}

/**
 * Flush underlying stream to writer.
 *
 * @throws IOException if bad things happen
 */
public void flush() throws IOException {

    pw.flush();

}

/**
 * Close the underlying stream writer flushing any buffered content.
 *
 * @throws IOException if bad things happen
 *
 */
public void close() throws IOException {
    pw.flush();
    pw.close();
}

 }

1 Comment

I think this is the clearer approach and not needed to add external libraries. Thanks.
1

I have recently implemented the excel export function in my app. I have also included my full code on how to export filtered data to excel instead of the whole table.

You will need to create a second table for this. The second that will hold the data you require for this operation (In my second table I have removed my autoincrament ID column because I dont want it in my excel file).

You will need to clear the second table first and then add entries.

Then use the SqLiteToExcel object to export db to excel and save the file somewhere.

Then I have an email intent with the excel file attached for sharing (allows sharing with other apps other than email). here is my method:

private void ExportData() {

 //CHECK IF YOU HAVE WRITE PERMISSIONS OR RETURN
int permission = ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

if (permission != PackageManager.PERMISSION_GRANTED) {
    Toast.makeText(getContext(), "Storage permissions not granted", Toast.LENGTH_SHORT).show();
    return;
}

//get database object
myDbhelper = new MyDbHelper(getContext());
SQLiteDatabase database = myDbhelper.getWritableDatabase();

//delete all entries in the second table
database.delete("Table2",null,null);

//Create a cursor of the main database with your filters and sort order applied
Cursor cursor = getActivity().getContentResolver().query(
        uri,
        projections,
        selection,
        args,
        sortOrder);

//loop through cursor and add entries from first table to second table
try {
    while (cursor.moveToNext()) {
        final String ColumnOneIndex = cursor.getString(cursor.getColumnIndexOrThrow("COLUMN_ONE"));
        final String ColumnTwoIndex = cursor.getString(cursor.getColumnIndexOrThrow("COLUMN_TWO"));
        final String ColumnThreeIndex = cursor.getString(cursor.getColumnIndexOrThrow("COLUMN_THREE"));

  //add entries from table one into the table two
        ContentValues values = new ContentValues();
        values.put("TABLE2_COLUMN_1", ColumnOneIndex);
        values.put("TABLE2_COLUMN_2", ColumnTwoIndex );
        values.put("TABLE2_COLUMN_3", ColumnThreeIndex);

        database.insert("table2", null, values);
    }
} finally {
    //close cursor after looping is complete
    cursor.close();
}

 //create a string for where you want to save the excel file
final String savePath = Environment.getExternalStorageDirectory() + "/excelfileTemp";
File file = new File(savePath);
if (!file.exists()) {
    file.mkdirs();
}
 //create the sqLiteToExcel object
SQLiteToExcel sqLiteToExcel = new SQLiteToExcel(getContext(), "databasefile.db",savePath);

//use sqLiteToExcel object to create the excel file 
sqLiteToExcel.exportSingleTable("table2","excelfilename.xls", new SQLiteToExcel.ExportListener() {
    @Override
    public void onStart() {

    }
    @Override
    public void onCompleted(String filePath) {
        //now attach the excel file created and be directed to email activity
        Uri newPath = Uri.parse("file://" + savePath + "/" +"excelfilename.xls");

        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());

        Intent emailintent = new Intent(Intent.ACTION_SEND);

        emailintent.setType("application/vnd.ms-excel");
        emailintent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        emailintent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");
        emailintent.putExtra(Intent.EXTRA_STREAM,newPath);

        startActivity(Intent.createChooser(emailintent, "Send Email"));
    }
    @Override
    public void onError(Exception e) {
        System.out.println("Error msg: " + e);
        Toast.makeText(getContext(), "Failed to Export data", Toast.LENGTH_SHORT).show();
    }
});
}

I have this method implemented in my app and it works

Comments

1

The CSV format is "string, string, string /n" for each line, the "," is the column separator and "/n" for rows. Get the data from the database and export them like this:

public static Boolean exportToCSV(List<Data> data, File file) {
    try {
        final String head = "ValueX, ValueY \n";

        if (!file.exists()) {
            file.createNewFile();
        }

        FileWriter fileWriter = new FileWriter(file.getAbsoluteFile());
        BufferedWriter writer = new BufferedWriter(fileWriter);
        writer.write(head);

        for (Item item : items) {
            final String line = String.format("%s,%s\n",
                    item.getValueX(),
                    item.getValueY());
            writer.write(line);
        }

        writer.close();
    } catch (IOException e) {
        return false;
    }

    return true;
}

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.