일단 Newtonsoft.Json과 ExcelDataReader가 설치 되어있어야 한다.

 

 

Package Manager에서  Newtonsoft.Json을 설치

 

 

ExcelDataReader.DataSet.dll
0.01MB
ExcelDataReader.dll
0.15MB

 

그리고 다음 파일을

 

 

Project의 Plugins 폴더에 넣어서 ExcelDataReader 설치

 

(또는 Visual Studio에서 Nuget 패키지 관리에서 직접 설치한 뒤,  위의 파일을 찾아서 옮겨야 한다.)

 

using UnityEditor;
using UnityEngine;
using System.IO;
using ExcelDataReader;
using Newtonsoft.Json;
using System.Data;
using System.Collections.Generic;
using System.Text;

public class ExcelToJsonEditor : EditorWindow
{
    private string excelFilePath = string.Empty;
    private string jsonSavePath = string.Empty;
    private string defaultJsonFileName = "*.json";

    [MenuItem("Tools/Excel To JSON Converter")]
    public static void ShowWindow()
    {
        GetWindow<ExcelToJsonEditor>("Excel to JSON");
    }

    private void OnGUI()
    {
        GUILayout.Label("Drag and Drop Excel File Here", EditorStyles.boldLabel);

        var dragArea = GUILayoutUtility.GetRect(0f, 100f, GUILayout.ExpandWidth(true));
        GUI.Box(dragArea, "Drop Excel file here");

        if (dragArea.Contains(Event.current.mousePosition))
        {
            if (Event.current.type == EventType.DragUpdated)
            {
                DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
                Event.current.Use();
            }
            else if (Event.current.type == EventType.DragPerform)
            {
                DragAndDrop.AcceptDrag();

                foreach (var draggedObject in DragAndDrop.objectReferences)
                {
                    var path = AssetDatabase.GetAssetPath(draggedObject);
                    if (!string.IsNullOrEmpty(path) && path.EndsWith(".xlsx"))
                    {
                        excelFilePath = path;
                        Debug.Log("Excel File Selected: " + path);
                    }
                }
                Event.current.Use();
            }
        }

        if (GUILayout.Button("Save JSON As...") && !string.IsNullOrEmpty(excelFilePath))
        {
            string initialPath = Application.dataPath;
            jsonSavePath = EditorUtility.SaveFilePanel("Save JSON as", initialPath, defaultJsonFileName, "json");
            if (!string.IsNullOrEmpty(jsonSavePath))
            {
                ConvertExcelToJson(excelFilePath, jsonSavePath);
            }
        }

        if (!string.IsNullOrEmpty(excelFilePath))
        {
            EditorGUILayout.LabelField("Selected Excel File:", excelFilePath);
        }

        if (!string.IsNullOrEmpty(jsonSavePath))
        {
            EditorGUILayout.LabelField("JSON Save Path:", jsonSavePath);
        }
    }

    private void ConvertExcelToJson(string excelPath, string jsonPath)
    {
        using (var stream = File.Open(excelPath, FileMode.Open, FileAccess.Read))
        {
            using (var reader = ExcelReaderFactory.CreateReader(stream))
            {
                var result = reader.AsDataSet();
                var dataTable = result.Tables[0];

                List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();

                // 첫 번째 행에서 열 이름을 읽음
                var columnNames = new List<string>();
                for (int col = 0; col < dataTable.Columns.Count; col++)
                {
                    columnNames.Add(dataTable.Rows[0][col].ToString());
                }

                // 두 번째 행에서 데이터 타입을 읽음
                var dataTypes = new List<string>();
                for (int col = 0; col < dataTable.Columns.Count; col++)
                {
                    dataTypes.Add(dataTable.Rows[1][col].ToString());
                }

                // 세 번째 행부터 실제 데이터를 읽음
                for (int row = 2; row < dataTable.Rows.Count; row++)
                {
                    var dict = new Dictionary<string, object>();
                    for (int col = 0; col < dataTable.Columns.Count; col++)
                    {
                        var cellValue = dataTable.Rows[row][col];
                        var columnName = columnNames[col];
                        var dataType = dataTypes[col];

                        // 데이터 타입에 따라 셀 값을 변환
                        object convertedValue = ConvertCellValue(cellValue, dataType);
                        dict[columnName] = convertedValue;
                    }
                    list.Add(dict);
                }

                string json = JsonConvert.SerializeObject(list, Formatting.Indented);
                File.WriteAllText(jsonPath, json, Encoding.UTF8);
                Debug.Log("Excel to JSON conversion successful: " + jsonPath);

                //저장 완료 Alert 창 표시
                EditorUtility.DisplayDialog("Conversion Complete", "Excel to JSON conversion successful!", "OK"); 
            }
        }
    }

    private object ConvertCellValue(object cellValue, string dataType)
    {
        if (cellValue == null || string.IsNullOrWhiteSpace(cellValue.ToString()))
        {
            return null;
        }

        switch (dataType.ToLower())
        {
            case "int":
                int intValue;
                if (int.TryParse(cellValue.ToString(), out intValue))
                {
                    return intValue;
                }
                break;
            case "float":
                float floatValue;
                if (float.TryParse(cellValue.ToString(), out floatValue))
                {
                    return floatValue;
                }
                break;
            case "string":
                return cellValue.ToString();
            case "bool":
                bool boolValue;
                if (bool.TryParse(cellValue.ToString(), out boolValue))
                {
                    return boolValue;
                }
                break;
        }

        return cellValue; 
    }



}

 

위의 코드를 스크립트로 추가 해주면 

 

 

Tools에 Excel To JSON Converter가 추가된다.

 

 

자신이 Json파일로 변환하고 싶은 xlsx 파일을 드래그 해서 

 

Save JSON As 를 눌러주고 

 

 

 

위치 및 이름을 설정해주면 

 

 

파일 변환 완료

 

 

성공적으로 Resourcs 폴더에 추가된 모습

 

 

 

제대로 변환이 되었는지 내용 확인

 

 

xlsx의 테이블 형식은 위와 같다.

 

1행 = 데이터 이름 (col)

2행 = 데이터 타입

3행 ~ 데이터 값 (row)

 

 

 

만약 2행부터 데이터를 넣고 싶다면 

 

 

row를 1로 바꿔주면 된다.

 

 

 

 

 

** 테이블이 A1부터 시작되어야한다. **

 

테이블이 A1이 아닌 다른 곳에서 시작된다면 

 

 

위와 같이 변환 될 수 있으니 주의하자

 

 

 

 

+++++++++++++++++++++++++++++++++++++++++++++++++++

 

 

 

아래 파일을 다운 받고 project에 import 시키면

 

ExcelDataReader설치에 필요한 파일 + Editor 스크립트가

 

알아서 자동으로 들어간다.

 

(Newtonsoft.Json는 직접 설치해야 함 - 윗 글 참조)

 

 

 

ExcelToJsonEditor.unitypackage
0.07MB

 

(xlsx -> json , cs)

파일 변환시 기본 경로 Assets 폴더 지정

데이터 값이 빈칸 및 null 일경우, Warning 알림창 + null값으로 반환 및 저장(json)

저장 완료시 Conversion Complete 알림창 출력

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts