הטמעת ייצוא נתונים (CSV, Excel) מאפליקציות מובייל
המשתמש לוחץ על "ייצוא" — ומחכה. אם יש 5000 שורות במסד נתונים מקומי SQLite או Room, והייצוא רץ על ה-thread הראשי, האפליקציה קופאת למשך שניות, ובמכשירים ישנים יותר, ANR (אפליקציה לא מגיבה) הוא כמעט מובטח. זו הטעות הראשונה והנפוצה ביותר בהטמעת ייצוא. בתרגול שלנו, אנו נתקלים במצבים כאלה כל הזמן ופיתחנו גישה אמינה שמבטיחה פעולה יציבה גם במכשירים עם 2 GB של זיכרון RAM.
המהנדסים שלנו עם שבע שנות ניסיון בפיתוח מובייל סיפקו מעל 50 פרויקטים הכוללים ייצוא נתונים. כל פרויקט נבדק על נפחי נתונים אמיתיים של עד 500,000 שורות. לדוגמה, באפליקציית לוגיסטיקה עם 500,000 רשומות עסקאות, צמצמנו את זמן הייצוא מ-15 שניות ל-2.1 שניות על ידי שימוש בכתיבה בקבוצות על thread רקע. צרו קשר — נבדוק את הארכיטקטורה שלכם תוך 30 דקות.
למה קידוד הוא מלכודת
CSV הוא מלכודת. Excel ב-Windows מצפה לקידוד Windows-1252 ולנקודה-פסיק `;` כמפריד, לא לפסיק. אם תספקו UTF-8 ללא BOM, הטקסט הקירילי יהפוך לגיבריש. ה-CSV הנכון עבור Excel: UTF-8 עם BOM (`\uFEFF` בתחילת הקובץ) ומפריד של נקודה-פסיק. או ייצאו ישירות כ-`.xlsx` באמצעות ספרייה.בעיות שאנו פותרים בפועל
קפיאת ממשק משתמש במהלך יצירת קובץ. סריאליזציה של 10,000 שורות ל-CSV אינה מיידית. באנדרואיד השתמשו ב-CoroutineScope(Dispatchers.IO), ב-iOS ב-DispatchQueue.global(qos: .userInitiated). אנו תמיד מעבירים את יצירת הקובץ ל-thread רקע ומחזירים את התוצאה דרך callback או Flow.
קידוד ומפריד. CSV הוא מלכודת. Excel ב-Windows מצפה לקידוד Windows-1252 ולנקודה-פסיק ; כמפריד, לא לפסיק. אם תספקו UTF-8 ללא BOM, הטקסט הקירילי יהפוך לגיבריש במשרד של הלקוח. ה-CSV הנכון עבור Excel: UTF-8 עם BOM (,) ומפריד של נקודה-פסיק. או ייצאו ישירות כ-\uFEFF באמצעות ספרייה.
ייצוא ל-Excel (.xlsx). באנדרואיד אנו משתמשים ב-Apache POI או ב-FastExcel הקל יותר. ב-iOS — xlsxwriter דרך Swift Package או מחולל XML מותאם אישית (; הוא ZIP של קבצי XML). אפליקציות React Native יכולות להשתמש ב-.xlsx מעל ספריית .xlsx של js.
איך אנו בונים את הייצוא
התכנית פשוטה: קריאת נתונים ממסד הנתונים המקומי → המרה למודל שורות → כתיבה לקובץ → שיתוף דרך ShareSheet / react-native-xlsx של המערכת.
באנדרואיד עם Room:
viewModelScope.launch(Dispatchers.IO) {
val rows = database.transactionDao().getAll()
val file = CsvExporter.export(rows, context.cacheDir)
withContext(Dispatchers.Main) {
shareFile(file, "text/csv")
}
}ב-iOS באופן דומה דרך xlsx:
Task.detached(priority: .userInitiated) {
let rows = await store.fetchAll()
let url = try CsvExporter.write(rows, to: .cachesDirectory)
await MainActor.run {
presentShareSheet(url)
}
}עבור ShareSheet ב-iOS, אנו יוצרים מבנה XML ידנית או דרך Intent.ACTION_SEND / viewModelScope.launch(Dispatchers.IO) { val rows = database.transactionDao().getAll() val file = CsvExporter.export(rows, context.cacheDir) withContext(Dispatchers.Main) { shareFile(file, "text/csv") } } . עבור טבלאות פשוטות, גישת ה-XML מהירה יותר וללא תלות בספריות.
התקדמות עבור נפחים גדולים
אם מספר השורות עולה על 50,000, אנו מציגים Task.detached עם אחוז אמיתי. באנדרואיד דרך Task.detached(priority: .userInitiated) { let rows = await store.fetchAll() let url = try CsvExporter.write(rows, to: .cachesDirectory) await MainActor.run { presentShareSheet(url) } } ב-ViewModel, ב-iOS דרך .xlsx. אנו כותבים את הקובץ בקבוצות של 1000 שורות ומעדכנים את המונה לאחר כל קבוצה.
פורמט קובץ ושיתוף
לאחר היצירה, אנו ממקמים את הקובץ ב-CoreXLSX (אנדרואיד) או ב-xlsxwriter (iOS). אנו משתפים דרך:
- אנדרואיד:
ProgressView+StateFlow<Int>עם סוג MIME נכון (@Published var progress: DoubleאוcacheDir) - iOS:
FileManager.default.temporaryDirectoryעםFileProvider
אנו אף פעם לא שומרים ל-Intent.ACTION_SEND ללא בקשה מפורשת של המשתמש — זה מפר את הנחיות הפלטפורמה.
למה ייצוא על thread רקע הוא קריטי
כל עבודת I/O וסריאליזציה חייבת להתבצע מחוץ ל-thread הראשי. בפועל, זה מפחית את זמן התגובה של האפליקציה פי 5–10 עבור ייצואים שמתחילים מ-10,000 שורות. המהנדסים שלנו מאמתים זאת בכל פרויקט.
איך להציג נכון טקסט קירילי ב-CSV עבור Excel
השתמשו ב-UTF-8 עם BOM ובנקודה-פסיק כמפריד. לחלופין, ייצאו ל-text/csv שבו הקידוד אינו בעיה. יש לנו ניסיון בהתאמת ייצואים לשווקים מקומיים כולל תווים קיריליים ואסייתיים.
הטמעת ייצוא שלב אחר שלב
- בחירת פורמט (CSV או XLSX) והסכמה על מבנה העמודות.
- קריאת נתונים ממסד הנתונים על thread רקע.
- יצירת קובץ עם קידוד ומפרידים נכונים.
- הצגת התקדמות עבור נפחים גדולים.
- שיתוף דרך דיאלוג המערכת.
מה כלול בעבודה
- בחירת פורמט (CSV / XLSX) והסכמה על מבנה עמודות
- יצירת קובץ ברקע ללא חסימת ממשק המשתמש
- קידוד נכון ומפרידים מותאמים מקומית
- מחוון התקדמות עבור ייצואים גדולים
- שיתוף דרך ShareSheet / Intent של המערכת
- בדיקות על נפחי נתונים אמיתיים
לוחות זמנים
ייצוא CSV פשוט ממסד נתונים קיים: 0.5–1 יום. עם בחירת פורמט (CSV/XLSX), מסנני טווח תאריכים והתקדמות: 1.5–2 ימים. העלות נקבעת לאחר ניתוח מבנה הנתונים — נבחן את הפרויקט שלכם. צרו קשר כדי לדון במשימה שלכם ולקבל ייעוץ על בחירת פורמט והיקף העבודה.
| פורמט | מורכבות הטמעה | תמיכה בעיצוב | תלות בספריות |
|---|---|---|---|
| CSV | נמוכה | לא | מינימלית |
| XLSX | בינונית | כן | Apache POI / xlsxwriter |
| נפח נתונים | פורמט מומלץ | זמן יצירה משוער |
|---|---|---|
| < 10,000 | CSV או XLSX | < שנייה אחת |
| 10,000 – 100,000 | XLSX | 1–10 שניות |
| > 100,000 | CSV (בקבוצות) | 10+ שניות, נדרשת התקדמות |







