성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <div style='font-family: 맑은 고딕, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Excel - XML 파일 연동</div> <br /> Excel 데이터를 XML로 저장하려면, "Developer" / "XML" / "Export" 버튼을 눌러주거나 다음과 같이 "Save As" 대화상자에서 아예 문서 자체를 XML로 저장할 수도 있습니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_1.png' width='800' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_1.png' /><br /> <br /> 물론, 애석하게도 일반적인 엑셀 파일의 내용은 다음과 같이 오류를 발생시키며 저장이 되지 않습니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_2.png' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_2.png' /><br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'> Cannot save XML data because the workbook does not contain any XML mappings.<br /> <br /> 또는,<br /> <br /> Cannot save or export XML data. The XML maps in this workbook are not exportable.<br /> </div><br /> <br /> 즉, XML로 저장하기 위해서는 해당 셀과 XML 사이에 매핑이 이뤄져야 하는데 기본적으로는 이런 정보가 없기 때문에 당연히 오류가 발생할 수밖에 없는 것입니다.<br /> <br /> 이번 글에서는 어떻게 하면 엑셀 데이터를 XML로 저장하는지에 대해서 알아볼텐데요. 사실 지난번에 쓴 2개의 글은 원래 이것 때문에 테스트하다가 씌여진 것이었습니다. ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > 엑셀 매크로 함수 관련 오류 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1005'>http://www.sysnet.pe.kr/2/0/1005</a> XML/XSD - 외래키처럼 참조 제한 거는 방법 ; <a target='_tab' href='http://www.sysnet.pe.kr/2/0/1006'>http://www.sysnet.pe.kr/2/0/1006</a> </pre> <br /> <hr style='width: 50%' /><br /> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>1. XSD 정의</div><br /> <br /> 엑셀에서 XML과 연동하려면, 제일 먼저 XML의 형식을 정의하는 XSD 파일을 정의해 줘야 합니다. 아래는 제가 만든 예제입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > ==== test.xsd ==== <?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="http://www.sysnet.pe.kr/Data.xsd" elementFormDefault="qualified" xmlns="http://www.sysnet.pe.kr/Data.xsd" xmlns:my="http://www.sysnet.pe.kr/Data.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="DataT"> <xs:sequence> </xs:sequence> <xs:attribute name="Name" type="xs:string" use="required" /> <xs:attribute name="Scope" type="ScopeEnumT" use="required" /> <xs:attribute name="Description" type="xs:string" use="optional" /> </xs:complexType> <xs:simpleType name="ScopeEnumT"> <xs:restriction base="xs:string"> <xs:enumeration value="None"/> <xs:enumeration value="AppDomain"/> <xs:enumeration value="InProcess"/> <xs:enumeration value="OutofProcess"/> <xs:enumeration value="Machine"/> </xs:restriction> </xs:simpleType> <xs:complexType name="GroupDataT"> <xs:attribute name="Name" type="xs:string" use="required" /> <xs:attribute name="DataNameRef" type="xs:string" use="required" /> <xs:attribute name="Description" type="xs:string" use="optional" /> </xs:complexType> <xs:element name="IntegratedData"> <xs:complexType> <xs:sequence> <xs:element name="Item" maxOccurs="unbounded" type="DataT"> </xs:element> <xs:element name="GroupItem" maxOccurs="unbounded" type="GroupDataT"> </xs:element> </xs:sequence> </xs:complexType> <xs:key name="NameIDDef"> <xs:selector xpath="./my:Item" /> <xs:field xpath="@Name" /> </xs:key> <xs:keyref name="NameIDRef" refer="NameIDDef"> <xs:selector xpath="./my:GroupItem" /> <xs:field xpath="@DataNameRef" /> </xs:keyref> </xs:element> </xs:schema> </pre> <br /> 위의 스키마가 표현하려는 XML 내용을 간단하게 작성해 보면 다음과 같습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; width: 800px; background-color: #fbedbb; overflow-x: scroll; font-family: Consolas, Verdana;' > ==== test.xml ==== <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <IntegratedData xmlns="http://www.sysnet.pe.kr/Data.xsd"> <Item Name="Type" Scope="AppDomain" Description="# of types in AppDomain"/> ...[n 개의 Item 노드]... <GroupItem Name="PerfGroup" DataNameRef="Type" Description="5"/> ...[n 개의 GroupItem 노드]... </IntegratedData> </pre> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>2. XSD 소스 추가</div><br /> <br /> "Developer" 리본에서 XML 그룹의 "Source" 버튼을 누르면 다음과 같이 "XML Source" 밴드가 보이고, 내부의 "XML Maps..." 버튼을 눌러줍니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_3.png' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_3.png' /><br /> <br /> "Add..." 버튼을 눌러 이전에 만들어 둔 "test.xsd" 파일을 추가해 줍니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_4.png' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_4.png' /><br /> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>3. 엑셀 Worksheet에 XSD 매핑</div><br /> <br /> 제가 만든 XSD는 목록용(element[@maxOccurs='unbounded'])으로 만든 것이기 때문에 "XML Source" 밴드에서 ns1:Item과 ns1:GroupItem을 끌어다 엑셀 워크 시트에 다음과 같은 식으로 배치해 줍니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_5.png' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_5.png' /><br /> <br /> 이제, 각각의 셀에 값을 입력해 주고 "Developer" / "XML" / "Export" 버튼을 눌러서 XML 파일로 내보내거나, 기존 XML 파일로 저장된 내용을 "Import" 버튼을 이용해서 불러올 수 있습니다.<br /> <br /> 기본적인 엑셀과 XML 데이터 연동은 이걸로 모두 설명이 되었습니다.<br /> <br /> 마무리 하기 전에 한가지 팁이라면, 테이블에 새로운 Row를 추가할 때는 "Home" / "Cells" / "Insert" 기능을 이용하면 되지만 마지막 Row의 아래에 새롭게 추가하고자 할 때는 "Home" / "Cells" / "Insert" 버튼을 아래로 확장해서 나오는 "Insert Table Row Below" 메뉴를 선택해 주시면 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> <div style='font-size: 12pt; font-family: 맑은 고딕, Consolas; color: #2211AA; text-align: left; font-weight: bold'>유효성 확인</div><br /> <br /> XSD와 연동된 엑셀 데이터를 단순히 XML로 저장만 하는 것은 그다지 큰 의미가 없습니다. 중요한 것은 "값의 유효성 확인"인데요. 기본적으로 엑셀은 XML로 내보내기할 때 XSD에 기반한 유효성 확인을 하지 않습니다. 즉, 다음과 같이 입력된 경우 XSD에 지정한 제약에 위반되었다 해도 아무런 문제 없이 XML 파일로 저장이 됩니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_6.png' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_6.png' /><br /> <br /> 사실, 대부분의 경우 이것은 사용자가 의도한 경우가 아닐 수 있는데요. 아쉽게도 유효성 확인 기능이 기본적으로 꺼져 있기 때문에 이런 '문제'가 발생하는 것입니다. 이를 해결하려면, "Developer" / "XML" / "Map Properties"라는 버튼을 눌러서 다음과 같이 "Validate data against schema for import and export" 옵션을 켜 주시면 됩니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_7.png' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_7.png' /><br /> <br /> 설정 후에, 다시 한번 "Export"로 저장을 해보면 다음과 같이 오류가 발생하는 것을 볼 수 있습니다.<br /> <br /> <img alt='how_to_save_excel_as_xmldata_8.png' src='/SysWebRes/bbs/how_to_save_excel_as_xmldata_8.png' /><br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: 맑은 고딕, Consolas, Verdana; COLOR: #005555'> 'scopeTest' violates enumeration constraint of 'None AppDomain InProcess OutofProcess Machine'.<br /> The attribute 'Scope' with value 'scopeTest' failed to parse.<br /> </div><br /> <br /> 사실 XSD 유효성 확인을 '저장하는 시점'에 하는 것은 그다지 바람직한 방법은 아닙니다. 그보다는, "Data" / "Data Tools" / "Data Validation" 기능을 이용하여 작업 시트를 구성해주는 것이 좋을 것입니다.<br /> <br /> <a target='_tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?wid=1007&boardid=331301885'>첨부된 파일은 예제로 사용된 XSD/XML과 엑셀 파일</a>입니다.<br /> <br /> (그나저나,,, 왜 이런 내용은 엑셀 책에 안 나오는 것일까요? 가지고 있는 엑셀 책에서 XML 연동 부분을 찾아보니 없군요. "개발자를 위한 엑셀 2010" ... 이라는 제목으로 출판된 책이 있었으면 좋겠습니다. ^^)<br /> <br /><br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1496
(왼쪽의 숫자를 입력해야 합니다.)