diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 7d760a5e0cb43c980fe1c071a02760b50157b7ba..58d9bf3daeef791ce0866be18d545d715a31703c 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -33,8 +33,14 @@ android {
     buildFeatures {
         viewBinding = true
     }
+
+    packaging {
+        resources.excludes.add("META-INF/DEPENDENCIES")
+    }
 }
 
+
+
 dependencies {
 
     implementation("androidx.core:core-ktx:1.8.0")
@@ -64,6 +70,8 @@ dependencies {
     implementation("com.squareup.retrofit2:converter-moshi:2.9.0")
     implementation("androidx.preference:preference:1.2.1")
 
+    implementation("io.github.evanrupert:excelkt:1.0.2")
+
     testImplementation("junit:junit:4.13.2")
     androidTestImplementation("androidx.test.ext:junit:1.1.5")
     androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f1ec3ca3962e81c27a5cfc2d2f70cc2cf38411e2..524104533e9a21551af37a80fdf31a32e97deb80 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
     xmlns:tools="http://schemas.android.com/tools">
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
     <application
         android:allowBackup="true"
diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt
index 8018684cc1dabee268479d5c16e1e2029ee1dba6..4e59685263b89adacc8550050b17a4e34b81a240 100644
--- a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt
@@ -63,9 +63,16 @@ class SettingsFragment : Fragment() {
             //todo
         }
 
+        val database = MockDatabase()
+        val exporter = TransactionsExporter(database)
+
         saveButton.setOnClickListener{
             Toast.makeText(appContext, "Menyimpan transaksi...", Toast.LENGTH_SHORT).show()
-            //todo
+            //todo choose one
+            exporter.exportToXLS()
+            exporter.exportToXLSX()
+
+            Toast.makeText(appContext, "Penyimpanan pada folder Documents berhasil...", Toast.LENGTH_SHORT).show()
         }
 
         sendButton.setOnClickListener{
diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsViewModel.kt
index 6038adcbe40a12ade0663f68d32d295401f2690a..126d2f8867aa68b32386f7eb25275f64d1044596 100644
--- a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsViewModel.kt
+++ b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsViewModel.kt
@@ -16,7 +16,6 @@ class SettingsViewModel(private val loginRepository: LoginRepository) : ViewMode
     fun logout(){
         loginRepository.logout()
     }
-
     fun getUser(): LoggedInUser? {
         return loginRepository.getUser()
     }
diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/TransactionsExporter.kt b/app/src/main/java/com/example/bondoyap/ui/settings/TransactionsExporter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f145acb54d27261c0369c924ba8ccc3efb5e5491
--- /dev/null
+++ b/app/src/main/java/com/example/bondoyap/ui/settings/TransactionsExporter.kt
@@ -0,0 +1,87 @@
+package com.example.bondoyap.ui.settings
+
+import android.os.Environment
+import android.util.Log
+import io.github.evanrupert.excelkt.Sheet
+import io.github.evanrupert.excelkt.workbook
+import org.apache.poi.ss.usermodel.FillPatternType
+import org.apache.poi.ss.usermodel.IndexedColors
+import java.io.File
+
+interface Database {
+    fun getTransactions(): List<Transaction>
+}
+
+class MockDatabase : Database {
+    override fun getTransactions(): List<Transaction> {
+        return findTransactions()
+    }
+}
+
+data class Transaction(
+    val date: String,
+    val category: String,
+    val amount: Double,
+    val name: String,
+    val location: String
+)
+
+fun findTransactions(): List<Transaction> = listOf(
+    Transaction("2024-04-01", "Pemasukan", 100.0, "Gaji", "AAAAA"),
+    Transaction("2024-04-02", "Pengeluaran", 50.0, "Belanja", "BBBBB"),
+    Transaction("2024-04-03", "Pemasukan", 200.0, "Bonus", "CCCC")
+)
+
+class TransactionsExporter(private val database: Database) {
+    fun exportToXLS() {
+        val transactions = database.getTransactions()
+        Log.d("SaveDebug", "xls function")
+        writeToExcel("transactions.xls", transactions)
+    }
+
+    fun exportToXLSX() {
+        val transactions = database.getTransactions()
+        Log.d("SaveDebug", "xls function")
+        writeToExcel("transactions.xlsx", transactions)
+    }
+
+    private fun writeToExcel(fileName: String, transactions: List<Transaction>) {
+        val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
+        val file = File(downloadsDir, fileName)
+
+        workbook {
+            sheet("Transactions") {
+                transactionsHeader()
+
+                for (transaction in transactions) {
+                    row {
+                        cell(transaction.date)
+                        cell(transaction.category)
+                        cell(transaction.amount)
+                        cell(transaction.name)
+                        cell(transaction.location)
+                    }
+                }
+            }
+        }.write(file.absolutePath)
+    }
+
+
+    private fun Sheet.transactionsHeader() {
+        val headings = listOf("Tanggal", "Kategori Transaksi", "Nominal Transaksi", "Nama Transaksi", "Lokasi")
+
+        val headingStyle = createCellStyle {
+            setFont(createFont {
+                fontName = "IMPACT"
+                color = IndexedColors.BLACK.index
+            })
+
+            fillPattern = FillPatternType.SOLID_FOREGROUND
+            fillForegroundColor = IndexedColors.YELLOW.index
+        }
+
+        row(headingStyle) {
+            headings.forEach { cell(it) }
+        }
+    }
+}
\ No newline at end of file