@@ -7,26 +7,48 @@ import java.io.File
77
88object CsvExporter {
99
10- // Cette fonction crée un fichier CSV dans le stockage interne de l’app.
10+ // Récupère les propriétés dans l'ordre EXACT de déclaration dans la data class
11+ private fun orderedFields (clazz : Class <* >): List <java.lang.reflect.Field > {
12+ return clazz.declaredFields
13+ .filter { ! it.name.contains(" $" ) } // ignore les champs internes Kotlin
14+ }
15+
16+ // Génère l'en-tête CSV automatiquement
17+ private fun csvHeader (clazz : Class <* >): String {
18+ return orderedFields(clazz)
19+ .joinToString(" ;" ) { it.name }
20+ }
21+
22+ // Génère une ligne CSV pour un objet
23+ private fun csvLine (obj : Any ): String {
24+ val clazz = obj::class .java
25+ return orderedFields(clazz)
26+ .joinToString(" ;" ) { field ->
27+ field.isAccessible = true
28+ val value = field.get(obj)
29+ value?.toString() ? : " "
30+ }
31+ }
32+
1133 fun exportToCsv (
1234 context : Context ,
1335 wines : List <WineEntity >,
1436 fileName : String = "openwinemer_export.csv"
1537 ): File {
38+
1639 val file = File (context.filesDir, fileName)
40+
1741 file.bufferedWriter().use { out ->
18- // Ligne d’en-tête (noms des colonnes).
19- out .write(
20- " id;name;producer;cuvee;vintage;wineType;color;country;region;stockQuantity\n "
21- )
22- wines.forEach { w ->
23- out .write(
24- " ${w.id} ;${w.name ? : " " } ;${w.producer ? : " " } ;${w.cuvee ? : " " } ;" +
25- " ${w.vintage ? : " " } ;${w.wineType ? : " " } ;${w.color ? : " " } ;" +
26- " ${w.country ? : " " } ;${w.region ? : " " } ;${w.stockQuantity ? : " " } \n "
27- )
42+
43+ // 1) Écrire l'en-tête automatiquement
44+ out .write(csvHeader(WineEntity ::class .java) + " \n " )
45+
46+ // 2) Écrire chaque ligne automatiquement
47+ wines.forEach { wine ->
48+ out .write(csvLine(wine) + " \n " )
2849 }
2950 }
51+
3052 return file
3153 }
3254}
0 commit comments