2016. 1. 28. 21:58

엑셀 파일을 열고 데이터를 가져오는 것 까지 정리합니다.



절차는 크게 보면 아래 와 같습니다.

1. 파일열기

2. 시트목록 추출

3. 해당시트로 부터 데이터 추출




1. 파일열기

            openDlg1.FileName = "";

            // 변수선언

            string sFileName = "";

            OleDbConnection oleConn = new OleDbConnection();



            // 파일 읽기 다이얼로그 호출. 결과가 취소인 경우 여기서 실행을 멈춘다.

            if (this.openDlg1.ShowDialog() == DialogResult.Cancel)

            {

                return;

            }



            // 파일 읽기 다이얼로그로 부터 파일경로 획득

            if (!this.openDlg1.FileName.Equals(""))

            {

                sFileName = openDlg1.FileName;

            }

            else

            {

                return;

            }



            // xlsx와 xls의 연결 방법이 다르므로 구분하여 적용.

            if (sFileName.IndexOf("xlsx") >= 0)

            {

                // 여기서 오류 날 경우, 오피스 2007 시스템 드라이버를 설치한다.

                // https://www.microsoft.com/ko-kr/download/details.aspx?id=23734


                oleConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + sFileName + @";Extended Properties=Excel 12.0";

            }

            else

            {

                oleConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + sFileName + "; Extended Properties=Excel 8.0;";

            }



            // 오픈~

            oleConn.Open(); 

- openfiledialog 를 사용하여 파일을 선택한다.

- 코드 내 주석에도 있지만, Open() 시 컨넥션 스트링 어쩌고 오류나는 경우가 있다. https://www.microsoft.com/ko-kr/download/details.aspx?id=23734 주소로 부터 시스템 드라이버를 다운받아 설치한다.




2. 시트목록 추출

            // 시트가 여러개 존재할 경우 모든 시트 목록을 만든다.

            DataTable sheetListDT = oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

            string sheetName = "";


            // 시트 목록 돌면서 처리할 내용이 있다면 추가한다. (예: 특정 단어가 포함된 시트 제외 한다던가 뭐 그런 것들...)

            for (int i = 0; i < sheetListDT.Rows.Count; i++)

            {

                // 시트명 표시

                //sheetName = sheetListDT.Rows[i]["TABLE_NAME"].ToString();

                //MessageBox.Show(sheetName);


                // sheetListDT.Rows[i].Delete(); // 예: 시트 제거


            }


            // 변경 내용 반영

            sheetListDT.AcceptChanges(); 

- 시트 목록을 구한다. 일부 필요없는 시트가 있다면 여기서 걸러낸다.




3. 시트로 부터 데이터를 조회

            // 시트로 부터 데이터 조회

            //DataSet tmpDS = new DataSet();

            string sqlStr = "";

            for (int i = 0; i < sheetListDT.Rows.Count; i++)

            {

                sheetName = sheetListDT.Rows[i]["TABLE_NAME"].ToString();

                sqlStr = "SELECT * FROM [" + sheetName + "]";


                OleDbCommand oleCom = new OleDbCommand();

                oleCom.CommandType = CommandType.Text;

                oleCom.CommandText = sqlStr;

                oleCom.Connection = oleConn;


                OleDbDataAdapter oleAdt = new OleDbDataAdapter();


                oleAdt.SelectCommand = oleCom;


                DataTable tmpDT = new DataTable();


                oleAdt.Fill(tmpDT);


                tmpDT.TableName = sheetName;


                //tmpDS = StringMerge(tmpDS, tmpDT, 10);

                dataGridView1.DataSource = tmpDT;

            } 

- 테이터를 DataTable 에 채워 넣는다.

- dataGridView 컨트롤에 뿌리는 것으로 샘플코드는 종료~!!






결과 샘플


실행 예



사용된 엑셀 데이터







Posted by 해비