728x90

C# dataGridView 에 엑셀파일을 읽어들일 때 엑셀 파일의 형식인지를 체크하여 엑셀파일이 아닌 것은 사전에 차단하는 기능이 추가된 엑셀 읽어들이는 코드이다.


엑셀 파일 형식 검사하는 코드는 인터넷 서칭하다가 발견했는데 그분의 블로그가 당장은 생각나지 않는다.

형식검사하는 것은 간단하게 파악할 수가 있다.

HEX View 파일(http://link2me.tistory.com/807)을 설치해서 파일을 Drag & Drop 하면 헤더부분에서 엑셀파일인지 아닌지를 판별할 수가 있다.

임의로 다른 파일을 엑셀로 확장자를 변경해도 실제는 엑셀 파일이 아니므로 걸러낼 수가 있다.


형식검사하는 걸 응용하면 Encoding 검사할 수도 있다.


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, dataGridView1); // dataGridView에 데이터를 세팅 메서드 호출
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }           
}

public static DataSet ImportExcelData_Read(string fileName, DataGridView dgv)
{
    // 엑셀 문서 읽어서 dataGridView 에 출력하기
    string connectionString = string.Empty;

    if (File.Exists(fileName))
    {
        int ExcelType = ExcelFileType(fileName);  // 엑셀파일 형식 검사
        switch (ExcelType)
        {
            case (-2): throw new Exception(fileName + "의 형식검사중 오류가 발생하였습니다.");
            case (-1): throw new Exception(fileName + "은 엑셀 파일형식이 아닙니다.");
            case (0):
                connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties='Excel 8.0';", fileName);
                break;
            case (1):
                connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};Extended Properties='Excel 12.0';", fileName);
                break;
        }
    }

    DataSet DS = new DataSet();

    string strQuery = "SELECT * FROM [Sheet1$]";
    OleDbConnection oleDBConn = new OleDbConnection(connectionString);
    oleDBConn.Open();

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

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

    dgv.DataSource = DS.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();

    oleDBConn.Close();
    oleDBConn.Dispose();

    return DS;
}

#region 엑셀파일 형식
public static int ExcelFileType(string XlsFile)
{
    byte[,] ExcelHeader = {
        { 0xD0, 0xCF, 0x11, 0xE0, 0xA1 }, // XLS  File Header
        { 0x50, 0x4B, 0x03, 0x04, 0x14 }  // XLSX File Header
    };

    // result -2=error, -1=not excel , 0=xls , 1=xlsx
    int result = -1;

    FileInfo FI = new FileInfo(XlsFile);
    FileStream fs = FI.Open(FileMode.Open);

    try
    {
        byte[] buffer = new byte[5];
        fs.Read(buffer, 0, 5);
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                if (buffer[j] != ExcelHeader[i, j]) break;
                else if (j == 4) result = i;
            }
            if (result >= 0) break;
        }
    }
    catch
    {
        result = (-2);
    }
    finally
    {
        fs.Close();
    }
    return result;
}
#endregion



블로그 이미지

Link2Me

,