JSON Toolkit

من JSON إلى Excel: أربع طرق وأين يفقد كل منها الدقة

الخلاصة: البنى المتداخلة والحقول غير المتسقة ومصفوفات المصفوفات هي مواضع انكسار التحويل من JSON إلى جدول بيانات. أربع طرق مرتبة حسب زمن الوصول إلى النتيجة، لكل منها مقايضاتها.

مبتدئقراءة نحو 11 دقيقةنُشر في 2026-10-30حُدِّث في 2026-10-30
غلاف الدليل العملي للتحويل من JSON إلى Excel

الخلاصة: مصفوفة مسطحة من الكائنات أو كائن يغلّف مصفوفة يُحوَّلان أسرع عبر الأداة على الإنترنت؛ استخدم 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" فقط:

  1. "Data" → "Get Data" → "From File" → "From JSON";
  2. بعد اختيار الملف تصل إلى محرر Power Query، حيث ترى بنى List / Record؛
  3. انقر أيقونة التوسيع على يمين ترويسة عمود لتوسيع الحقول المتداخلة مستوى بمستوى؛
  4. بعد أن تبدو أسماء الأعمدة وأنواعها صحيحة، "Close & Load".

الميزة أن التداخل يمكن توسيعه إلى أعمدة متعددة طبقةً بطبقة، وأن الأنواع يمكن إسنادها يدويًا؛ والثمن أن الإعداد الأول يتطلب فهم الفرق بين List وRecord — فـ List مصفوفة وRecord كائن، ويُوسَّعان في اتجاهين مختلفين.

4. الطريقة 3: Python + pandas (حقول كثيرة تحتاج تنظيفًا)

import pandas as pd

# Object wrapping an array: first reach the list level
rows = pd.read_json('data.json')['data']

# Expand nested fields into multiple columns
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، واهرّب علامات الاقتباس المزدوجة داخل الخلايا كـ ""، وإلا انزاحت الأعمدة.

6. ثلاثة أمور يفقدها التحويل دائمًا

العنصر المفقود العَرَض العلاج
معلومات النوع الأعداد والقيم المنطقية تصبح نصوصًا أو TRUE/FALSE حدد أنواع الأعمدة يدويًا بعد الاستيراد، أو عرّفها في Power Query
مستويات التداخل الحقول العميقة تنهار إلى [object Object] استخدم json_normalize أو وسّع مستوى بمستوى — ولا تستخدم String(obj) أبدًا
علاقات واحد-إلى-متعدد المصفوفات تُحشى في خلية واحدة اقسم الصفوف بـ explode، أو ابنِ جدولًا مرتبطًا منفصلًا

كذلك يبدو null و"الحقل غائب" متطابقين في الجدول (كلاهما خلية فارغة) لكنهما يعنيان أمرين مختلفين في مجال العمل. وعندما تحتاج إلى التفريق بينهما، حوّل null صراحةً إلى النص "null" في JSON، أو أضف عمود علامة _has_field.

7. التحقق بعد ذلك: لا تنظر إلى الصف الأول فقط

بعد التحويل، فحص عشوائي لثلاثة أمور على الأقل:

  1. عدد السجلات: يجب أن يساوي عدد أسطر CSV طول المصفوفة + 1 (الترويسة)؛ وسطر ناقص يعني عادةً أن سطر النهاية الجديد ابتُلع؛
  2. العمود الأعلى في نسبة null: كثرة الخلايا الفارغة تشير إلى أسماء مفاتيح غير متسقة — ارجع وتحقق هل يستخدم JSON الأصلي تهجئتين (userId وuser_id)؛
  3. أطول صف: المصفوفات المتداخلة تهبط فيه عادةً؛ تأكد أن شيئًا لم يُقطع.

وعندما تحتاج العملية العكسية (Excel/CSV إلى JSON)، استخدم من CSV إلى JSON، وتذكّر أن الترويسة تُعامل كأسماء المفاتيح — فتغيير الترويسة تغيير لأسماء الحقول.

FAQ

كيف أختار بين الأداة على الإنترنت و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].