일단 Newtonsoft.Json과 ExcelDataReader가 설치 되어있어야 한다.
Package Manager에서 Newtonsoft.Json을 설치
그리고 다음 파일을
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는 직접 설치해야 함 - 윗 글 참조)
(xlsx -> json , cs)
파일 변환시 기본 경로 Assets 폴더 지정
데이터 값이 빈칸 및 null 일경우, Warning 알림창 + null값으로 반환 및 저장(json)
저장 완료시 Conversion Complete 알림창 출력

'UnityDataTools' 카테고리의 다른 글
Random Seed Generator (0) | 2024.03.24 |
---|---|
MoveToFileEditor (0) | 2024.03.21 |
PlayerPrefs Viewer 수정 (+float type) (0) | 2024.03.19 |
[UnityDataTools] Big Number Converter - 리얼 숫자 변환/역변환 + 계산기 (0) | 2024.02.22 |
[UnityDataTools] JsonHierarchy Viewer (0) | 2024.02.15 |