_Excel.cs 100 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows.Forms;
  6. using Janus.Windows.GridEX.Export;
  7. using Janus.Windows.GridEX;
  8. using System.IO;
  9. using System.Drawing;
  10. using System.Data.OleDb;
  11. using System.Data.SqlClient;
  12. using System.Data;
  13. using System.Collections;
  14. namespace IControls_FireManager
  15. {
  16. // 엑셀 관련 함수는 여기 클래스에서 전담한다
  17. public static class _Excel
  18. {
  19. // 엑셀 파일 저장용 다이얼로그
  20. public static SaveFileDialog SaveFileDialog_Xls = null;
  21. public static GridEXExporter GridEXExporter_Xls = null;
  22. // Export 전용 폰트
  23. public static Font Export_Font = new System.Drawing.Font("굴림", 9F);
  24. // 디버깅 용도
  25. public static int Debug_Row = 0;
  26. public static int Debug_Col = 0;
  27. public static string Debug_SheetName = null;
  28. public static string Debug_EtcMessage = null;
  29. // Export (다이얼로그 창 없이 바로 생성)
  30. public static EXCEL_DOC_TYPE Export_File_Check(string FileFullPath)
  31. {
  32. // Export 전용 Com 생성
  33. GridEXExporter_Xls = new GridEXExporter();
  34. string Ext = FileFullPath.Substring(FileFullPath.LastIndexOf(".") + 1, FileFullPath.Length - FileFullPath.LastIndexOf(".") - 1);
  35. Ext = Ext.ToLower();
  36. if (Ext.Equals("xls"))
  37. {
  38. return EXCEL_DOC_TYPE.Xls;
  39. }
  40. else if (Ext.Equals("xlsx"))
  41. {
  42. return EXCEL_DOC_TYPE.Xlsx;
  43. }
  44. else
  45. {
  46. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.FailFormatInform, 0);
  47. return EXCEL_DOC_TYPE.Not;
  48. }
  49. }
  50. // Export
  51. public static void Export(GridEX Gridex, string FileFullPath, string Sheetname, string Caption)
  52. {
  53. // Export 전용 Com 생성
  54. GridEXExporter_Xls = new GridEXExporter();
  55. // 파일 경로
  56. string filefullpath = null;
  57. ///
  58. /// 파일명이 없다는 것은 다이얼로그 창으로로 직접 파일명을 지정하겠다는 의미이다
  59. ///
  60. if (FileFullPath == null)
  61. {
  62. // 다이얼로그 생성
  63. SaveFileDialog_Xls = new SaveFileDialog();
  64. // 확장자 넣기
  65. SaveFileDialog_Xls.Filter = "(*.xls)|*.xls|(*.xml)|*.xml";
  66. // 파일 세이브 다이얼로그
  67. if (SaveFileDialog_Xls.ShowDialog() == DialogResult.OK)
  68. filefullpath = SaveFileDialog_Xls.FileName;
  69. }
  70. else
  71. {
  72. filefullpath = FileFullPath;
  73. }
  74. ///
  75. /// 파일 포맷이 정확한지 알아본다
  76. ///
  77. if (filefullpath == null || filefullpath.Length == 0)
  78. return;
  79. else if (Export_File_Check(filefullpath) == EXCEL_DOC_TYPE.Not)
  80. return;
  81. ///
  82. /// 사전 작업
  83. ///
  84. // 원본 폰트 저장
  85. Font OriginalFont = Gridex.Font;
  86. // 파일 읽기
  87. FileStream gFile = new FileStream(filefullpath, FileMode.Create, FileAccess.ReadWrite);
  88. ///
  89. /// 엑셀파일 전용 모드 변경
  90. ///
  91. if (Caption != null)
  92. {
  93. Gridex.RootTable.TableHeader = Janus.Windows.GridEX.InheritableBoolean.True;
  94. Gridex.RootTable.Caption = Caption;
  95. }
  96. Gridex.Font = Export_Font;
  97. ///
  98. /// 파일 속성 지정
  99. ///
  100. GridEXExporter_Xls.GridEX = Gridex;
  101. GridEXExporter_Xls.SheetName = Sheetname;
  102. GridEXExporter_Xls.Export(gFile);
  103. ///
  104. /// 엑셀파일 전용 모드 해제
  105. ///
  106. if (Caption != null)
  107. {
  108. Gridex.RootTable.TableHeader = Janus.Windows.GridEX.InheritableBoolean.False;
  109. }
  110. Gridex.RootTable.Caption = null;
  111. Gridex.Font = OriginalFont;
  112. }
  113. // 엑셀 커넥션 스트링
  114. public static string ConnectionString(string FileFullPath)
  115. {
  116. string result = null;
  117. switch (Export_File_Check(FileFullPath))
  118. {
  119. case EXCEL_DOC_TYPE.Xls:
  120. result = @"Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + FileFullPath + ";Extended Properties='Excel 8.0;HDR=No;IMEX=1';Persist Security Info=False";
  121. break;
  122. case EXCEL_DOC_TYPE.Xlsx:
  123. result = @"Provider=Microsoft.ACE.OLEDB.12.0;Data source=" + FileFullPath + ";Extended Properties='Excel 12.0;HDR=No;IMEX=1';Persist Security Info=False";
  124. break;
  125. }
  126. return result;
  127. }
  128. // 테스트
  129. public static bool OpenTest(string FileFullPath)
  130. {
  131. try
  132. {
  133. OleDbConnection Connection = new OleDbConnection(ConnectionString(FileFullPath));
  134. Connection.Open();
  135. return true;
  136. }
  137. catch (Exception e)
  138. {
  139. _Event.DebugView_SendMessage_Write(e.ToString());
  140. return false;
  141. }
  142. }
  143. // 코드 시트에 있는 값을 읽어오는 함수
  144. // 행단위로 검색하되 공백이 나오면 더이상 읽지 않도록 한다
  145. // 참고로 Col 을 지정하여 열에 접근할수 있도록 한다
  146. public static ArrayList Get_CodeData_Until_Null(DataSet Ds, int StartRow, int FixedCol)
  147. {
  148. // 결과
  149. ArrayList result = new ArrayList();
  150. try
  151. {
  152. // 시작행
  153. int Count = StartRow;
  154. // 널값이 나올때까지
  155. while (Ds.Tables[0].Rows[Count][FixedCol] != null && Ds.Tables[0].Rows[Count][FixedCol].ToString() != "null"
  156. && Ds.Tables[0].Rows[Count][FixedCol].ToString().Length != 0)
  157. {
  158. // 선후공백은 제거한다
  159. string data = Ds.Tables[0].Rows[Count][FixedCol].ToString();
  160. data = data.Trim();
  161. result.Add(data);
  162. Count++;
  163. }
  164. return result;
  165. }
  166. catch
  167. {
  168. return result;
  169. }
  170. }
  171. //
  172. // 그룹 및 맵 정보를 가져오는 함수
  173. // 행단위로 검색하되 지정한 총개수만큼만 가져오도록 한다
  174. public static ArrayList Get_CodeData_Until_AllCnt(DataSet Ds, int StartRow, int FixedCol, int AllCnt)
  175. {
  176. // 결과
  177. ArrayList result = new ArrayList();
  178. // 시작행
  179. int Count = StartRow;
  180. // 지정한 카운트 만큼
  181. while (Ds.Tables[0].Rows[Count][FixedCol] != null
  182. && Ds.Tables[0].Rows[Count][FixedCol].ToString().Length != 0)
  183. {
  184. // 선후공백은 제거한다
  185. string data = Ds.Tables[0].Rows[Count][FixedCol].ToString();
  186. data = data.Trim();
  187. result.Add(data);
  188. Count++;
  189. if (Count >= AllCnt + StartRow) break;
  190. }
  191. return result;
  192. }
  193. // $ 가 없는지 체크하는 함수
  194. public static bool CheckSheetName_Character(string SheetName)
  195. {
  196. string temp = SheetName;
  197. temp = temp.Replace("$", "");
  198. if (temp.Length == SheetName.Length)
  199. return false; // $ 가 없다!
  200. else
  201. return true;
  202. }
  203. // $ 뒤에 글자가 있는지 확인 (단 ' 를 제외하고)
  204. public static bool CheckSheetName_Character_After(string SheetName)
  205. {
  206. string[] temp = null;
  207. temp = SheetName.Split('$');
  208. if (temp.Length != 2) // 앞에서 $가 반드시 존재하는 조건을 걸었으므로 반드시 2개가 나온다
  209. return false;
  210. else if (temp.Length == 2 && (temp[1] == "'" || temp[1] == "")) // 2개로 쪼개지지만 끝은 ' 혹은 공백이다
  211. return true;
  212. else
  213. return false;
  214. }
  215. // 시트명 중복을 제외시키는 함수
  216. public static bool CheckSheetName_SameData(string SheetName)
  217. {
  218. foreach (_Excel_Sheet Excel_Sheet in _Data.List_ExcelPoint)
  219. {
  220. if (Excel_Sheet.Sheet_Name == SheetName)
  221. return false;
  222. }
  223. return true;
  224. }
  225. // 시트명 예외처리..
  226. // 원래는 정확한 데이타가 들어와야 하지만 예외처리 조건이 너무 많다..테스트 결과 몇가지 규칙을 알아내었다.. 2013.04.19
  227. // 1. 시트명에는 반드시 뒤에 $가 들어온다
  228. // 2. 숫자로 시작되는 시트명에는 작은따옴표가 앞뒤로 붙는다 -> '101동$'
  229. // 3. 영문 혹은 한글로 시작되는 시트명에는 작은따옴표가 없다 -> 주차장$
  230. // 4. 특수문자 혹은 공백으로 시작되는 시트명에는 작은따옴표가 앞뒤로 붙는다 -> ' 101동$' , '@101동$'
  231. // 5. '101동'$Print_Area 와 같이 뒤에 이상한 문자열이 따르는 경우가 있다
  232. // 6. 주차장1$Print_Titles 와 같이 뒤에 이상한 문자열이 따르는 경우가 있다.
  233. //
  234. // 처리방법은 다음과 같다
  235. // 1. 특별 제외는 2개이다. 수량$,코드$ 는 엑셀포맷에 있지만 읽을수 없는 내용이므로 제외시킨다.
  236. // 2. $가 없다면 시트명이 아니다
  237. // 3. $뒤에 글자가 있는 것은 시트명이 아니다 (단, ' 를 제외하고)
  238. // 4. 한번 읽었던 시트명은 더 읽을수가 없다 (즉, 중복처리)
  239. // 5. 따옴표가 있든 없는 읽은 값을 그대로 사용하면 된다.
  240. public static bool Import_Point_CheckSheetName(string SheetName)
  241. {
  242. // 수량$, 코드$는 읽을수 없다
  243. if (SheetName == "수량$"
  244. || SheetName == "코드$"
  245. || SheetName == "연동그룹$"
  246. || SheetName == "연동설정$"
  247. )
  248. return false;
  249. // $가 없다면 시트명이 아니다
  250. else if (CheckSheetName_Character(SheetName) == false)
  251. return false;
  252. // $ 뒤에 글자가 있는건 시트명이 아니다
  253. else if (CheckSheetName_Character_After(SheetName) == false)
  254. return false;
  255. // 중복처리
  256. else if (CheckSheetName_SameData(SheetName) == false)
  257. return false;
  258. else
  259. return true;
  260. }
  261. // 위치 데이타를 토대로 클래스에 사용될 위치 이름 생성
  262. public static string Code_Position_Name_Create(string BuildingName, string StairName, string FloorName)
  263. {
  264. // 모두 None 값이라면 수신기로 대체
  265. if (BuildingName == _Text.None && StairName == _Text.None && FloorName == _Text.None) return "수신기";
  266. string TempResultPostionName = null;
  267. // 빌딩 : None 은 언급하지 않는다
  268. if (BuildingName != _Text.None) TempResultPostionName = BuildingName;
  269. // 공백처리
  270. if (TempResultPostionName != null) TempResultPostionName = TempResultPostionName.Trim();
  271. // 층 : None 은 언급하지 않는다
  272. if (StairName != _Text.None) TempResultPostionName = TempResultPostionName + _Text.Blank + StairName;
  273. // 공백처리
  274. if (TempResultPostionName != null) TempResultPostionName = TempResultPostionName.Trim();
  275. // 계단 : None 은 언급하지 않는다
  276. if (FloorName != _Text.None) TempResultPostionName = TempResultPostionName + _Text.Blank + FloorName;
  277. // 공백처리
  278. if (TempResultPostionName != null) TempResultPostionName = TempResultPostionName.Trim();
  279. // 모두 공백이라면 None 으로 처리한다
  280. if (TempResultPostionName == null) TempResultPostionName = _Text.None;
  281. return TempResultPostionName;
  282. }
  283. // 이름으로 해쉬테이블에 조회해서 있다면 사용여부 변수를 true 변환
  284. public static bool Code_Position_Enable_Check(string CodePosition_Name)
  285. {
  286. if (_Data.HASH_CodePosition.ContainsKey(CodePosition_Name) == true)
  287. {
  288. // 사용여부
  289. ((_Code_Position)_Data.HASH_CodePosition[CodePosition_Name]).Enable = true;
  290. return true;
  291. }
  292. return false;
  293. }
  294. // 사용여부를 토대로 나머지는 모두 지워버림
  295. public static void Code_Postion_Create()
  296. {
  297. // 결과를 저장
  298. Hashtable Result_HASH_CodePosition = new Hashtable();
  299. ArrayList Result_LIST_CodePosition_NAME = new ArrayList();
  300. foreach (string CodePosition_NAME in _Data.LIST_CodePosition_NAME)
  301. {
  302. // cyim 2013.6.20 코드정보는 사용을 하든 안하든 무조건 추가하도록 만든다, 다만 중복은 허용하지 않도록 만든다
  303. // cyim 2013.6.26 FPER 에서 로딩속도가 너무 오래걸리므로 일단 사용하는것으로만 처리한다
  304. if (((_Code_Position)_Data.HASH_CodePosition[CodePosition_NAME]).Enable == true)
  305. {
  306. // 중복허용안함
  307. if (Result_LIST_CodePosition_NAME.Contains(CodePosition_NAME) == false)
  308. {
  309. // 해쉬에 추가
  310. Result_HASH_CodePosition.Add(CodePosition_NAME, ((_Code_Position)_Data.HASH_CodePosition[CodePosition_NAME]));
  311. // 리스트에 추가
  312. Result_LIST_CodePosition_NAME.Add(CodePosition_NAME);
  313. }
  314. }
  315. }
  316. // 사용여부가 true 인것만 저장함
  317. _Data.HASH_CodePosition = Result_HASH_CodePosition;
  318. _Data.LIST_CodePosition_NAME = Result_LIST_CodePosition_NAME;
  319. }
  320. // 코드값 읽기
  321. public static bool Import_Point_GetCode(DataTable Sheets, OleDbConnection Connection)
  322. {
  323. try
  324. {
  325. // 코드 시트명을 가져온다
  326. for (int i = 0; i < Sheets.Rows.Count; i++)
  327. {
  328. // 만약 가져오지 못한다면 실패로 처리함, 코드 시트명은 고정되어 있다! => 코드$
  329. if (Sheets.Rows[i]["TABLE_NAME"].ToString() == "코드$")
  330. {
  331. // 시트명
  332. string sheetname = Sheets.Rows[i]["TABLE_NAME"].ToString();
  333. OleDbCommand Command = new OleDbCommand("Select * From [코드$]", Connection);
  334. OleDbDataAdapter dapt = new OleDbDataAdapter(Command);
  335. DataSet ds = new DataSet();
  336. dapt.Fill(ds);
  337. ///
  338. /// 코드값들을 읽는다
  339. ///
  340. // 건물 이름
  341. ArrayList List_Building_Name = new ArrayList();
  342. ArrayList List_Building_Position = new ArrayList();
  343. ArrayList List_Building_Emergency = new ArrayList();
  344. // 계단
  345. ArrayList List_Stair_Name = new ArrayList();
  346. ArrayList List_Stair_Position = new ArrayList();
  347. ArrayList List_Stair_Emergency = new ArrayList();
  348. // 층
  349. ArrayList List_Floor_Name = new ArrayList();
  350. ArrayList List_Floor_Position = new ArrayList();
  351. ArrayList List_Floor_Emergency = new ArrayList();
  352. // 입력
  353. ArrayList List_Input_TypeName = new ArrayList();
  354. // 출력
  355. ArrayList List_Output_TypeName = new ArrayList();
  356. ArrayList List_Output_SEQ = new ArrayList();
  357. ArrayList List_Output_USE = new ArrayList();
  358. // IO 보드
  359. ArrayList List_IOBoard_Name = new ArrayList();
  360. ArrayList List_IOBoard_ComPort = new ArrayList();
  361. ArrayList List_IOBoard_BoardID = new ArrayList();
  362. ArrayList List_IOBoard_LoopNo = new ArrayList();
  363. ArrayList List_IOBoard_RepeaterID = new ArrayList();
  364. ArrayList List_IOBoard_DeviceID = new ArrayList();
  365. ArrayList List_IOBoard_InOut = new ArrayList();
  366. ArrayList List_IOBoard_AddRepeaterYesNo = new ArrayList();
  367. ArrayList List_IOBoard_AddRepeaterType = new ArrayList();
  368. // 이벤트 타입
  369. ArrayList List_EventType_Type = new ArrayList();
  370. ArrayList List_EventType_Name = new ArrayList();
  371. // 아날로그 감지기 레벨 및 시간
  372. ArrayList List_Analog_Level_Smoke = new ArrayList(); // cyim 2016.07.27 : 아날로그 감지기 레벨 감지기 타입별 설정 기능
  373. ArrayList List_Analog_Level_Heat = new ArrayList();
  374. ArrayList List_FireDay_Time = new ArrayList();
  375. // 건물코드 읽기
  376. List_Building_Name = Get_CodeData_Until_Null(ds, 3, 0);
  377. List_Building_Position = Get_CodeData_Until_Null(ds, 3, 1);
  378. List_Building_Emergency = Get_CodeData_Until_Null(ds, 3, 2);
  379. // 계단코드 읽기
  380. List_Stair_Name = Get_CodeData_Until_Null(ds, 3, 3);
  381. List_Stair_Position = Get_CodeData_Until_Null(ds, 3, 4);
  382. List_Stair_Emergency = Get_CodeData_Until_Null(ds, 3, 5);
  383. // 층코드 읽기
  384. List_Floor_Name = Get_CodeData_Until_Null(ds, 3, 6);
  385. List_Floor_Position = Get_CodeData_Until_Null(ds, 3, 7);
  386. List_Floor_Emergency = Get_CodeData_Until_Null(ds, 3, 8);
  387. // 입력코드 읽기
  388. List_Input_TypeName = Get_CodeData_Until_Null(ds, 3, 10);
  389. // 출력코드 읽기
  390. List_Output_TypeName = Get_CodeData_Until_Null(ds, 3, 12);
  391. List_Output_SEQ = Get_CodeData_Until_Null(ds, 3, 13);
  392. List_Output_USE = Get_CodeData_Until_Null(ds, 3, 14);
  393. // IO 보드 읽기
  394. List_IOBoard_Name = Get_CodeData_Until_Null(ds, 3, 18);
  395. List_IOBoard_ComPort = Get_CodeData_Until_Null(ds, 3, 19);
  396. List_IOBoard_BoardID = Get_CodeData_Until_Null(ds, 3, 20);
  397. List_IOBoard_LoopNo = Get_CodeData_Until_Null(ds, 3, 21);
  398. List_IOBoard_RepeaterID = Get_CodeData_Until_Null(ds, 3, 22);
  399. List_IOBoard_DeviceID = Get_CodeData_Until_Null(ds, 3, 23);
  400. List_IOBoard_InOut = Get_CodeData_Until_Null(ds, 3, 24);
  401. List_IOBoard_AddRepeaterYesNo = Get_CodeData_Until_Null(ds, 3, 25);
  402. List_IOBoard_AddRepeaterType = Get_CodeData_Until_Null(ds, 3, 26);
  403. // 이벤트 타입 읽기
  404. List_EventType_Type = Get_CodeData_Until_Null(ds, 3, 28);
  405. List_EventType_Name = Get_CodeData_Until_Null(ds, 3, 29);
  406. // 아날로그 감지기 레벨 및 시간
  407. List_Analog_Level_Smoke = Get_CodeData_Until_Null(ds, 3, 32);
  408. List_Analog_Level_Heat = Get_CodeData_Until_Null(ds, 12, 32); // cyim 2016.07.27 : 아날로그 감지기 레벨 감지기 타입별 설정 기능
  409. List_FireDay_Time = Get_CodeData_Until_Null(ds, 3, 34);
  410. // 단, 코드 값중에 하나라도 빈값이라면 취소
  411. if (List_Building_Name.Count == 0 || List_Building_Position.Count == 0 || List_Building_Emergency.Count == 0
  412. || List_Stair_Name.Count == 0 || List_Stair_Position.Count == 0 || List_Stair_Emergency.Count == 0
  413. || List_Floor_Name.Count == 0 || List_Floor_Position.Count == 0 || List_Floor_Emergency.Count == 0)
  414. {
  415. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError1, 0);
  416. return false;
  417. }
  418. if (List_Input_TypeName.Count == 0 || List_Output_TypeName.Count == 0 || List_Output_SEQ.Count == 0 || List_Output_USE.Count == 0)
  419. {
  420. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError7, 0);
  421. return false;
  422. }
  423. if (List_IOBoard_Name.Count == 0 || List_IOBoard_ComPort.Count == 0 || List_IOBoard_BoardID.Count == 0
  424. || List_IOBoard_LoopNo.Count == 0 || List_IOBoard_RepeaterID.Count == 0 || List_IOBoard_DeviceID.Count == 0
  425. || List_IOBoard_InOut.Count == 0 || List_IOBoard_AddRepeaterYesNo.Count == 0 || List_IOBoard_AddRepeaterYesNo.Count == 0)
  426. {
  427. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError8, 0);
  428. return false;
  429. }
  430. if (List_EventType_Type.Count == 0 || List_EventType_Name.Count == 0)
  431. {
  432. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError9, 0);
  433. return false;
  434. }
  435. //
  436. // 단, 코드의 3가지는 모두 개수가 동일해야한다. 또한 출력코드 및 IO 보드 및 이벤트 타입은 데이타 레코드수가 동일해야한다
  437. //
  438. if ((List_Building_Name.Count != List_Building_Position.Count) || (List_Building_Name.Count != List_Building_Emergency.Count))
  439. {
  440. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError2, 0);
  441. return false;
  442. }
  443. if ((List_Stair_Name.Count != List_Stair_Position.Count) || (List_Stair_Name.Count != List_Stair_Emergency.Count))
  444. {
  445. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError2, 0);
  446. return false;
  447. }
  448. if ((List_Floor_Name.Count != List_Floor_Position.Count) || (List_Floor_Name.Count != List_Floor_Emergency.Count))
  449. {
  450. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError2, 0);
  451. return false;
  452. }
  453. if (List_Output_TypeName.Count + List_Output_SEQ.Count + List_Output_USE.Count != List_Output_TypeName.Count * 3)
  454. {
  455. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError4, 0);
  456. return false;
  457. }
  458. if (List_IOBoard_Name.Count + List_IOBoard_ComPort.Count + List_IOBoard_BoardID.Count + List_IOBoard_LoopNo.Count + List_IOBoard_RepeaterID.Count
  459. + List_IOBoard_DeviceID.Count + List_IOBoard_InOut.Count + List_IOBoard_AddRepeaterYesNo.Count + List_IOBoard_AddRepeaterType.Count != List_IOBoard_Name.Count * 9)
  460. {
  461. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError5, 0);
  462. return false;
  463. }
  464. if (List_EventType_Type.Count != List_EventType_Name.Count)
  465. {
  466. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError6, 0);
  467. return false;
  468. }
  469. ///
  470. /// 데이타베이스 연동을 위한 클래스를 생성한다
  471. ///
  472. // 위치코드 및 비상코드를 생성한다 (건물-계단-층 순으로 고유의 6자리 코드를 생성한다
  473. // 또한 여기에 명칭을 정리한다. 이 경우에 공백으로 각 데이타를 구분하도록 한다
  474. // ex : 101동 - 1계단 - None => 101동 1계단
  475. // ex : 101동 - None - B1F => 101동 B1F
  476. _Data.HASH_CodePosition.Clear();
  477. _Data.LIST_CodePosition_NAME.Clear();
  478. foreach (string BuildingName in List_Building_Name)
  479. {
  480. foreach (string StairName in List_Stair_Name)
  481. {
  482. foreach (string FloorName in List_Floor_Name)
  483. {
  484. // 클래스 생성
  485. _Code_Position Code_Position = new _Code_Position();
  486. ///
  487. /// 아이디
  488. ///
  489. //Code_Position.Code_Position_ID =
  490. // _Convert.String_to_Int_TwoType(List_Building.IndexOf(BuildingName).ToString()) +
  491. // _Convert.String_to_Int_TwoType(List_Stair.IndexOf(StairName).ToString()) +
  492. // _Convert.String_to_Int_TwoType(List_Floor.IndexOf(FloorName).ToString());
  493. // 인덱스는 동일하므로
  494. int Temp_Index_Building = List_Building_Name.IndexOf(BuildingName);
  495. int Temp_Index_Stair = List_Stair_Name.IndexOf(StairName);
  496. int Temp_Index_Floor = List_Floor_Name.IndexOf(FloorName);
  497. ///
  498. /// 위치코드
  499. ///
  500. Code_Position.Code_Position_ID =
  501. _Convert.String_to_Int_TwoType(List_Building_Position[Temp_Index_Building].ToString()) +
  502. _Convert.String_to_Int_TwoType(List_Stair_Position[Temp_Index_Stair].ToString()) +
  503. _Convert.String_to_Int_TwoType(List_Floor_Position[Temp_Index_Floor].ToString());
  504. ///
  505. /// 비상방송코드
  506. ///
  507. Code_Position.Code_Emergency_ID =
  508. _Convert.String_to_Int_TwoType(List_Building_Emergency[Temp_Index_Building].ToString()) +
  509. _Convert.String_to_Int_TwoType(List_Stair_Emergency[Temp_Index_Stair].ToString()) +
  510. _Convert.String_to_Int_TwoType(List_Floor_Emergency[Temp_Index_Floor].ToString());
  511. ///
  512. /// 이름
  513. ///
  514. Code_Position.Code_Position_NAME = Code_Position_Name_Create(BuildingName, StairName, FloorName);
  515. // 사용여부 해제
  516. Code_Position.Enable = false;
  517. // 해쉬 추가
  518. // (디폴트로 생성되는 위치 코드 리스트이며 차후에 Import_Point 함수에서 실제로 사용되는 위치만 추출해서 변경된다
  519. // ID 를 참조하는게 아니라 이름을 기준으로 참조하므로 사용에 주의
  520. if (_Hash.Add(_Data.HASH_CodePosition, Code_Position.Code_Position_NAME, Code_Position) == true)
  521. {
  522. _Data.LIST_CodePosition_NAME.Add(Code_Position.Code_Position_NAME);
  523. }
  524. }
  525. }
  526. }
  527. //
  528. // 입력코드 및 출력코드를 생성한결과에 데이타베이스의 TB_DEVICE_TYPE 에 저장하기 위한 필드들을 매칭시켜 저장해둔다
  529. //
  530. _Data.LIST_CodeDeviceType.Clear();
  531. // 입력
  532. foreach (string Input_TypeName in List_Input_TypeName)
  533. {
  534. _Code_Device_Type Table_Device_Type = new _Code_Device_Type();
  535. // 데이타를 추출한다 (예시 : IA 일반화재입력)
  536. string[] Temp_Input_TypeName = Input_TypeName.Split(' ');
  537. if (Temp_Input_TypeName.Length != 2)
  538. {
  539. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError3, 0);
  540. return false;
  541. }
  542. // 데이타 저장
  543. Table_Device_Type.DEVICE_TYPE = Temp_Input_TypeName[0];
  544. Table_Device_Type.DEVICE_TYPE_NAME = Temp_Input_TypeName[1];
  545. Table_Device_Type.SYMBOL_TYPE = "I";
  546. Table_Device_Type.SEQ_NO = "0";
  547. Table_Device_Type.USE_FLAG = "Y";
  548. // 클래스에 추가
  549. _Data.LIST_CodeDeviceType.Add(Table_Device_Type);
  550. }
  551. // 출력
  552. foreach (string Output_TypeName in List_Output_TypeName)
  553. {
  554. _Code_Device_Type Table_Device_Type = new _Code_Device_Type();
  555. // 데이타를 추출한다 (예시 : OA 주경종)
  556. string[] Temp_Output_TypeName = Output_TypeName.Split(' ');
  557. if (Temp_Output_TypeName.Length != 2)
  558. {
  559. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError3, 0);
  560. return false;
  561. }
  562. // 데이타 저장
  563. Table_Device_Type.DEVICE_TYPE = Temp_Output_TypeName[0];
  564. Table_Device_Type.DEVICE_TYPE_NAME = Temp_Output_TypeName[1];
  565. Table_Device_Type.SYMBOL_TYPE = "O";
  566. Table_Device_Type.SEQ_NO = List_Output_SEQ[List_Output_TypeName.IndexOf(Output_TypeName)].ToString();
  567. Table_Device_Type.USE_FLAG = List_Output_USE[List_Output_TypeName.IndexOf(Output_TypeName)].ToString(); ;
  568. // 클래스에 추가
  569. _Data.LIST_CodeDeviceType.Add(Table_Device_Type);
  570. }
  571. //
  572. // IO보드를 생성한결과에 데이타베이스의 TB_DEVICE 에 저장하기 위한 필드들을 매칭시켜 저장해둔다
  573. //
  574. // 중복된 내용이 있다면 사용불가
  575. ArrayList Temp_IOBoard_Name = new ArrayList();
  576. foreach (string Name in List_IOBoard_Name)
  577. {
  578. if (Temp_IOBoard_Name.Contains(Name) == false)
  579. Temp_IOBoard_Name.Add(Name);
  580. }
  581. if (Temp_IOBoard_Name.Count != List_IOBoard_Name.Count)
  582. {
  583. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError10, 0);
  584. return false;
  585. }
  586. _Data.LIST_CodeIOBoard.Clear();
  587. // IO
  588. foreach (string IOBoard_Name in List_IOBoard_Name)
  589. {
  590. _Code_IO_Board IO_Board = new _Code_IO_Board();
  591. // 데이타 저장
  592. IO_Board.IOBOARD_NAME = IOBoard_Name;
  593. IO_Board.IOBOARD_COM_PORT = List_IOBoard_ComPort[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  594. IO_Board.IOBOARD_BOARD_ID = List_IOBoard_BoardID[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  595. IO_Board.IOBOARD_LOOP_NO = List_IOBoard_LoopNo[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  596. IO_Board.IOBOARD_REPEATER_ID = List_IOBoard_RepeaterID[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  597. IO_Board.IOBOARD_DEVICE_ID = List_IOBoard_DeviceID[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  598. IO_Board.IOBOARD_INOUT = List_IOBoard_InOut[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  599. IO_Board.IOBOARD_ADDREPEATER_YN = List_IOBoard_AddRepeaterYesNo[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  600. IO_Board.IOBOARD_ADDREPEATER_TYPE = List_IOBoard_AddRepeaterType[List_IOBoard_Name.IndexOf(IOBoard_Name)].ToString();
  601. // 클래스에 추가
  602. _Data.LIST_CodeIOBoard.Add(IO_Board);
  603. }
  604. //
  605. // 이벤트타입 생성한결과에 데이타베이스의 TB_EVENT_TYPE 에 저장하기 위한 필드들을 매칭시켜 저장해둔다
  606. //
  607. _Data.LIST_CodeEventType.Clear();
  608. // 이벤트 타입
  609. foreach (string EventType in List_EventType_Type)
  610. {
  611. _Code_Event_Type Event_Type = new _Code_Event_Type();
  612. // 데이타 저장
  613. Event_Type.EVENT_TYPE = EventType;
  614. Event_Type.EVENT_TYPE_NAME = List_EventType_Name[List_EventType_Type.IndexOf(EventType)].ToString();
  615. // 클래스에 추가
  616. _Data.LIST_CodeEventType.Add(Event_Type);
  617. }
  618. //
  619. // 아날로그 감지 레벨 및 시간
  620. //
  621. // 0 : falut, 1 : PreFire, 2 : FireDay, 3 : FireNight
  622. // cyim 2016.07.27 : 아날로그 감지기 레벨 감지기 타입별 설정 기능
  623. _Data.LIST_CodeAnalogLevel_Smoke.Clear();
  624. if (List_Analog_Level_Smoke.Count == 4)
  625. _Data.LIST_CodeAnalogLevel_Smoke = (ArrayList)List_Analog_Level_Smoke.Clone();
  626. else if (List_Analog_Level_Smoke.Count != 0)
  627. {
  628. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError11, 0);
  629. return false;
  630. }
  631. _Data.LIST_CodeAnalogLevel_Heat.Clear();
  632. if (List_Analog_Level_Heat.Count == 4)
  633. _Data.LIST_CodeAnalogLevel_Heat = (ArrayList)List_Analog_Level_Heat.Clone();
  634. else if (List_Analog_Level_Heat.Count != 0)
  635. {
  636. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError11, 0);
  637. return false;
  638. }
  639. _Data.LIST_CodeFireDayTime.Clear();
  640. if (List_FireDay_Time.Count == 4)
  641. {
  642. int start_Hour = _Convert.Null_to_IntZero(List_FireDay_Time[0]);
  643. int start_Minute = _Convert.Null_to_IntZero(List_FireDay_Time[1]);
  644. int end_Hour = _Convert.Null_to_IntZero(List_FireDay_Time[2]);
  645. int end_Minute = _Convert.Null_to_IntZero(List_FireDay_Time[3]);
  646. if ((start_Hour > end_Hour) || (start_Hour == end_Hour && start_Minute > end_Minute))
  647. {
  648. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError11, 0);
  649. return false;
  650. }
  651. _Data.LIST_CodeFireDayTime = (ArrayList)List_FireDay_Time.Clone();
  652. }
  653. else if (List_FireDay_Time.Count != 0)
  654. {
  655. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 550, 150, _Text.CodeError11, 0);
  656. return false;
  657. }
  658. return true;
  659. }
  660. }
  661. return false;
  662. }
  663. catch (Exception e)
  664. {
  665. _Event.DebugView_SendMessage_Write(e.ToString());
  666. return false;
  667. }
  668. }
  669. // 사용하지 않음
  670. public static bool Import_Point_GetGroup(DataTable Sheets, OleDbConnection Connection)
  671. {
  672. try
  673. {
  674. // 코드 시트명을 가져온다
  675. for (int i = 0; i < Sheets.Rows.Count; i++)
  676. {
  677. // 만약 가져오지 못한다면 실패로 처리함, 코드 시트명은 고정되어 있다! => 연동그룹$
  678. if (Sheets.Rows[i]["TABLE_NAME"].ToString() == "연동그룹$")
  679. {
  680. // 시트명
  681. string sheetname = Sheets.Rows[i]["TABLE_NAME"].ToString();
  682. OleDbCommand Command = new OleDbCommand("Select * From [연동그룹$]", Connection);
  683. OleDbDataAdapter dapt = new OleDbDataAdapter(Command);
  684. DataSet ds = new DataSet();
  685. dapt.Fill(ds);
  686. ///
  687. /// 코드값들을 읽는다
  688. ///
  689. // 그룹아이디
  690. ArrayList List_GroupID = new ArrayList();
  691. // 그룹명
  692. ArrayList List_GroupName = new ArrayList();
  693. // 총개수
  694. int AllCnt = Int32.Parse(Read_Data(ds, 1, 0));
  695. // 그룹아이디 읽기
  696. List_GroupID = Get_CodeData_Until_AllCnt(ds, 3, 0, AllCnt);
  697. // 그룹명 읽기
  698. List_GroupName = Get_CodeData_Until_AllCnt(ds, 3, 1, AllCnt);
  699. // 단, 총개수와 입력한 데이타 개수가 동일하지 않으면 잘못된 데이타
  700. if (AllCnt != List_GroupID.Count || AllCnt != List_GroupName.Count)
  701. return false;
  702. ///
  703. /// 데이타베이스 연동을 위한 클래스를 생성한다
  704. ///
  705. _Data.List_ExcelGroup.Clear();
  706. // 그룹정보를 생성한다
  707. for (int j = 0; j < AllCnt; j++)
  708. {
  709. _Excel_Group Excel_Group = new _Excel_Group();
  710. Excel_Group.Group_ID = List_GroupID[j].ToString();
  711. Excel_Group.Group_Name = List_GroupName[j].ToString();
  712. _Data.List_ExcelGroup.Add(Excel_Group);
  713. }
  714. return true;
  715. }
  716. }
  717. // _Data.List_ExcelGroup.Count 가 0 도 허용한다
  718. return true;
  719. }
  720. catch (Exception e)
  721. {
  722. _Event.DebugView_SendMessage_Write(e.ToString());
  723. return false;
  724. }
  725. }
  726. // 사용하지 않음
  727. public static bool Import_Point_GetMap(DataTable Sheets, OleDbConnection Connection)
  728. {
  729. try
  730. {
  731. // 코드 시트명을 가져온다
  732. for (int i = 0; i < Sheets.Rows.Count; i++)
  733. {
  734. // 만약 가져오지 못한다면 실패로 처리함, 코드 시트명은 고정되어 있다! => 연동그룹$
  735. if (Sheets.Rows[i]["TABLE_NAME"].ToString() == "연동설정$")
  736. {
  737. // 시트명
  738. string sheetname = Sheets.Rows[i]["TABLE_NAME"].ToString();
  739. OleDbCommand Command = new OleDbCommand("Select * From [연동설정$]", Connection);
  740. OleDbDataAdapter dapt = new OleDbDataAdapter(Command);
  741. DataSet ds = new DataSet();
  742. dapt.Fill(ds);
  743. ///
  744. /// 코드값들을 읽는다
  745. ///
  746. // 그룹아이디
  747. ArrayList List_MapID = new ArrayList();
  748. // 그룹명
  749. ArrayList List_MapName = new ArrayList();
  750. // 총개수
  751. int AllCnt = Int32.Parse(Read_Data(ds, 1, 0));
  752. // 그룹아이디 읽기
  753. List_MapID = Get_CodeData_Until_AllCnt(ds, 3, 0, AllCnt);
  754. // 그룹명 읽기
  755. List_MapName = Get_CodeData_Until_AllCnt(ds, 3, 1, AllCnt);
  756. // 단, 총개수와 입력한 데이타 개수가 동일하지 않으면 잘못된 데이타
  757. if (AllCnt != List_MapID.Count || AllCnt != List_MapName.Count)
  758. return false;
  759. ///
  760. /// 데이타베이스 연동을 위한 클래스를 생성한다
  761. ///
  762. _Data.List_ExcelMap.Clear();
  763. // 그룹정보를 생성한다
  764. for (int j = 0; j < AllCnt; j++)
  765. {
  766. _Excel_Map Excel_Map = new _Excel_Map();
  767. Excel_Map.Map_ID = List_MapID[j].ToString();
  768. Excel_Map.Map_Name = List_MapName[j].ToString();
  769. _Data.List_ExcelMap.Add(Excel_Map);
  770. }
  771. return true;
  772. }
  773. }
  774. // _Data.List_ExcelMap.Count 가 0 도 허용한다
  775. return true;
  776. }
  777. catch (Exception e)
  778. {
  779. _Event.DebugView_SendMessage_Write(e.ToString());
  780. return false;
  781. }
  782. }
  783. public static string Read_Data(DataSet ds, int row, int col)
  784. {
  785. // 디버깅으로 사용되는 데이타
  786. Debug_Row = row + 1;
  787. Debug_Col = col + 1;
  788. // 반환값
  789. return ds.Tables[0].Rows[row][col].ToString();
  790. }
  791. // 그룹 엑셀 임포트
  792. public static bool Import_Group(string FileFullPath)
  793. {
  794. string CheckConnectionString = ConnectionString(FileFullPath);
  795. if (CheckConnectionString == null)
  796. {
  797. // 파일 확장자를 확인해주세요
  798. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.CheckFileFormatInform, 0);
  799. return false;
  800. }
  801. // 엑셀 문서 접근
  802. OleDbConnection Connection = new OleDbConnection(CheckConnectionString);
  803. try
  804. {
  805. // 엑셀 문서 읽기
  806. Connection.Open();
  807. // 시트명을 가져온다
  808. DataTable worksheets = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
  809. // 코드 시트명을 가져온다
  810. for (int i = 0; i < worksheets.Rows.Count; i++)
  811. {
  812. // 만약 가져오지 못한다면 실패로 처리함, 코드 시트명은 고정되어 있다! => 연동그룹$
  813. if (worksheets.Rows[i]["TABLE_NAME"].ToString() == "연동그룹$")
  814. {
  815. // 시트명
  816. string sheetname = worksheets.Rows[i]["TABLE_NAME"].ToString();
  817. OleDbCommand Command = new OleDbCommand("Select * From [연동그룹$]", Connection);
  818. OleDbDataAdapter dapt = new OleDbDataAdapter(Command);
  819. DataSet ds = new DataSet();
  820. dapt.Fill(ds);
  821. ///
  822. /// 코드값들을 읽는다
  823. ///
  824. // 그룹아이디
  825. ArrayList List_GroupID = new ArrayList();
  826. // 그룹명
  827. ArrayList List_GroupName = new ArrayList();
  828. // 총개수가 '' 또는 ' ' 는 에러 메시지 출력
  829. if (Read_Data(ds, 1, 0).Trim() == _Text.Null)
  830. {
  831. string Error = " [시트명]: 연동그룹" + " [행]:2 [열]:1";
  832. // 파일 포맷이 잘못되었습니다
  833. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  834. // LOG
  835. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  836. // 엑셀 읽기 세션 해제
  837. if (Connection != null) Connection.Close();
  838. return false;
  839. }
  840. // 총개수
  841. int AllCnt = Int32.Parse(Read_Data(ds, 1, 0));
  842. // 먼저 아이디, 맵리스트, 연동그룹수 값이 '' 또는 ' ' 는 에러 메시지 출력
  843. for (int x = 0; x < 2; x++)
  844. {
  845. for (int y = 0; y < AllCnt; y++)
  846. {
  847. string Value = Read_Data(ds, y + 3, x);
  848. // 값이 '' 또는 ' ' 는 에러 메시지 출력
  849. if (Value.Trim() == _Text.Null)
  850. {
  851. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  852. string Error = " [시트명]: 연동그룹" + " [행]:" + (y + 3 + 1) + " [열]:" + (x + 1);
  853. // 파일 포맷이 잘못되었습니다
  854. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  855. // LOG
  856. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  857. // 엑셀 읽기 세션 해제
  858. if (Connection != null) Connection.Close();
  859. return false;
  860. }
  861. else
  862. {
  863. if (x == 0)
  864. {
  865. if (_Data.Project_MapGroupIDTypeNumber == "6" && Value.Length != 7) // 6자리모드 인 경우에는 7자리이다
  866. {
  867. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  868. string Error = " [시트명]: 연동그룹" + " [행]:" + (y + 3 + 1) + " [열]:" + (x + 1);
  869. // 파일 포맷이 잘못되었습니다
  870. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 600, 150, _Text.DigitNumberExcel_6 + Error, 0);
  871. // LOG
  872. _Event.DebugView_SendMessage_Write(_Text.DigitNumberExcel_6 + Error + " 의 정보를 확인해주세요 ");
  873. // 엑셀 읽기 세션 해제
  874. if (Connection != null) Connection.Close();
  875. return false;
  876. }
  877. if (_Data.Project_MapGroupIDTypeNumber == "4" && Value.Length != 5) // 4자리모드 인 경우에는 5자리이다
  878. {
  879. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  880. string Error = " [시트명]: 연동그룹" + " [행]:" + (y + 3 + 1) + " [열]:" + (x + 1);
  881. // 파일 포맷이 잘못되었습니다
  882. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 600, 150, _Text.DigitNumberExcel_4 + Error, 0);
  883. // LOG
  884. _Event.DebugView_SendMessage_Write(_Text.DigitNumberExcel_4 + Error + " 의 정보를 확인해주세요 ");
  885. // 엑셀 읽기 세션 해제
  886. if (Connection != null) Connection.Close();
  887. return false;
  888. }
  889. }
  890. }
  891. }
  892. }
  893. // 그룹아이디가 엑셀 정보 안에서 동일한게 있는지 확인
  894. ArrayList Group_List = new ArrayList();
  895. for (int y = 0; y < AllCnt; y++)
  896. {
  897. string Value = Read_Data(ds, y + 3, 0);
  898. if (Group_List.Contains(Value.Trim()) == false) // 없다
  899. {
  900. Group_List.Add(Value.Trim());
  901. }
  902. else // 있다
  903. {
  904. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  905. string Error = " [시트명]: 연동그룹" + " [행]:" + (y + 3 + 1) + " [열]:" + (0 + 1);
  906. // 파일 포맷이 잘못되었습니다
  907. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  908. // LOG
  909. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  910. // 엑셀 읽기 세션 해제
  911. if (Connection != null) Connection.Close();
  912. return false;
  913. }
  914. }
  915. // 그룹아이디 읽기
  916. List_GroupID = Get_CodeData_Until_AllCnt(ds, 3, 0, AllCnt);
  917. // 그룹명 읽기
  918. List_GroupName = Get_CodeData_Until_AllCnt(ds, 3, 1, AllCnt);
  919. //// 단, 총개수와 입력한 데이타 개수가 동일하지 않으면 잘못된 데이타
  920. //if (AllCnt != List_GroupID.Count || AllCnt != List_GroupName.Count)
  921. // return false;
  922. ///
  923. /// 데이타베이스 연동을 위한 클래스를 생성한다
  924. ///
  925. _Data.List_ExcelGroup.Clear();
  926. // 그룹정보를 생성한다
  927. for (int j = 0; j < AllCnt; j++)
  928. {
  929. _Excel_Group Excel_Group = new _Excel_Group();
  930. Excel_Group.Group_ID = List_GroupID[j].ToString();
  931. Excel_Group.Group_Name = List_GroupName[j].ToString();
  932. _Data.List_ExcelGroup.Add(Excel_Group);
  933. }
  934. return true;
  935. }
  936. }
  937. // 엑셀 읽기 세션 해제
  938. if (Connection != null) Connection.Close();
  939. // _Data.List_ExcelGroup.Count 가 0 도 허용한다
  940. return true;
  941. }
  942. catch (Exception e)
  943. {
  944. _Event.DebugView_SendMessage_Write(e.ToString());
  945. return false;
  946. }
  947. }
  948. // 맵 연동 엑셀 임포트
  949. public static bool Import_Map(string FileFullPath, string ReceiverID)
  950. {
  951. string CheckConnectionString = ConnectionString(FileFullPath);
  952. if (CheckConnectionString == null)
  953. {
  954. // 파일 확장자를 확인해주세요
  955. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.CheckFileFormatInform, 0);
  956. return false;
  957. }
  958. // 엑셀 문서 접근
  959. OleDbConnection Connection = new OleDbConnection(CheckConnectionString);
  960. try
  961. {
  962. // 엑셀 문서 읽기
  963. Connection.Open();
  964. // 시트명을 가져온다
  965. DataTable worksheets = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
  966. // 코드 시트명을 가져온다
  967. for (int i = 0; i < worksheets.Rows.Count; i++)
  968. {
  969. // 만약 가져오지 못한다면 실패로 처리함, 코드 시트명은 고정되어 있다! => 연동그룹$
  970. if (worksheets.Rows[i]["TABLE_NAME"].ToString() == "연동설정$")
  971. {
  972. // 시트명
  973. string sheetname = worksheets.Rows[i]["TABLE_NAME"].ToString();
  974. OleDbCommand Command = new OleDbCommand("Select * From [연동설정$]", Connection);
  975. OleDbDataAdapter dapt = new OleDbDataAdapter(Command);
  976. DataSet ds = new DataSet();
  977. dapt.Fill(ds);
  978. ///
  979. /// 코드값들을 읽는다
  980. ///
  981. // 그룹아이디
  982. ArrayList List_MapID = new ArrayList();
  983. // 그룹명
  984. ArrayList List_MapName = new ArrayList();
  985. // 연동 그룹수
  986. ArrayList List_GroupNumber = new ArrayList();
  987. // 추가된 그룹들
  988. ArrayList List_Groups = new ArrayList();
  989. // 입력 개수
  990. ArrayList List_InDeviceNumber = new ArrayList();
  991. // 입력 디바이스들
  992. ArrayList List_InDevice = new ArrayList();
  993. // 총개수가 '' 또는 ' ' 는 에러 메시지 출력
  994. if (Read_Data(ds, 1, 0).Trim() == _Text.Null)
  995. {
  996. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  997. string Error = " [시트명]: 연동그룹" + " [행]:2 [열]:1";
  998. // 파일 포맷이 잘못되었습니다
  999. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  1000. // LOG
  1001. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  1002. // 엑셀 읽기 세션 해제
  1003. if (Connection != null) Connection.Close();
  1004. return false;
  1005. }
  1006. // 총개수
  1007. int AllCnt = Int32.Parse(Read_Data(ds, 1, 0));
  1008. // 입력개수가 '' 또는 ' ' 는 에러 메시지 출력
  1009. for (int y = 0; y < AllCnt; y++)
  1010. {
  1011. string Value = Read_Data(ds, y + 3, 13);
  1012. // 값이 '' 또는 ' ' 는 에러 메시지 출력
  1013. if (Value.Trim() == _Text.Null)
  1014. {
  1015. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  1016. string Error = " [시트명]: 연동설정" + " [행]:" + (y + 3 + 1) + " [열]:" + (13 + 1);
  1017. // 파일 포맷이 잘못되었습니다
  1018. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  1019. // LOG
  1020. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  1021. // 엑셀 읽기 세션 해제
  1022. if (Connection != null) Connection.Close();
  1023. return false;
  1024. }
  1025. }
  1026. // 아이디, 맵리스트, 연동그룹수 값이 '' 또는 ' ' 는 에러 메시지 출력
  1027. for (int x = 0; x < 3; x++)
  1028. {
  1029. for (int y = 0; y < AllCnt; y++)
  1030. {
  1031. string Value = Read_Data(ds, y + 3, x);
  1032. // 값이 '' 또는 ' ' 는 에러 메시지 출력
  1033. if (Value.Trim() == _Text.Null)
  1034. {
  1035. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  1036. string Error = " [시트명]: 연동설정" + " [행]:" + (y + 3 + 1) + " [열]:" + (x + 1);
  1037. // 파일 포맷이 잘못되었습니다
  1038. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  1039. // LOG
  1040. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  1041. // 엑셀 읽기 세션 해제
  1042. if (Connection != null) Connection.Close();
  1043. return false;
  1044. }
  1045. else
  1046. {
  1047. if (x == 0)
  1048. {
  1049. if (_Data.Project_MapGroupIDTypeNumber == "6" && Value.Length != 7) // 6자리모드 인 경우에는 7자리이다
  1050. {
  1051. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  1052. string Error = " [시트명]: 연동설정" + " [행]:" + (y + 3 + 1) + " [열]:" + (x + 1);
  1053. // 파일 포맷이 잘못되었습니다
  1054. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 600, 150, _Text.DigitNumberExcel_6 + Error, 0);
  1055. // LOG
  1056. _Event.DebugView_SendMessage_Write(_Text.DigitNumberExcel_6 + Error + " 의 정보를 확인해주세요 ");
  1057. // 엑셀 읽기 세션 해제
  1058. if (Connection != null) Connection.Close();
  1059. return false;
  1060. }
  1061. if (_Data.Project_MapGroupIDTypeNumber == "4" && Value.Length != 5) // 4자리모드 인 경우에는 5자리이다
  1062. {
  1063. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  1064. string Error = " [시트명]: 연동설정" + " [행]:" + (y + 3 + 1) + " [열]:" + (x + 1);
  1065. // 파일 포맷이 잘못되었습니다
  1066. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 600, 150, _Text.DigitNumberExcel_4 + Error, 0);
  1067. // LOG
  1068. _Event.DebugView_SendMessage_Write(_Text.DigitNumberExcel_4 + Error + " 의 정보를 확인해주세요 ");
  1069. // 엑셀 읽기 세션 해제
  1070. if (Connection != null) Connection.Close();
  1071. return false;
  1072. }
  1073. }
  1074. }
  1075. }
  1076. }
  1077. // 맵아이디가 엑셀 정보 안에서 동일한게 있는지 확인
  1078. ArrayList Map_List = new ArrayList();
  1079. for (int y = 0; y < AllCnt; y++)
  1080. {
  1081. string Value = Read_Data(ds, y + 3, 0);
  1082. if (Map_List.Contains(Value.Trim()) == false) // 없다
  1083. {
  1084. Map_List.Add(Value.Trim());
  1085. }
  1086. else // 있다
  1087. {
  1088. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  1089. string Error = " [시트명]: 연동설정" + " [행]:" + (y + 3 + 1) + " [열]:" + (0 + 1);
  1090. // 파일 포맷이 잘못되었습니다
  1091. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  1092. // LOG
  1093. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  1094. // 엑셀 읽기 세션 해제
  1095. if (Connection != null) Connection.Close();
  1096. return false;
  1097. }
  1098. }
  1099. // 맵아이디가 DB에 동일한게 있는지 확인
  1100. for (int y = 0; y < AllCnt; y++)
  1101. {
  1102. string Value = Read_Data(ds, y + 3, 0);
  1103. //** TB_MAP 테이블에서 맵명을 모두 가지고 온다
  1104. DataRowCollection DB_TABLE_MAP = _Db.ExecuteRead_SqlDataAdapter(_Sql.SearchAll_Table_Value("TB_MAP", "MAP_ID", Value.Trim(), null));
  1105. if (DB_TABLE_MAP != null)
  1106. {
  1107. foreach (DataRow dr in DB_TABLE_MAP)
  1108. {
  1109. if (DB_TABLE_MAP.Count != 0) // 없다
  1110. {
  1111. // 1을 플러스 한 이유는 엑셀의 에러 지점을 정확히 나타내기 위해
  1112. string Error = " [시트명]: 연동설정" + " [행]:" + (y + 3 + 1) + " [열]:" + (0 + 1);
  1113. // 파일 포맷이 잘못되었습니다
  1114. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 500, 150, _Text.FailDataInform + Error + " 정보가 이미 DB에 있습니다 ", 0);
  1115. // LOG
  1116. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 정보가 이미 DB에 있습니다 ");
  1117. // 엑셀 읽기 세션 해제
  1118. if (Connection != null) Connection.Close();
  1119. return false;
  1120. }
  1121. }
  1122. }
  1123. }
  1124. // 그룹아이디 읽기
  1125. List_MapID = Get_CodeData_Until_AllCnt(ds, 3, 0, AllCnt);
  1126. // 그룹명 읽기
  1127. List_MapName = Get_CodeData_Until_AllCnt(ds, 3, 1, AllCnt);
  1128. // 연동 그룹수 읽기
  1129. List_GroupNumber = Get_CodeData_Until_AllCnt(ds, 3, 2, AllCnt);
  1130. // 입력 개수
  1131. List_InDeviceNumber = Get_CodeData_Until_AllCnt(ds, 3, 13, AllCnt);
  1132. // 행을 하나씩 올려준다
  1133. int PlusCount = 0;
  1134. // 그룹 읽기
  1135. foreach (string num in List_GroupNumber)
  1136. {
  1137. string data = _Text.Null;
  1138. for (int x = 0; x < Int32.Parse(num); x++)
  1139. {
  1140. string Value = Read_Data(ds, PlusCount + 3, x + 3);
  1141. // 값이 '' 또는 ' ' 는 에러 메시지 출력
  1142. if (Value.Trim() == _Text.Null)
  1143. {
  1144. string Error = " [시트명]: 연동설정" + " [행]:" + (PlusCount + 3 + 1) + " [열]:" + (x + 3 + 1);
  1145. // 파일 포맷이 잘못되었습니다
  1146. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  1147. // LOG
  1148. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  1149. // 엑셀 읽기 세션 해제
  1150. if (Connection != null) Connection.Close();
  1151. return false;
  1152. }
  1153. // :G0001:G0002:G0003:G0004 이런씩으로 저장
  1154. data = data + ":" + Value.Trim();
  1155. }
  1156. if (data == _Text.Null) List_Groups.Add(_Text.Null); // 그룹을 추가하지 않은것
  1157. else List_Groups.Add(data.Remove(0, 1)); // 그룹이 하나라도 있으면 맨 앞에 ":" 제거
  1158. // 다음 행에서 작업
  1159. PlusCount++;
  1160. }
  1161. // 행을 하나씩 올려준다
  1162. int Count = 0;
  1163. // 입력 읽기
  1164. foreach (string num in List_InDeviceNumber)
  1165. {
  1166. string data = _Text.Null;
  1167. for (int x = 0; x < Int32.Parse(num); x++)
  1168. {
  1169. string Value = Read_Data(ds, Count + 3, x + 14);
  1170. // 값이 '' 또는 ' ' 는 에러 메시지 출력
  1171. if (Value.Trim() == _Text.Null)
  1172. {
  1173. string Error = " [시트명]: 연동설정" + " [행]:" + (Count + 3 + 1) + " [열]:" + (x + 14 + 1);
  1174. // 파일 포맷이 잘못되었습니다
  1175. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 350, 150, _Text.FailDataInform + Error, 0);
  1176. // LOG
  1177. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  1178. // 엑셀 읽기 세션 해제
  1179. if (Connection != null) Connection.Close();
  1180. return false;
  1181. }
  1182. // 해당 입력 디바이스가 존재하는 검사
  1183. // BOARD_ID, LOOP_NO, REPEATER_ID, DEVICE_ID
  1184. string[] temp = Value.Trim().Split('-');
  1185. DataRowCollection DB_TABLE_DEVICE = _Db.ExecuteRead_SqlDataAdapter(
  1186. _Sql.SearchAll_Table_Value("TB_DEVICE", "COMM_ID", "1", "INOUT_TYPE", "I", "BOARD_ID", temp[1], "LOOP_NO", temp[2], "REPEATER_ID", temp[3], "DEVICE_ID", temp[4], ReceiverID));
  1187. if (DB_TABLE_DEVICE != null)
  1188. {
  1189. if (DB_TABLE_DEVICE.Count == 0)
  1190. {
  1191. string Error = " [시트명]: 연동설정" + " [행]:" + (Count + 3 + 1) + " [열]:" + (x + 14 + 1);
  1192. // 파일 포맷이 잘못되었습니다
  1193. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 500, 150, "[" + Value.Trim() + "]" + _Text.FailDevice + Error, 0);
  1194. // LOG
  1195. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 ");
  1196. // 엑셀 읽기 세션 해제
  1197. if (Connection != null) Connection.Close();
  1198. return false;
  1199. }
  1200. }
  1201. // 포맷이 변경되지 않는다. 어차피 각각 수신기에 대하여 엑셀은 따로 존재하고 각각 Import 수행하면 반드시 그 회로는 관할 수신기의 입력회로이다
  1202. // :MI-01-1-001-1:MI-01-1-001-2:MI-01-1-001-2 이런씩으로 저장 ->
  1203. data = data + ":" + Value.Trim();
  1204. }
  1205. if (data == _Text.Null) List_InDevice.Add(_Text.Null); // 입력디바이스 추가하지 않은것
  1206. else List_InDevice.Add(data.Remove(0, 1)); // 입력디바이스가 하나라도 있으면 맨 앞에 ":" 제거
  1207. // 다음 행에서 작업
  1208. Count++;
  1209. }
  1210. // 단, 총개수와 입력한 데이타 개수가 동일하지 않으면 잘못된 데이타
  1211. //if (AllCnt != List_MapID.Count || AllCnt != List_MapName.Count)
  1212. // return false;
  1213. ///
  1214. /// 데이타베이스 연동을 위한 클래스를 생성한다
  1215. ///
  1216. _Data.List_ExcelMap.Clear();
  1217. // 그룹정보를 생성한다
  1218. for (int j = 0; j < AllCnt; j++)
  1219. {
  1220. _Excel_Map Excel_Map = new _Excel_Map();
  1221. Excel_Map.Map_ID = List_MapID[j].ToString();
  1222. Excel_Map.Map_Name = List_MapName[j].ToString();
  1223. Excel_Map.Group_Number = List_GroupNumber[j].ToString();
  1224. Excel_Map.Groups = List_Groups[j].ToString();
  1225. Excel_Map.InDevices = List_InDevice[j].ToString();
  1226. _Data.List_ExcelMap.Add(Excel_Map);
  1227. }
  1228. return true;
  1229. }
  1230. }
  1231. // 엑셀 읽기 세션 해제
  1232. if (Connection != null) Connection.Close();
  1233. // _Data.List_ExcelGroup.Count 가 0 도 허용한다
  1234. return true;
  1235. }
  1236. catch (Exception e)
  1237. {
  1238. _Event.DebugView_SendMessage_Write(e.ToString());
  1239. return false;
  1240. }
  1241. }
  1242. // Import
  1243. public static bool Import_Point(string FileFullPath)
  1244. {
  1245. int RepeaterRowNum = 0;
  1246. // 디버깅 변수 초기화
  1247. Debug_Row = 0;
  1248. Debug_Col = 0;
  1249. Debug_SheetName = null;
  1250. Debug_EtcMessage = null;
  1251. string CheckConnectionString = ConnectionString(FileFullPath);
  1252. if (CheckConnectionString == null)
  1253. {
  1254. // 파일 확장자를 확인해주세요
  1255. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.CheckFileFormatInform, 0);
  1256. return false;
  1257. }
  1258. // 엑셀 문서 접근
  1259. OleDbConnection Connection = new OleDbConnection(CheckConnectionString);
  1260. try
  1261. {
  1262. // 엑셀 문서 읽기
  1263. Connection.Open();
  1264. // 시트명을 가져온다
  1265. DataTable worksheets = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
  1266. ///
  1267. /// 1. 코드값 저장
  1268. ///
  1269. /// 코드 시트가 있는지 확인하고 없다면 루틴을 돌지 않도록 한다
  1270. /// 또한 _Data.Class_ExcelCode 에 코드 정보를 저장하여 차후에 사용하도록 클래스를 저장한다
  1271. ///
  1272. if (Import_Point_GetCode(worksheets, Connection) == false)
  1273. {
  1274. // 코드 시트가 잘못되었습니다
  1275. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.FailCodeInform, 0);
  1276. return false;
  1277. }
  1278. ///
  1279. /// 2. 포인트 정보 저장
  1280. ///
  1281. /// 포인트 정보를 저장하는 리스트이다 (가장 중요한 리스트이다, 시트별-중계기별-입출력포인트 순으로 클래스화 하여 저장한다)
  1282. ///
  1283. // 초기화
  1284. _Data.List_ExcelPoint.Clear();
  1285. // 엑셀 시트 수에 맞게 데이타를 읽어 온다
  1286. for (int i = 0; i < worksheets.Rows.Count; i++)
  1287. {
  1288. // 시트명
  1289. string sheetname = worksheets.Rows[i]["TABLE_NAME"].ToString();
  1290. // 읽지 않는 시트인지 판별
  1291. if (Import_Point_CheckSheetName(sheetname) == true)
  1292. {
  1293. // Debug
  1294. Debug_SheetName = sheetname.Replace("$", "");
  1295. // 읽은 정보를 데이타셋에 매칭
  1296. OleDbCommand Command = new OleDbCommand("Select * From [" + sheetname + "]", Connection);
  1297. OleDbDataAdapter dapt = new OleDbDataAdapter(Command);
  1298. DataSet ds = new DataSet();
  1299. dapt.Fill(ds);
  1300. ///
  1301. /// _Excel_Sheet 클래스 생성
  1302. ///
  1303. _Excel_Sheet Excel_Sheet = new _Excel_Sheet();
  1304. // 시트명
  1305. Excel_Sheet.Sheet_Name = sheetname;
  1306. // 통신 보드
  1307. Excel_Sheet.BOARD_ID = Read_Data(ds, 1, 0);
  1308. if (Excel_Sheet.BOARD_ID == null || Excel_Sheet.BOARD_ID.Trim().Length == 0 || Int32.Parse(Excel_Sheet.BOARD_ID) <= 0 || Int32.Parse(Excel_Sheet.BOARD_ID) > 68)
  1309. {
  1310. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 450, 150, _Text.ExceptionError2, 0);
  1311. return false;
  1312. }
  1313. // 계통
  1314. Excel_Sheet.LOOP_NO = Read_Data(ds, 1, 1);
  1315. if (Excel_Sheet.LOOP_NO == null || Excel_Sheet.LOOP_NO.Trim().Length == 0 || Int32.Parse(Excel_Sheet.LOOP_NO) <= 0 || Int32.Parse(Excel_Sheet.LOOP_NO) > 4)
  1316. {
  1317. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 450, 150, _Text.ExceptionError3, 0);
  1318. return false;
  1319. }
  1320. // 중계기 총개수
  1321. Excel_Sheet.Repeater_Count = Int32.Parse(Read_Data(ds, 1, 2));
  1322. // 시트안에 중계기 개수 만큼 루프 생성
  1323. for (int j = 0; j < Excel_Sheet.Repeater_Count; j++)
  1324. {
  1325. ///
  1326. /// _Excel_Repeater 클래스 생성
  1327. ///
  1328. _Excel_Repeater Excel_Repeater = new _Excel_Repeater();
  1329. // 중계기 타입
  1330. string Temp_Repeater_Type = Read_Data(ds, 4 + (j * 5), 1);
  1331. if (Temp_Repeater_Type == null || Temp_Repeater_Type.Trim().Length == 0)
  1332. {
  1333. Debug_Row = 4 + (j * 5) + 1;
  1334. Debug_Col = 1 + 1;
  1335. throw new Exception();
  1336. }
  1337. else if (Temp_Repeater_Type == "None")
  1338. {
  1339. ;// 사용하지 않는 중계기는 무시한다
  1340. }
  1341. else
  1342. {
  1343. // 중계기 검사 타입
  1344. if (Read_Data(ds, 4 + (j * 5), 1) == "4*4")
  1345. Excel_Repeater.TYPE = POINT_TYPE.REPEATER_4_4;
  1346. else if (Read_Data(ds, 4 + (j * 5), 1) == "2*2")
  1347. Excel_Repeater.TYPE = POINT_TYPE.REPEATER_2_2;
  1348. else if (Read_Data(ds, 4 + (j * 5), 1) == "연감지기")
  1349. Excel_Repeater.TYPE = POINT_TYPE.ANALOG_SMOKE;
  1350. else if (Read_Data(ds, 4 + (j * 5), 1) == "열감지기")
  1351. Excel_Repeater.TYPE = POINT_TYPE.ANALOG_HEAT;
  1352. else
  1353. // 중계기 타입이 없다면 예외
  1354. {
  1355. Debug_Row = 4 + (j * 5) + 1;
  1356. Debug_Col = 1;
  1357. throw new Exception();
  1358. }
  1359. // 필요 이상 회로 정보가 있다면 예외
  1360. int Temp_RepeaterRowNum = 0;
  1361. string Temp_Info = null;
  1362. int Temp_Info_Cnt = 0;
  1363. if (Excel_Repeater.TYPE == POINT_TYPE.REPEATER_2_2
  1364. || Excel_Repeater.TYPE == POINT_TYPE.ANALOG_SMOKE
  1365. || Excel_Repeater.TYPE == POINT_TYPE.ANALOG_HEAT)
  1366. {
  1367. for (int k = 1; k <= 4; k++)
  1368. {
  1369. // 중계기 행번호
  1370. Temp_RepeaterRowNum = 4 + (j * 5);
  1371. // 위치정보
  1372. Temp_Info += Read_Data(ds, Temp_RepeaterRowNum + k, 2);
  1373. Temp_Info += Read_Data(ds, Temp_RepeaterRowNum + k, 3);
  1374. Temp_Info += Read_Data(ds, Temp_RepeaterRowNum + k, 4);
  1375. Temp_Info += Read_Data(ds, Temp_RepeaterRowNum + k, 5);
  1376. Temp_Info += Read_Data(ds, Temp_RepeaterRowNum + k, 6);
  1377. Temp_Info += Read_Data(ds, Temp_RepeaterRowNum + k, 7);
  1378. Temp_Info += Read_Data(ds, Temp_RepeaterRowNum + k, 8);
  1379. // 내용이 있다면
  1380. if (Temp_Info != null && Temp_Info.Length != 0)
  1381. Temp_Info_Cnt++;
  1382. // 초기화
  1383. Temp_Info = null;
  1384. }
  1385. if (Excel_Repeater.TYPE == POINT_TYPE.REPEATER_2_2)
  1386. {
  1387. // 중계기 회로가 2*2 인데 더 많은 정보가 있으므로 틀리다
  1388. if (Temp_Info_Cnt > 2)
  1389. {
  1390. Debug_Row = 4 + (j * 5) + 1;
  1391. Debug_Col = 1;
  1392. throw new Exception();
  1393. }
  1394. }
  1395. else if (Excel_Repeater.TYPE == POINT_TYPE.ANALOG_SMOKE || Excel_Repeater.TYPE == POINT_TYPE.ANALOG_HEAT)
  1396. {
  1397. // 연감지기 및 열감지기는 더 많은 정보가 있으므로 틀리다
  1398. if (Temp_Info_Cnt > 1)
  1399. {
  1400. Debug_Row = 4 + (j * 5) + 1;
  1401. Debug_Col = 1;
  1402. throw new Exception();
  1403. }
  1404. }
  1405. }
  1406. // 중계기 아이디
  1407. Excel_Repeater.REPEATER_ID = Read_Data(ds, 4 + (j * 5), 0);
  1408. // 중계기 아이디가 없다면 예외
  1409. if (Excel_Repeater.REPEATER_ID == null || Excel_Repeater.REPEATER_ID.Trim().Length == 0)
  1410. {
  1411. Debug_Row = 4 + (j * 5) + 1;
  1412. Debug_Col = 0;
  1413. throw new Exception();
  1414. }
  1415. // 중계기 위치 정보
  1416. Excel_Repeater.Excel_Position.Building = Read_Data(ds, 4 + (j * 5), 2);
  1417. Excel_Repeater.Excel_Position.Stair = Read_Data(ds, 4 + (j * 5), 3);
  1418. Excel_Repeater.Excel_Position.Floor = Read_Data(ds, 4 + (j * 5), 4);
  1419. // 중계기 위치 정보 없다면 예외
  1420. if (Excel_Repeater.Excel_Position.Building == null || Excel_Repeater.Excel_Position.Building.Trim().Length == 0)
  1421. {
  1422. Debug_Row = 4 + (j * 5) + 1;
  1423. Debug_Col = 2;
  1424. throw new Exception();
  1425. }
  1426. if (Excel_Repeater.Excel_Position.Stair == null || Excel_Repeater.Excel_Position.Stair.Trim().Length == 0)
  1427. {
  1428. Debug_Row = 4 + (j * 5) + 1;
  1429. Debug_Col = 3;
  1430. throw new Exception();
  1431. }
  1432. if (Excel_Repeater.Excel_Position.Floor == null || Excel_Repeater.Excel_Position.Floor.Trim().Length == 0)
  1433. {
  1434. Debug_Row = 4 + (j * 5) + 1;
  1435. Debug_Col = 4;
  1436. throw new Exception();
  1437. }
  1438. // 위치 코드 사용여부 체크
  1439. string Temp_Repeater_Position_Name = Code_Position_Name_Create(
  1440. Excel_Repeater.Excel_Position.Building, Excel_Repeater.Excel_Position.Stair, Excel_Repeater.Excel_Position.Floor);
  1441. // 위치 코드가 잘못되었다
  1442. if (Code_Position_Enable_Check(Temp_Repeater_Position_Name) == false)
  1443. {
  1444. Debug_EtcMessage = _Text.FailDataInform_NotCodePostionName;
  1445. throw new Exception();
  1446. }
  1447. // 중계기 명칭
  1448. Excel_Repeater.NAME = Read_Data(ds, 4 + (j * 5), 5);
  1449. // 중계기 명칭 없다면 예외
  1450. if (Excel_Repeater.NAME == null || Excel_Repeater.NAME.Trim().Length == 0)
  1451. {
  1452. Debug_Row = 4 + (j * 5) + 1;
  1453. Debug_Col = 5;
  1454. throw new Exception();
  1455. }
  1456. // 중계기 타입에 상관없이 무조건 4행 단위로 읽는다
  1457. for (int k = 1; k <= 4; k++)
  1458. {
  1459. // 중계기 행번호
  1460. RepeaterRowNum = 4 + (j * 5);
  1461. // 디바이스 아이디(중계기타입 아래칸)은 제대로된 순번을 넣어야한다
  1462. if (Read_Data(ds, RepeaterRowNum + k, 1) != k.ToString())
  1463. {
  1464. Debug_Row = 4 + (j * 5) + k + 1;
  1465. Debug_Col = 1;
  1466. throw new Exception();
  1467. }
  1468. ///
  1469. /// _Excel_Point 클래스 생성 (입력부)
  1470. ///
  1471. // 디바이스 명칭이 없다면 제외
  1472. if (ds.Tables[0].Rows[RepeaterRowNum + k][5] != null && ds.Tables[0].Rows[RepeaterRowNum + k][5].ToString().Length != 0)
  1473. {
  1474. string TempDeviceName = Read_Data(ds, RepeaterRowNum + k, 5);
  1475. TempDeviceName = TempDeviceName.Trim();
  1476. if (TempDeviceName != null && TempDeviceName.Length != 0)
  1477. {
  1478. _Excel_Point Excel_Point_Input = new _Excel_Point();
  1479. // 입력 포인트 타입
  1480. Excel_Point_Input.TYPE = POINT_TYPE.I;
  1481. // 입력 포인트 PortNum
  1482. Excel_Point_Input.PortNum = ds.Tables[0].Rows[RepeaterRowNum + k][1].ToString();
  1483. // 입력 포인트 위치 정보
  1484. Excel_Point_Input.Excel_Position.Building = Read_Data(ds, RepeaterRowNum + k, 2);
  1485. Excel_Point_Input.Excel_Position.Stair = Read_Data(ds, RepeaterRowNum + k, 3);
  1486. Excel_Point_Input.Excel_Position.Floor = Read_Data(ds, RepeaterRowNum + k, 4);
  1487. // 위치 코드 사용여부 체크
  1488. string Temp_Point_Position_Name = Code_Position_Name_Create(
  1489. Excel_Point_Input.Excel_Position.Building, Excel_Point_Input.Excel_Position.Stair, Excel_Point_Input.Excel_Position.Floor);
  1490. if (Code_Position_Enable_Check(Temp_Point_Position_Name) == false)
  1491. {
  1492. Debug_EtcMessage = _Text.FailDataInform_NotCodePostionName;
  1493. throw new Exception();
  1494. }
  1495. // 입력 포인트 명칭
  1496. Excel_Point_Input.NAME = TempDeviceName;
  1497. // 입력 포인트 코드
  1498. Excel_Point_Input.Code_FullName = Read_Data(ds, RepeaterRowNum + k, 6);
  1499. string[] TempCode = Excel_Point_Input.Code_FullName.Split(' ');
  1500. Excel_Point_Input.Code_Type = TempCode[0];
  1501. Excel_Point_Input.Code_Name = TempCode[1];
  1502. // 리스트에 추가
  1503. Excel_Repeater.List_Point.Add(Excel_Point_Input);
  1504. }
  1505. }
  1506. // 단, 명칭은 없지만, 코드가 존재하는 경우는 예외다
  1507. else
  1508. {
  1509. // 코드가 존재하는 경우
  1510. if (ds.Tables[0].Rows[RepeaterRowNum + k][6] != null && ds.Tables[0].Rows[RepeaterRowNum + k][6].ToString().Trim().Length != 0)
  1511. {
  1512. // 명칭이 없는 경우만
  1513. if (ds.Tables[0].Rows[RepeaterRowNum + k][5] == null || ds.Tables[0].Rows[RepeaterRowNum + k][5].ToString().Trim().Length == 0)
  1514. {
  1515. Debug_Row = RepeaterRowNum + k + 1;
  1516. Debug_Col = 5 + 1;
  1517. throw new Exception();
  1518. }
  1519. }
  1520. }
  1521. ///
  1522. /// _Excel_Point 클래스 생성 (출력부)
  1523. ///
  1524. // 디바이스 명칭이 없다면 제외
  1525. if (ds.Tables[0].Rows[RepeaterRowNum + k][7] != null && ds.Tables[0].Rows[RepeaterRowNum + k][7].ToString().Length != 0)
  1526. {
  1527. string TempDeviceName = Read_Data(ds, RepeaterRowNum + k, 7);
  1528. TempDeviceName = TempDeviceName.Trim();
  1529. if (TempDeviceName != null && TempDeviceName.Length != 0)
  1530. {
  1531. _Excel_Point Excel_Point_Output = new _Excel_Point();
  1532. // 출력 포인트 타입
  1533. Excel_Point_Output.TYPE = POINT_TYPE.O;
  1534. // 출력 포인트 PortNum
  1535. Excel_Point_Output.PortNum = ds.Tables[0].Rows[RepeaterRowNum + k][1].ToString();
  1536. // 출력 포인트 위치 정보
  1537. Excel_Point_Output.Excel_Position.Building = Read_Data(ds, RepeaterRowNum + k, 2);
  1538. Excel_Point_Output.Excel_Position.Stair = Read_Data(ds, RepeaterRowNum + k, 3);
  1539. Excel_Point_Output.Excel_Position.Floor = Read_Data(ds, RepeaterRowNum + k, 4);
  1540. // 위치 코드 사용여부 체크
  1541. string Temp_Point_Position_Name = Code_Position_Name_Create(
  1542. Excel_Point_Output.Excel_Position.Building, Excel_Point_Output.Excel_Position.Stair, Excel_Point_Output.Excel_Position.Floor);
  1543. if (Code_Position_Enable_Check(Temp_Point_Position_Name) == false)
  1544. {
  1545. Debug_EtcMessage = _Text.FailDataInform_NotCodePostionName;
  1546. throw new Exception();
  1547. }
  1548. // 출력 포인트 명칭
  1549. Excel_Point_Output.NAME = TempDeviceName;
  1550. // 출력 포인트 코드
  1551. Excel_Point_Output.Code_FullName = Read_Data(ds, RepeaterRowNum + k, 8);
  1552. string[] TempCode = Excel_Point_Output.Code_FullName.Split(' ');
  1553. Excel_Point_Output.Code_Type = TempCode[0];
  1554. Excel_Point_Output.Code_Name = TempCode[1];
  1555. // 리스트에 추가
  1556. Excel_Repeater.List_Point.Add(Excel_Point_Output);
  1557. }
  1558. }
  1559. // 단, 명칭은 없지만, 코드가 존재하는 경우는 예외다
  1560. else
  1561. {
  1562. // 코드가 존재하는 경우
  1563. if (ds.Tables[0].Rows[RepeaterRowNum + k][8] != null && ds.Tables[0].Rows[RepeaterRowNum + k][8].ToString().Trim().Length != 0)
  1564. {
  1565. // 명칭이 없는 경우만
  1566. if (ds.Tables[0].Rows[RepeaterRowNum + k][7] == null || ds.Tables[0].Rows[RepeaterRowNum + k][7].ToString().Trim().Length == 0)
  1567. {
  1568. Debug_Row = RepeaterRowNum + k + 1;
  1569. Debug_Col = 7 + 1;
  1570. throw new Exception();
  1571. }
  1572. }
  1573. }
  1574. }
  1575. // 리스트에 추가
  1576. Excel_Sheet.List_Repeater.Add(Excel_Repeater);
  1577. }
  1578. }
  1579. // 리스트에 추가
  1580. _Data.List_ExcelPoint.Add(Excel_Sheet);
  1581. }
  1582. }
  1583. ///
  1584. /// 3. 포인트 위치 정보에 따라 실제로 사용한는 위치 코드값을 재정리
  1585. /// 실제로 사용되는 위치코드만 재정리
  1586. ///
  1587. Code_Postion_Create();
  1588. // 단, 엑셀시트 클래스안에 중계기클래스가 없다면 잘못된 포맷이다
  1589. int RepeterAllCount = 0;
  1590. foreach (_Excel_Sheet Excel_Sheet in _Data.List_ExcelPoint)
  1591. foreach (_Excel_Repeater Excel_Repeater in Excel_Sheet.List_Repeater)
  1592. RepeterAllCount++;
  1593. if (RepeterAllCount == 0)
  1594. {
  1595. // 파일 포맷이 잘못되었습니다
  1596. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.FailFormatInform, 0);
  1597. return false;
  1598. }
  1599. /////
  1600. ///// 4. 그룹 정보 저장
  1601. /////
  1602. //if (Import_Point_GetGroup(worksheets, Connection) == false)
  1603. //{
  1604. // // 연동그룹 시트가 잘못되었습니다
  1605. // _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.FailGroupInform, 0);
  1606. // return false;
  1607. //}
  1608. /////
  1609. ///// 5. 맵 정보 저장
  1610. /////
  1611. //if (Import_Point_GetMap(worksheets, Connection) == false)
  1612. //{
  1613. // // 연동설정 시트가 잘못되었습니다
  1614. // _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 250, 150, _Text.FailMapInform, 0);
  1615. // return false;
  1616. //}
  1617. // 엑셀 읽기 세션 해제
  1618. if (Connection != null) Connection.Close();
  1619. return true;
  1620. }
  1621. catch (Exception e)
  1622. {
  1623. string Error = " 시트명:" + Debug_SheetName + " 행:" + Debug_Row + " 열:" + Debug_Col;
  1624. // 추가 메세지가 필요한 경우
  1625. string Message = null;
  1626. // 추가 메세지가 없는 경우에는 "데이타가 잘못되었습니다" 문구 출력
  1627. if (Debug_EtcMessage != null)
  1628. Message = Debug_EtcMessage + Error;
  1629. else
  1630. Message = _Text.FailDataInform + Error;
  1631. // 데이타가 잘못되었습니다
  1632. _Popup.Create(Popup_Type.Confirm, Popup_Style.Normal, _Text.Warnning, 600, 150, Message, 0);
  1633. // LOG
  1634. _Event.DebugView_SendMessage_Write(_Text.NotReadExcelFile + Error + " 의 정보를 확인해주세요 " + e.ToString());
  1635. // 엑셀 읽기 세션 해제
  1636. if (Connection != null) Connection.Close();
  1637. return false;
  1638. }
  1639. }
  1640. // Export
  1641. public static void Export_Point(string FileFullPath)
  1642. {
  1643. }
  1644. }
  1645. }