none
Excel File의 특정 열의 내용을 Combobox로 불러오기 RRS feed

  • 질문

  • 안녕하세요.

    코딩을 하다가 막혔는데 여기서부터 어떻게 해야할 지 모르겠습니다. 아래

    코드를 보시면 내용은 특정 파일을 불러와서 특정 sheet에 있는 열의 내용을

    Combobox로 나타내어 선택하도록 하는것입니다.

    아래와 같이 코딩을 하니 예외처리가 안되었다는 오류 메시지가 뜨는데 어떻게 디버깅을 해야할지

    모르겠습니다.

    **경로는 특성상 지웠습니다.**

    Private Sub Button(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click

            CircuitImg.Image = Image.FromFile(" ") 

            Dim xlApp As Excel.Application
            Dim xlWB As Excel.Workbook
            Dim xlsheet As Excel.Worksheet

            xlApp = New Excel.Application
            xlWB = xlApp.Workbooks.Open(" ")
            xlsheet = xlWB.Worksheets(" ")


            CompoName.DataSource = xlsheet.Rows("K12") '<----Combobox 여기에서 막힘...
            
            xlApp.Visible = True
            'xlWB.Close() : xlApp.Quit()

            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) : xlApp = Nothing
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWB) : xlWB = Nothing
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsheet) : xlsheet = Nothing

    End Sub

    2013년 4월 19일 금요일 오전 8:09

답변

  • Public Class Form1
        Dim DS As System.Data.DataSet
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim openFileDialog As New OpenFileDialog()
            If (openFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK) Then
                MyConnection = New System.Data.OleDb.OleDbConnection( _
                        "provider=Microsoft.Jet.OLEDB.4.0; " & _
                        "data source=" & openFileDialog.FileName & "; " & _
                        "Extended Properties=Excel 8.0;")
                ' Select the data from Sheet1 of the workbook.
                MyCommand = New System.Data.OleDb.OleDbDataAdapter( _
                      "select * from [Sheet1$]", MyConnection)
                DS = New System.Data.DataSet()
                MyCommand.Fill(DS)
                'DataGrid에 뿌리기
                DataGridView1.DataSource = DS.Tables(0)
                'Row기준
                Dim arRow As DataRow() = DS.Tables(0).Select("[제목1]='11'")
                Dim tmpDT1 As New DataTable
                tmpDT1.Columns.Add("Value")
                tmpDT1.Columns.Add("Text")
                For i = 0 To arRow(0).ItemArray.Length - 1
                    Dim tmpDR As DataRow
                    tmpDR = tmpDT1.NewRow
                    tmpDR("Value") = arRow(0)(i).ToString()
                    tmpDR("Text") = arRow(0)(i).ToString()
                    tmpDT1.Rows.Add(tmpDR.ItemArray)
                Next
                ComboBox1.DisplayMember = "Text"
                ComboBox1.ValueMember = "Value"
                ComboBox1.DataSource = tmpDT1
                'Column기준
                Dim tmpDT2 As New DataTable
                tmpDT2.Columns.Add("Value")
                tmpDT2.Columns.Add("Text")
                Dim iRow As New Int32
                iRow = 1
                For i = 0 To DS.Tables(0).Columns.Count - 1
                    Dim tmpDR As DataRow
                    tmpDR = tmpDT2.NewRow
                    tmpDR("Value") = DS.Tables(0).Rows(iRow)(i).ToString()
                    tmpDR("Text") = DS.Tables(0).Rows(iRow)(i).ToString()
                    tmpDT2.Rows.Add(tmpDR.ItemArray)
                Next
                ComboBox2.DisplayMember = "Text"
                ComboBox2.ValueMember = "Value"
                ComboBox2.DataSource = tmpDT2
                MyConnection.Close()
            End If
        End Sub
    End Class

    이런식으로 작업하시면 될것 같습니다. 코딩 편의상 Sheet1 전체를 DataSet으로 읽어와서 가로 세로로 값을 읽었습니다.

    Row기준은 "제목1"인 세로줄을 읽어왔고

    Column기준은 Row=1인 두번째 줄을 가로로 읽어 왔습니다.

    여러가지 경우의 수가 있기때문에 편하신 방법을 찾으시면될것 같습니다.

    참고하세요.

    http://blog.naver.com/goldrushing/130166802538

    에 가시면 프로젝트 첨부해 두었습니다.

    • 편집됨 GoldrushKoreaMVP 2013년 4월 23일 화요일 오전 2:09
    • 답변으로 제안됨 Sungman KOMVP 2013년 4월 24일 수요일 오전 1:24
    • 답변으로 표시됨 Mindprogrammar 2013년 4월 25일 목요일 오전 1:46
    2013년 4월 23일 화요일 오전 1:58

모든 응답

  • Public Class Form1
        Dim DS As System.Data.DataSet
        Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
        Dim MyConnection As System.Data.OleDb.OleDbConnection
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim openFileDialog As New OpenFileDialog()
            If (openFileDialog.ShowDialog() = Windows.Forms.DialogResult.OK) Then
                MyConnection = New System.Data.OleDb.OleDbConnection( _
                        "provider=Microsoft.Jet.OLEDB.4.0; " & _
                        "data source=" & openFileDialog.FileName & "; " & _
                        "Extended Properties=Excel 8.0;")
                ' Select the data from Sheet1 of the workbook.
                MyCommand = New System.Data.OleDb.OleDbDataAdapter( _
                      "select * from [Sheet1$]", MyConnection)
                DS = New System.Data.DataSet()
                MyCommand.Fill(DS)
                'DataGrid에 뿌리기
                DataGridView1.DataSource = DS.Tables(0)
                'Row기준
                Dim arRow As DataRow() = DS.Tables(0).Select("[제목1]='11'")
                Dim tmpDT1 As New DataTable
                tmpDT1.Columns.Add("Value")
                tmpDT1.Columns.Add("Text")
                For i = 0 To arRow(0).ItemArray.Length - 1
                    Dim tmpDR As DataRow
                    tmpDR = tmpDT1.NewRow
                    tmpDR("Value") = arRow(0)(i).ToString()
                    tmpDR("Text") = arRow(0)(i).ToString()
                    tmpDT1.Rows.Add(tmpDR.ItemArray)
                Next
                ComboBox1.DisplayMember = "Text"
                ComboBox1.ValueMember = "Value"
                ComboBox1.DataSource = tmpDT1
                'Column기준
                Dim tmpDT2 As New DataTable
                tmpDT2.Columns.Add("Value")
                tmpDT2.Columns.Add("Text")
                Dim iRow As New Int32
                iRow = 1
                For i = 0 To DS.Tables(0).Columns.Count - 1
                    Dim tmpDR As DataRow
                    tmpDR = tmpDT2.NewRow
                    tmpDR("Value") = DS.Tables(0).Rows(iRow)(i).ToString()
                    tmpDR("Text") = DS.Tables(0).Rows(iRow)(i).ToString()
                    tmpDT2.Rows.Add(tmpDR.ItemArray)
                Next
                ComboBox2.DisplayMember = "Text"
                ComboBox2.ValueMember = "Value"
                ComboBox2.DataSource = tmpDT2
                MyConnection.Close()
            End If
        End Sub
    End Class

    이런식으로 작업하시면 될것 같습니다. 코딩 편의상 Sheet1 전체를 DataSet으로 읽어와서 가로 세로로 값을 읽었습니다.

    Row기준은 "제목1"인 세로줄을 읽어왔고

    Column기준은 Row=1인 두번째 줄을 가로로 읽어 왔습니다.

    여러가지 경우의 수가 있기때문에 편하신 방법을 찾으시면될것 같습니다.

    참고하세요.

    http://blog.naver.com/goldrushing/130166802538

    에 가시면 프로젝트 첨부해 두었습니다.

    • 편집됨 GoldrushKoreaMVP 2013년 4월 23일 화요일 오전 2:09
    • 답변으로 제안됨 Sungman KOMVP 2013년 4월 24일 수요일 오전 1:24
    • 답변으로 표시됨 Mindprogrammar 2013년 4월 25일 목요일 오전 1:46
    2013년 4월 23일 화요일 오전 1:58
  • 정말 많은 도움이 되었습니다. ^^ 감사합니다.

    2013년 4월 25일 목요일 오전 1:46
  • 추가적인 질문이 있습니다. 덕분에 datatable을 이용하여 원하는 data를 불러올수 있었습니다.

    여기에서 엑셀에 있는 그림파일도 label로 불러 올수가 있나요?

    특정셀에 value와 그림이 같이 있는 경우에요..가불 여부만 알려주시면 공부해보도록 하겠습니다.

    2013년 4월 30일 화요일 오전 8:17