[M/V] 이선희 정규 15집 앨범 세렌디피티(Serendipity) - 그중에 그대를 만나
'Memories' 카테고리의 다른 글
[Tip] '보라보라 섬'을 다시 간다면 이렇게..? (0) | 2015.07.30 |
---|---|
[신혼여행] 보라보라 섬 (2) | 2015.07.21 |
자귀 나무 (0) | 2013.05.24 |
울지마 톤즈 극장판 -이태석신부님 (0) | 2012.06.25 |
[MUD] 마계지문 재오픈 (11) | 2012.06.09 |
[Tip] '보라보라 섬'을 다시 간다면 이렇게..? (0) | 2015.07.30 |
---|---|
[신혼여행] 보라보라 섬 (2) | 2015.07.21 |
자귀 나무 (0) | 2013.05.24 |
울지마 톤즈 극장판 -이태석신부님 (0) | 2012.06.25 |
[MUD] 마계지문 재오픈 (11) | 2012.06.09 |
xls와 xlsx 둘 다 되도록 예제를 약간 수정해서 테스트 완료.
P.s. 무슨 이유인지 모르지만 VS2013에서는 Microsoft.Office.Interop.Excel 이 없어서, 부득이하게 VS2010으로 작업함.
(VS2012는 있는지 확인은 안해봤지만.. 얼핏 인터넷에서 보기로는 VS2012도 없는 듯..)
private void CreateExcelFile() { Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value; xlApp = new Excel.Application(); // 생성할 때, 기본 Sheet 1개. xlWorkBook = xlApp.Workbooks.Add(misValue); // Sheet 추가.(필요한 Sheet 개수에 따라 루프 돌아야 될 듯) xlWorkBook.Worksheets.Add(misValue, misValue, misValue, misValue); xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); // Sheet Name 지정. xlWorkSheet.Name = "SheetName1"; xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com"; xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(2); xlWorkSheet.Name = "SheetName2"; xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com"; // 테스트용으로 파일명 직접 입력. string createFilePath = Directory.GetCurrentDirectory() + @"\" + "csharp-Excel.xlsx"; // 파일 있으면 삭제. if (true == File.Exists(createFilePath)) { File.Delete(createFilePath); } // 확장자만 검사하기 위해.. string strExtension = Path.GetExtension(createFilePath); if (0 == strExtension.CompareTo(".xlsx")) { xlWorkBook.SaveAs(createFilePath, Excel.XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Excel.XlSaveConflictResolution.xlUserResolution, true, misValue, misValue, misValue); } else if (0 == strExtension.CompareTo(".xls")) { xlWorkBook.SaveAs(createFilePath, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); } xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); MessageBox.Show("Excel file created , you can find the file " + createFilePath); } private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Exception Occured while releasing object " + ex.ToString()); } finally { GC.Collect(); } }
엑셀 생성 참조 : http://csharp.net-informations.com/excel/csharp-create-excel.htm
xlsx 참조 : http://stackoverflow.com/questions/9769703/exporting-to-xlsx-using-microsoft-office-interop-excel-saveas-error
숫자 3자리마다 콤마(,) 찍기 (0) | 2014.05.13 |
---|---|
플래그 데이터와 이진 연산 (0) | 2014.04.04 |
C# Excel Tutorial (0) | 2014.03.26 |
C# 에서 Excel 로 데이터 기록 및 읽기 [OleDB] (46) | 2014.03.25 |
[펌] 다른 프로세스가 사용중이라면서 에러가 나는경우에 이렇게 (4) | 2014.03.17 |
플래그 데이터와 이진 연산 (0) | 2014.04.04 |
---|---|
How to create Excel file in C#(Source) (0) | 2014.03.26 |
C# 에서 Excel 로 데이터 기록 및 읽기 [OleDB] (46) | 2014.03.25 |
[펌] 다른 프로세스가 사용중이라면서 에러가 나는경우에 이렇게 (4) | 2014.03.17 |
제네릭(Generic)과 제약조건 (0) | 2014.03.13 |
비문증(날파리증 = 날모기증)이란 무엇인가? (0) | 2014.08.14 |
---|---|
F/U 또는 FU (Follow Up) (0) | 2014.08.05 |
서울에서 맛 보는 세계정통음식점 10곳 (0) | 2014.03.25 |
[PDF] 영어 간결 표현들 (0) | 2014.01.12 |
[M/V] 유세윤 - 까똑(카톡)(feat.임보람) (0) | 2013.11.01 |
F/U 또는 FU (Follow Up) (0) | 2014.08.05 |
---|---|
줄 서서 먹는 유명한 서울맛집 Best 14 (0) | 2014.03.25 |
[PDF] 영어 간결 표현들 (0) | 2014.01.12 |
[M/V] 유세윤 - 까똑(카톡)(feat.임보람) (0) | 2013.11.01 |
훌륭한 개발자는 당장이라도 회사를 그만둘 수 있어야 한다. (0) | 2013.09.13 |
[제작자 황현우님의 파일]
[개인적으로 필요해서 소스 좀 수정된 파일]
C# 에서 Excel 로 데이터 기록 및 읽기 [OleDB]
OleDB 를 이용한 Excel 로 데이터베이스 처럼이용하기 입니다만...
Excel 을 제어하는 방법으로 사용해도 무방합니다. 저장이.. 1만건 이상일 때부터는 좀 느려지지만
(제 PC 에서는 한 2초 정도 걸리는 군효..) 읽기는 순식간입니다.
대량으로 저장할 때는 다른 방식으로 해야될 듯..
[참고] 요기 본문에 나오는 모든 소스는 첨부된 파일에 있으니, 복사해서 쓰지 마시고..
그리고 퍼가시거나 소스를 사용하신다면 댓글이라도 남겨주시는 센스도.. 사실 퍼가면 코딩하는
시간 버는 거니.. 댓글 다시는데 약간의 시간의 사용하셔도 쿨럭..ㅡ.,ㅡ;;
흠,.. C# 에서는 좀 사기적인(?) 지원이 많은 관계로.. 엄청 편리하네요.. 속도는 좀 떨어지만서도..
여튼,.. 프로그램을 만들때.. 매번 DB 를 쓰기도 그렇고.. 그렇다고 Access 쓰기도 구차니즘에
손가락이 떨려오신다면.. Excel 파일을 DB 처럼 사용하는 방법을 이용하는 것도 나름 좋은
방법입니다. 일단 내용의 보안이나 등등의 기능까지 하긴 너무 양이 많아 질꺼 같고..
최대한 간단하게 Excel 파일을 제어해서 Database 처럼 사용하는 방법을 살펴보죠..
(검색해보시면 비슷자료가 많이 있으니 다른 사람들의 것도 참고 하시는 것도 좋은 공부방법이죠..)
먼저 Excel 의 구조와 C# 의 DataSet 을 간단하게 살펴보면... 왠지 느낌이 팍! 하고 오실껍니다.
DataSet : 테이블의 집합
Excel : Sheet 의 집합 -> 즉, 하나의 시트가 DataSet 에 하나의 Table 이라고 생각하면 됩니다.
DataTable : 하나의 테이블 객체.. 컬럼과 줄이 존재하지요..
Sheet : 열과 행이 존재하지요.. 테이블로 보자면 컬럼과 줄..
그렇습니다.. -_-;; 이넘들이 개념이 같은 넘들이였습니다. (원래도 같은 넘들이였죠.. DOS 시절에..)
위와 같이 되는 거죠.. sheet 명이 table 명, 첫번째 줄의 데이터가 Field 명이 됩니다.
음.. 개념 잡기는 여기까지만 하고.. 본격적인 내용으로 들어가면...
[ Excel 파일 버전 검사 ]
Excel 파일이 버전에 따라서.. OleDB Connection String 이 다릅니다.
즉, xls 인지.. xlsx 인지에 따라서 다르게 처리해야 되는데...
기본적으로 확장명으로 비교할 수도 있겠지만.. 프로그램 만드는데 내부에서 쓰는 데이터 떡하니
xls 하기도 머시기 하고.. xxx 면 xls 라고 소스에서 비교할 수도 있겠지만.. 좀 아닌것 같아서
일단 확장명 상관없이 xls 인지 xlsx 인지 알아내는 방법을 보면... 아래처럼 2개가 있습니다.
A. Excel 를 연동해서 파일을 로딩.. 파일 정보를 본다.
B. Excel 파일을 열어서 맨 앞의 file header 부분을 본다.
A 로 하자니.. 실제로 두번 읽게 되니 -_-;; 글고 좀 느리구요.. B 로 해보겠습니다.
public static int ExcelFileType(string XlsFile)
{
// 요거이 비교할 파일 데이터 입니다.
byte[,] ExcelHeader = {
{ 0xD0, 0xCF, 0x11, 0xE0, 0xA1 }, // XLS File Header
{ 0x50, 0x4B, 0x03, 0x04, 0x14 } // XLSX File Header
};
// result -2=error, -1=not excel , 0=xls , 1=xlsx
int result = -1;
FileInfo FI = new FileInfo(XlsFile);
FileStream FS = FI.Open(FileMode.Open);
try
{
byte[] FH = new byte[5];
FS.Read(FH, 0, 5);
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 5; j++)
{
if (FH[j] != ExcelHeader[i, j]) break;
else if (j == 4) result = i;
}
if (result >= 0) break;
}
}
catch (Exception e)
{
result = (-2);
//throw e;
}
finally
{
FS.Close();
}
return result;
}
와 같이 되겠습니다. 머.. 단순하죠.. 파일 열어서 5 byte 비교해서.. xls 인지 xlsx 인지..
excel 파일이 아닌지를 알아내는 것입니다.
[ OleDB Connection String ]
자.. 어느넘이 어느 넘인지 알았으니.. OleDB Connection String 을 만들어 봅시다요..
각 각 다음과 같습니다만.. 중요한 것만 내용에 넣었으니.. 필요한게 더 있으면 추가를...
아래의 형태는 string.Format 함수로 사용할 format 용 서식입니다.
// 확장명 XLS (Excel 97~2003 용)
private const string ConnectStrFrm_Excel97_2003 =
"Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=\"{0}\";" +
"Mode=ReadWrite|Share Deny None;" +
"Extended Properties='Excel 8.0; HDR={1}; IMEX={2}';" +
"Persist Security Info=False";
// 확장명 XLSX (Excel 2007 이상용)
private const string ConnectStrFrm_Excel =
"Provider=Microsoft.ACE.OLEDB.12.0;" +
"Data Source=\"{0}\";" +
"Mode=ReadWrite|Share Deny None;" +
"Extended Properties='Excel 12.0; HDR={1}; IMEX={2}';" +
"Persist Security Info=False";
중요한 건 Provider 가 무언지와 Extended Properties (<- 요게 Excel 파일에 대한 옵션) 입니다.
Extended 보면 HDR 과 IMEX 속성이 있는데 이것이 중요합니다.
HDR 은 Excel 의 첫번째 줄의 데이터를 Field 명으로 인식 할 것인지 여부 (YES , NO) 이고..
IMEX 는 데이터 형식을 어떻게 적용할 것인지 옵션인데, 만약 그 줄의 데이터의 표본이 정수라면
필드가 생성될 때 정수형으로 생성됩니다. 일단은 IMEX=1 로 해서 걍 무시하고 무조건 string 으로
하겠습니다. (다음 버전을 만든다면 속성까지 다 하는 방향으로..)
머.. 여기 까지 왔으면 사실 대부분 그냥 만드실 수 있겠지만.. 그래도 노가다를 줄이기 위해..
소스를 올려 놓겠습니다... (-o- ;)a
[ Excel 파일을 DataSet 으로.. ]
아.. 참고로.. Excel 파일을 DataSet 으로 바꾸는 순간만을 제외하면 Excel 파일을 사용하지
않습니다. 즉.. 메모리에 로딩한 다음 데이터가 바뀐다고 Excel 파일도 같이 수정되지는 않습니다.
읽을 때도.. 읽는 당시만, 저장할 때도 저장하는 당시만 파일에 lock 이 걸리고 그 전,후에는
엑셀 파일과 전혀~ 상관 안합니다.
첨부된 소스의
private static DataSet OpenExcel(string FileName, bool UseHeader)
를 참고해 주세요~
[ DataSet 을 Excel 파일로.. ]
첨부된 소스의
private static bool SaveExcel(string FileName, DataSet DS, bool ExistDel, bool OldExcel)
를 참고해 주세요~
첨부된 소스를 사용하실 꺼라면..
OpenExcelDB, SaveExcelDB 두개를 사용하세요..
나중에 소스 업데이트를 하면 OpenExcel 이랑 SaveExcel 는 내용이 변경될 것인지라..
업데이트된 소스로 엎어 쳤을 때 에러날 수 있습니다.
첨부된 Source 사용법은 다운 받은 소스를 Project 에 추가해 주시고...
사용할 소스의 using 절 부분에 아래줄 추가..
using LiAsExcelDatabase;
사용하는 것은 아래처럼 사용하시믄 됩니다..
DataSet DS = LiAsExcelDB.OpenExcelDB("C:\\Temp.xlsx");
LiAsExcelDB.SaveExcelDB("C:\\Temp_save.dat",DS);
질문이 있으시면.. 이 글의 답글로 남겨주시면 고맙겠습니다.
[출처] C# 에서 Excel 로 데이터 기록 및 읽기 [OleDB]|작성자 애쁠
How to create Excel file in C#(Source) (0) | 2014.03.26 |
---|---|
C# Excel Tutorial (0) | 2014.03.26 |
[펌] 다른 프로세스가 사용중이라면서 에러가 나는경우에 이렇게 (4) | 2014.03.17 |
제네릭(Generic)과 제약조건 (0) | 2014.03.13 |
Reading Excel Files in C# (0) | 2014.03.12 |
using UnityEngine; public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T> { protected static bool m_bDontDestroyOnLoad = true; private static bool m_bApplicationQuit = false; private static object InstanceLocker = new object(); private static T m_Instance = null; public static T Instance { get { if (true == m_bApplicationQuit) return null; lock (InstanceLocker) { // Instance requiered for the first time, we look for it if (null == m_Instance) { T instance = GameObject.FindObjectOfType(typeof(T)) as T; // Object not found, we create a temporary one if (instance == null) { instance = new GameObject(typeof(T).ToString()).AddComponent<T>(); // Problem during the creation, this should not happen if (instance == null) { Debug.LogError("Problem during the creation of " + typeof(T).ToString()); } } if (instance != null) { Initialize(instance); } } return m_Instance; } } } private static void Initialize(T instance) { if (m_Instance == null) { var startTime = System.DateTime.Now; m_Instance = instance; // 씬 전환 시, 삭제시킬 싱글톤은 부모 객체에 안붙이도록.. // 싱글톤 시작 시, m_bDontDestroyOnLoad 셋팅 필요. if (true == m_bDontDestroyOnLoad) { GameObject goRoot = GameObject.Find("Singletons") as GameObject; if (null == goRoot) { goRoot = new GameObject("Singletons"); // DontDestroyOnLoad() 등록은 하위 상속받는 쪽에서 하도록 하는 게 나을까? DontDestroyOnLoad(goRoot); } m_Instance.transform.parent = goRoot.transform; } m_Instance.OnInitialize(); var period = System.DateTime.Now - startTime; if (period.TotalSeconds > 1.0f) { var name = m_Instance.ToString(); Debug.LogWarning("Profile Warnning. Singletion {" + name + "} too long init time : " + period.TotalSeconds.ToString("F") + "Seconds"); } } else if (m_Instance != instance) { DestroyImmediate(instance.gameObject); } } private static void Destroyed(T instance) { if (m_Instance == instance) { m_Instance.OnFinalize(); m_Instance = null; } } public void CreateSingleton() { } // [Warning] GameObject에 Component로 미리 등록된 상태에서는 OnInitialize() 호출 안됨. public virtual void OnInitialize() { } // [Warning] GameObject에 Component로 미리 등록된 상태에서는 OnFinalize() 호출 안됨. public virtual void OnFinalize() { } protected virtual void CheckDontDestroyOnLoad() { } private void Awake() { Initialize(this as T); } void OnDestroy() { Destroyed(this as T); } private void OnApplicationQuit() { m_bApplicationQuit = true; Destroyed(this as T); } }
A simple cross fade shader for Unity (0) | 2014.04.22 |
---|---|
어플을 내렸을때, 어플을 종료할때의 처리 (3) | 2014.04.04 |
Platform Dependent Compilation (0) | 2014.03.11 |
Generic Based Singleton for MonoBehaviours完全版(?) (0) | 2014.03.05 |
Singleton (0) | 2014.03.05 |
유니티에서 SQLiteKit 에셋을 사용하기 위해 Excel -> db 파일로 변환 할 때 나오는 syntax error의 의미가 모호해서 정리겸 남겨놓는다.
1) 칼럼 값이 비어있을 때 나는 에러.(꼭 칸을 채워야 함)
2) SQLiteKit을 쓸 때, 테이블에서 쓸 수 없는 문자가 몇 있는 것 같다.
더 있을 지는 모르지만 내가 테스트 해본 것 까지만 정리..
2-1) 테이블값에서 '-', '(', ')', ' '(빈칸) 은 사용 못함.
2-2) 테이블값에서 첫글자가 숫자로 시작할 수 없음.('_'는 허용됨.)
'a1_1' 등으로 영어 뒤 숫자는 사용가능.
The asset bundle can't be loaded (0) | 2015.03.18 |
---|---|
CompareBaseObjectsInternal can only be called from the main thread. (0) | 2014.11.06 |
Unity3D iOS BinaryFormatter 사용 중 ExecutionEngineException: Attempting to JIT compile method (0) | 2014.09.22 |
Mesh has more materials (2) than subsets (1) (0) | 2014.09.03 |
Actor::updateMassFromShape Error (0) | 2013.12.12 |
Some people may have trouble loading VS2013 even after applying the correct settings above. The solution, for the time being, is to run Visual Studio 2013 beforehand and then the Unity Editor will successfully load its own project instance.
The above method isn't perfect and that is because Unity3D just doesn't properly generate the correct project files. If you don't like the limitations of the above method and you're able to afford it the best option right now is still buy the UnityVS plugin for Unity3D.
출처 : http://stackoverflow.com/questions/19889848/working-with-unity3d-and-visual-studio-2013
유니티 – 그래픽 성능 최적화 (0) | 2014.04.02 |
---|---|
유니티 관련 3DS Max 에서 작업시 유의사항 (0) | 2014.04.02 |
Project 탭의 오브젝트를 스크립트상에서 Selection 하고 싶을 때.. (0) | 2014.03.19 |
유니티 Profiler 안드로이드 사용하기 (0) | 2014.02.27 |
유티니 스크립트 기본 형태 변경 (0) | 2014.02.18 |
// 해당 폴더가 있는지 체크하기 위해.. Object oTargetFolder = AssetDatabase.LoadAssetAtPath("Assets/Resources", typeof(Object)); if(null == oTargetFolder) { // 못찾으면 폴더 없다고 보고 폴더 생성. AssetDatabase.CreateFolder("Assets", "Resources"); // 한 번 더 찾기 시도.. Object oTargetFolder2 = AssetDatabase.LoadAssetAtPath("Assets/Resources", typeof(Object)); if(null != oTargetFolder2) { // 있으면 셀렉트 되도록 대입.. Selection.activeObject = oTargetFolder2; } } else { // 있으면 셀렉트 되도록 대입.. Selection.activeObject = oTargetFolder; }
우선 위와같은 방법으로 했는데.. 더 좋은 방법이 있는지는 모르겠다..
폴더도 오브젝트일까? 라는 생각으로 해봤는데 오브젝트인가보다..잘되네..@ㅅ@;;
유니티 관련 3DS Max 에서 작업시 유의사항 (0) | 2014.04.02 |
---|---|
How to use Visual Studio 2013 at Unity3D (0) | 2014.03.21 |
유니티 Profiler 안드로이드 사용하기 (0) | 2014.02.27 |
유티니 스크립트 기본 형태 변경 (0) | 2014.02.18 |
Text Gizmo (0) | 2014.02.07 |