PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net | Excel, LINQ to XML

System.Xml.Linq.XElement ,엑셀화일과 XML

xml화일이 왜 필요한지 갸우뚱하는 분들이 많을 것이다
XML is a universal standard format
for exchanging data between applications
XML은 프로그램간의 정보를 교환하기 위하여 필요한
(세상어느 곳에서나 통하는)통합된 하나의 서식이다
이 말도 무슨말인지 긴가 민가 하다..
예를 들어서 앞페이지에서 그림들을 불러오는 정보들이 엑셀에 저장되었다고 치면
LINQ도 사용할수 없고, XElement라는 개체도 사용할수 없다

무슨 소린지 xml화일을 엑셀화일에서 열고
(엑셀은 csv화일,xml화일등을 읽기전용으로 열어서 볼수 있다)
이것을 엑셀화일로 저장하면 엑셀화일이 된다
이 과정을 해보고..
VB.Net에서 화일을 저장하는 폴더를 어떤 것을 선택할지도 생각해 보자



C:\Users\사용자이름\AppData\Roaming
AppData\Roaming 폴더는 일부러 열어 볼수 없는 폴더이다
소루션을 만들면서 다양한 정보를 하드에 저장을 해놓고 사용하여야하는 경우는
일반적인 일이다
이렇게 쓸데 없이 열어볼수 없는 폴더가 준비되어 있으니 편리한 것이다
윈도우시스템은 모두 자신만의 사용자 계정이 있다
이 계정을 사용하는 사람마다 각자의 이런 폴더가 보이지 않게 제공되는 셈이다
예를 들어 사용하고 있는 웹문서텍스트편집기라는 소루션을 사용할때
아래의 그림과 같이 웹서버에 올라가기 전에 케시화일로 사용자의 하드에
저장이 되어야 안전이 어느 정도 보장이 된다
업로드시키다가 인터넷이 열악하여 성공하지 못해도 사용자의 하드에는
화일이 저장되어 있는 것이니까..



사용하는 소루션 applicaiton의 데이타화일을 안전하게 잘 보관할수 있는 것이다
실은 이것은 실용적이지 않지만 왜 xml화일이 필요한지를 느끼기 위한 것이다
엑셀화일을 엑셀화일 그대로 사용한다고 하는 것은
이런 용도로 사용함에 있어서는 효율이 떨어짐을
알게 되기 위함이다
그래서 xml이라는 가벼운 텍스트화일이 융통성있고, 그래서 모든 개발자가
반드시 알고 있어야 할 형식의 데이타관리이다

아래의 시나리오는
xml화일을 서버에서 불러서
xml화일의 내용을 엑셀로 열어서(이 상태는 xml형식의 화일을 그냥 엑셀로 열었을뿐)
이부분에서 그냥 xml화일을 PC에 저장해도 되지만, 여기서는 엑셀을 사용하기 실험하기 위한것
이 화일을 엑셀형식으로 여러분의 PC의 숨겨진 폴더에 저장하고
이 엑셀화일의 내용을 사용자정의 크래스를 만들고 집합체를 만들어서
집합체에 엑셀화일의 내용을 담아서..
엑셀 닫아 버리고..
이제 사용자정의 집합체로 윈도우폼이 작동되게 하는 것..


''엑셀개체라이브러리를 참조시킨후 아래와 같이 사용할수 있다
''엑셀개체를 생성하고
Dim oX As Microsoft.Office.Interop.Excel.Application = New Microsoft.Office.Interop.Excel.Application
''엑셀이 눈에 보이지 않게 하여도 되지만, 테스트이니까..눈에 보이게 하고
''그리고 통합문서 하나
''워크시트하나 변수준비하고
oX.Visible = True
Dim oBook As Microsoft.Office.Interop.Excel.Workbook = Nothing
Dim osheet As Microsoft.Office.Interop.Excel.Worksheet = Nothing
''이미 만들어 놓은 것이 있는지 확인하고
''없으면 에러가 날것이니 Try~Catch문 브록속에 작성하고
Try
  oBook = oX.Workbooks.Open(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\test.xls")
  osheet = oBook.Worksheets(1)
Catch ex As Exception

End Try
''만약 위에서 얻어내려고 한것이 nothing이면 xml화일을 불러서 새로 통합문서를 만든다
''이때 OpenXML은 통합문서이지만 xml화일을 읽기전용으로 보는 상태의 엑셀이다
If oBook Is Nothing Then
  oBook = oX.Workbooks.OpenXML(XML_FILE, Type.Missing)
  osheet = oBook.Worksheets(1)
  With osheet.UsedRange
	  .RowHeight = 28
	  CType(.Columns(4), Microsoft.Office.Interop.Excel.Range).ColumnWidth = 70

  End With
 ''저장을 하는데 xml형식이 아니니 엑셀화일로 저장한다
 ''XlFileFormat.xlWorkbookDefault 로 해주어야 PC에서 사용하고 있는 엑셀버전에 맞는 형식의 엑셀화일이 된다
  oBook.SaveAs(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & _
			   "\test.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault)
End If

Dim iNum As Integer = 0
''전역변수에 선언한 사용자정의 개체와 집합체를 생성한다
Dim oData As Quote = Nothing
quotes_ = New List(Of Quote)
''사용자정의 개체의 내용은 아래와 같고..

''category	/date	/desc	/file	/talk
'' category As String '' 구분
'' date_ As Date '' 입력일자
'' talk As String '' 켑션
'' img_1 As String '' 그림정보 1
'' img_2 As String '' 그림정보 2
'' file As String '' 별도의 xml 화일

For Each rRow As Microsoft.Office.Interop.Excel.Range In osheet.UsedRange.Offset(2).Rows
  Try '' 많은 데이타중에는 오류가 있는 데이타가 있을지 모르니, Try Catch문으로 오류는 그냥 패스...
	  oData = New Quote
	  oData.category = CStr(rRow.Cells(1).value).Trim
	  oData.date_ = CDate(CStr(rRow.Cells(2).value).Trim)
	  oData.talk = CStr(rRow.Cells(5).value).Trim
	  oData.file = CStr(rRow.Cells(3).value).Trim

	  oData.img_1 = Trim(CStr(rRow.Cells(4).value)).Split("|")(0)
	  oData.img_2 = Trim(CStr(rRow.Cells(4).value)).Split("|")(1)

	  quotes_.Add(oData)
	  iNum += 1
	  Me.Text = iNum & " Read From Excel File..." & oData.talk

  Catch ex As Exception

  End Try
Next
oX.Quit()

''엑셀은 위에서 닫아 버린것이고 윈도우폼상에 만들어진 집합체를 순환하면서 목록상자를 채운다
For Each oQuo As Quote In quotes_
  Me.ListBox1.Items.Add(oQuo.talk)
  Me.LabelMsgNoPicAvailable.Text = "DataLoading..." & oQuo.talk
  Application.DoEvents()
Next
startImages(Me.ListBox1.Items(0))
Me.LabelMsgNoPicAvailable.Text = ""
''이제 윈도우폼은 xml에서 정보를 가져왔던
''엑셀에 가져 왔던 똑같다
''문제는 데이타를 로딩하고 관리하기가 어떤 것이 편한지를 개발자는 
''전략적으로 선택하여야 하는 것
''물론 이런 경우 xml화일이 최적임은 분명한 것

그러니 XML화일과 친해지려고 노력함이 좋은 것
특히 안드로이드앱이나 아이폰앱앱에서 정보를 불러 오고 한다면 역시 이것도
xml화일이 표준적으로 공통으로 사용하고 있는 것

***[LOG-IN]***