728x90

꼼꼼하게 테스트 해보느라고 시간이 상당히 걸렸다. 엑셀파일이 이미 열려 있는 경우에는 프로그램에서 실행하지 못하고 에러가 발생할 수 있다. 이 부분을 try { } catch { } 로 처리를 안해주면 문제가 생길 수 있다는 걸 알았다.


Microsoft.ACE.OLEDB.12.0' 공급자는 로컬 컴퓨터에 등록할 수 없습니다.
라는 예외가 발생 했을 경우 불러오려는 엑셀의 형식을 기존에 설치된 드라이버가 인식하지 못할 경우 발생하는 에러다.
http://www.microsoft.com/ko-kr/download/details.aspx?id=13255
에서 설치한 오피스(엑셀)버전을 체크하여 드라이버를 다운로드 받아서 설치해준다.


Microsoft.Jet.OLEDB.4.0 은 32 bit 에서만 동작되므로 빌드할 때 64비트로 하면 에러가 발생한다.

프로젝트 - 속성에서 아래와 같이 변경해주어야 한다.




다.
using System.Data.OleDb; // OLEDB 를 이용한 엑셀 읽기, 수정, 삭제 등 처리 가능

private void btnExcelRead_Click(object sender, EventArgs e)
{
    try
    {
        using (OpenFileDialog dlg = new OpenFileDialog()) // 파일 선택창 객체를 생성
        {
            dlg.Filter = "Excel Files(2007이상)|*.xlsx|Excel Files(97~2003)|*.xls";
            dlg.InitialDirectory = @"C:\test\";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                ImportExcelData_Read(dlg.FileName, dataGridView2); // 메서드를 호출
            }
        }
    }
    catch (Exception ex)  // 엑셀파일이 다른 프로그렘에서 이미 열었거나 에러가 발생하면 에러를 출력해준다.
    {
        MessageBox.Show(ex.Message);
    }           
}

public void ImportExcelData_Read(string fileName, DataGridView dgv)
{
    // 엑셀 문서 내용 추출
    string connectionString = string.Empty;

    if (File.Exists(fileName))  // 파일 확장자 검사
    {
        if (Path.GetExtension(fileName).ToLower() == ".xls")
        {   // Microsoft.Jet.OLEDB.4.0 은 32 bit 에서만 동작되므로 빌드할 때 64비트로 하면 에러가 발생함.
            connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0;", fileName);
        }
        else if (Path.GetExtension(fileName).ToLower() == ".xlsx")
        {
            connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};Extended Properties=Excel 12.0;", fileName);
        }
    }

    DataSet data = new DataSet();

    string strQuery = "SELECT * FROM [Sheet1$]";  // 엑셀 시트명 Sheet1의 모든 데이터를 가져오기
    OleDbConnection oleConn = new OleDbConnection(connectionString);
    oleConn.Open();

    OleDbCommand oleCmd = new OleDbCommand(strQuery, oleConn);
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter(oleCmd);

    DataTable dataTable = new DataTable();
    dataAdapter.Fill(dataTable);
    data.Tables.Add(dataTable);

    dgv.DataSource = data.Tables[0].DefaultView;

    // 데이터에 맞게 칼럼 사이즈 조정하기
    for (int i = 0; i < dgv.Columns.Count; i++)
    {
        dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells);
    }
    dgv.AllowUserToAddRows = false;  // 빈레코드 표시 안하기
    dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
    //dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 화면크기에 맞춰 채우기

    dataTable.Dispose();
    dataAdapter.Dispose();
    oleCmd.Dispose();

    oleConn.Close();
    oleConn.Dispose();
}



소스코드와 다른 코드가 같이 포함된 파일

import_exceldata.cs


블로그 이미지

Link2Me

,