JSON ל-Excel: ארבע גישות והיכן כל אחת מאבדת נאמנות
שורה תחתונה: מבנים מקוננים, שדות לא עקביים ומערכים של מערכים הם המקומות שבהם המרת JSON לגיליון אלקטרוני נשברת. ארבע גישות מסודרות לפי זמן לתוצאה, כל אחת עם יתרונות וחסרונות.

שורה תחתונה: מערך שטוח של אובייקטים או אובייקט שעוטף מערך מומרים הכי מהר דרך הכלי המקוון; השתמשו ב-Power Query כשהנתונים מתרעננים מדי שבוע, ב-pandas כשיש הרבה שדות לניקוי, ובסקריפט Node רק כשההמרה חייבת להשתלב בצינור — אבל החליטו מה המשמעות של "שורה אחת" לפני שנוגעים בנתונים מקוננים או במפתחות לא עקביים.
ההמרה עצמה אינה קשה; הקשה הוא לגלות בדיעבד שמספרים הפכו לטקסט ושכמה רמות קינון התמוטטו לאחת. קראו את מבנה הנתונים לפני בחירת השיטה ותחסכו מעצמכם עבודה חוזרת.
1. תחילה, בררו איזה סוג JSON יש לכם
פתחו את הקובץ והסתכלו ברמה החיצונית ביותר:
| מבנה | צורה | קושי ההמרה |
|---|---|---|
| מערך שטוח של אובייקטים | [{"a":1,"b":2},{...}] |
הקל ביותר — שורה אחת לכל רשומה |
| אובייקט שעוטף מערך | {"data":[{...}],"total":100} |
קל — קחו את רמת ה-data |
| אובייקטים מקוננים | {"user":{"name":"x"}} |
בינוני — החליטו אם לשטח או לחבר למחרוזת |
| מערכים של מערכים | {"tags":["a","b"]} |
כואב — לא נכנס לשורה אחת, דורש פיצול טבלאות |
| מפתחות לא עקביים | לכל רשומה שדות שונים | כואב — העמודות יוצאות ברובן ריקות |
השניים הראשונים מומרים ישירות עם שיעור הצלחה קרוב ל-100%; בשלושת האחרונים, החליטו קודם מה המשמעות של "שורה אחת", אחרת הגיליון המתקבל אינו שמיש.
2. גישה 1: כלי מקוון (דקה אחת)
פתחו את JSON לטבלה, הדביקו את הנתונים → בחרו את המפריד ואת הכותרת → ייצאו CSV → פתחו ב-Excel. מתאים לכמה עשרות עד כמה אלפי שורות של נתונים עם מבנה טוב.
שלושה דברים שחייבים לשים לב אליהם:
- מקבלים CSV, לא xlsx. כש-Excel פותח CSV הוא מנחש את הקידוד מאזור המערכת, ולכן טקסט סיני עלול להפוך למתועתק. שימוש ב"Data → From Text/CSV" ובחירה מפורשת של UTF-8 אמין יותר.
- מזהים שמתחילים ב-
0מאבדים את האפסים."007"הוא טקסט ב-CSV, אבל Excel ממיר אותו אוטומטית למספר 7. הגדירו את העמודה כטקסט בזמן הייבוא, או הוסיפו לה תחילית ב-JSON. - מספרים ארוכים הופכים לסימון מדעי. תעודות זהות ומספרי הזמנה הארוכים מ-15 ספרות מאבדים דיוק; שדות כאלה צריכים כבר להיות מחרוזות ב-JSON, וחייבים להישאר בפורמט טקסט אחרי הייבוא.
3. גישה 2: Power Query המובנה של Excel (ניתן לשימוש חוזר)
כשהנתונים שלכם מתרעננים כל שבוע, השתמשו ב-Power Query המובנה ב-Excel: הגדירו פעם אחת, ואז פשוט לחצו "Refresh":
- "Data" → "Get Data" → "From File" → "From JSON";
- אחרי בחירת הקובץ תגיעו לעורך Power Query, ושם תראו מבני
List/Record; - לחצו על סמל ההרחבה בצד ימין של כותרת עמודה כדי להרחיב שדות מקוננים רמה אחר רמה;
- כששמות העמודות והטיפוסים נראים נכון, "Close & Load".
היתרון הוא שאפשר להרחיב קינון לכמה עמודות שכבה אחר שכבה, ולשייכות טיפוסים ידנית; המחיר הוא שההגדרה הראשונה דורשת להבין את ההבדל בין List ל-Record — List הוא מערך, Record הוא אובייקט, והם מתרחבים בכיוונים שונים.
4. גישה 3: Python + pandas (הרבה שדות, צריך ניקוי)
import pandas as pd
# אובייקט שעוטף מערך: תחילה הגיעו לרמת הרשימה
rows = pd.read_json('data.json')['data']
# הרחיבו שדות מקוננים לכמה עמודות
frame = pd.json_normalize(rows, sep='_')
frame.to_excel('out.xlsx', index=False)
הפרמטר המרכזי של json_normalize הוא sep, שקובע את סגנון שמות העמודות אחרי הרחבת שדות מקוננים; user_name נוח יותר לשימוש ב-Excel מאשר user.name. מערכים של מערכים (כמו tags) דורשים שלב explode נוסף:
frame = frame.explode('tags')
השלב הזה מפצל שורה אחת לכמה, הדרך היחידה לשמר יחס אחד-לרבים — במחיר של הכפלת שאר השדות.
5. גישה 4: סקריפט Node (כשהוא חייב להשתלב בצינור)
import { readFileSync, writeFileSync } from 'node:fs';
const rows = JSON.parse(readFileSync('data.json', 'utf8'));
const headers = [...new Set(rows.flatMap((row) => Object.keys(row)))];
const escapeCell = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
const lines = [
headers.join(','),
...rows.map((row) => headers.map((key) => escapeCell(row[key])).join(',')),
];
writeFileSync('out.csv', '\uFEFF' + lines.join('\n'), 'utf8');
שני פרטים שאין לדלג עליהם: כתבו \uFEFF (BOM) בהתחלה כדי ש-Excel יזהה UTF-8, ובצעו escape לגרשיים כפולים בתוך תאים כ-"", אחרת העמודות נעות.
6. שלושה דברים שההמרה תמיד מאבדת
| הפריט האבוד | הסימפטום | התיקון |
|---|---|---|
| מידע על טיפוסים | מספרים ובוליאניים הופכים לטקסט או ל-TRUE/FALSE |
הגדירו טיפוסי עמודות ידנית אחרי הייבוא, או ציינו אותם ב-Power Query |
| רמות קינון | שדות עמוקים מתמוטטים ל-[object Object] |
השתמשו ב-json_normalize או הרחיבו רמה אחר רמה — לעולם לא String(obj) |
| יחסי אחד-לרבים | מערכים נדחסים לתא אחד | פצלו שורות עם explode, או בנו טבלה קשורה נפרדת |
כמו כן, null ו"השדה נעדר" נראים זהים בגיליון (שניהם תאים ריקים) אבל משמעותם שונה בתחום העסקי. כשצריך להבחין ביניהם, המירו במפורש null למחרוזת "null" ב-JSON, או הוסיפו עמודת סימון _has_field.
7. אימות בדיעבד: אל תסתכלו רק על השורה הראשונה
אחרי ההמרה, בדקו נקודתית לפחות שלושה דברים:
- מספר רשומות: מספר שורות ה-CSV צריך להיות שווה לאורך המערך + 1 (הכותרת); שורה חסרה משמעה בדרך כלל שהשורה החדשה בסוף נבלעה;
- העמודה עם שיעור ה-null הגבוה ביותר: הרבה תאים ריקים מעידים על שמות מפתחות לא עקביים — חזרו ובדקו אם ה-JSON המקורי משתמש בשתי צורות כתיב (
userIdו-user_id); - השורה הארוכה ביותר: מערכים מקוננים בדרך כלל נוחתים שם; אשרו ששום דבר לא נחתך.
כשצריך את הפעולה ההפוכה (Excel/CSV חזרה ל-JSON), השתמשו בCSV ל-JSON, וזכרו שהכותרת מטופלת כשמות המפתחות — שינוי הכותרת הוא שינוי שמות השדות.
שאלות נפוצות
איך בוחרים בין הכלי המקוון, Power Query ו-pandas?
השתמשו בכלי המקוון לכמה עשרות עד כמה אלפי שורות של נתונים עם מבנה טוב שאתם ממירים פעם אחת. השתמשו ב-Power Query כשהנתונים מתרעננים כל שבוע, מפני שהוא מוגדר פעם אחת ומתרענן בלחיצה אחת. השתמשו ב-pandas עם json_normalize כשיש הרבה שדות לניקוי, ובסקריפט Node כשההמרה חייבת להשתלב בצינור.
למה טקסט סיני הופך למתועתק ב-CSV?
הייצוא הוא CSV, לא xlsx, ו-Excel מנחש את הקידוד מאזור המערכת, ולכן UTF-8 ללא BOM מציג מתועתק. כתבו BOM מסוג \uFEFF בתחילת הקובץ, או פתחו אותו דרך "Data → From Text/CSV" ובחרו UTF-8 במפורש.
לשטח אובייקטים מקוננים או לפצל אותם לשורות נוספות?
שטחו אותם רמה אחר רמה במקום להדביק אותם כמחרוזות: Power Query מרחיב שדות מקוננים לעמודות, ו-json_normalize עם sep עושה את אותו הדבר ב-pandas. מערכים של מערכים דורשים שלב explode נוסף שמפצל שורה אחת לכמה. העברת אובייקט עמוק ל-String(obj) מניבה רק [object Object].