개발노트

1. [C#] Excel, csv 파일 DataTable로 변환시키기 본문

미분류 노트

1. [C#] Excel, csv 파일 DataTable로 변환시키기

mroh1226 2023. 1. 13. 14:25
반응형

Excel 및 csv 파일을 DataTable로 변환하려면 먼저, 아래와 같이 2가지가 필요합니다.


준비물 1) ExcelDataReader 누겟 설치 (Excel Sheet를 DataSet으로 변환해줌)

ExcelDataReader

 

준비물 2)  OpenFileDialog( 파일열기를 통한 엑셀파일 가져오는 Control)

OpenFileDialog


 

1. DragDrop으로 파일가져오는 메소드

private void gcList1_DragDrop(object sender, DragEventArgs e)
{
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
     string filename = files[0].ToString().Trim();
     if (MessageBox.Show("Excel 파일을 데이터로 변환시키시겠습니까? \n\n" + filename, "Excel 파일 가져오기", MessageBoxButtons.YesNo) == DialogResult.No) return;
     Remove_Columns();

     if (filename.Substring(filename.Length - 4, 4) == ".csv")
     {
           getDataTableFromCsv(filename, false);
     }
     else
     {
           Convert_FileToDataTable(filename);
     }
            
}

 


2. Excel파일을 DataTable로 변환하는 메소드

private void Convert_FileToDataTable(string FileName)
        {
            //엑셀파일인 경우
            FileStream stream = new FileStream(FileName, FileMode.Open, FileAccess.Read);
            IExcelDataReader excelDataReader = ExcelReaderFactory.CreateReader(stream); //버전에 따라 CreateReader,CreateBinaryReader
            if (stream.Position == 0)
            {
                excelDataReader = ExcelReaderFactory.CreateBinaryReader(stream); //버전에 따라 CreateReader,CreateBinaryReader
            }

            DataSet DS_Result = excelDataReader.AsDataSet();
            DataTable DT_Result = DS_Result.Tables[0];
            lb_TableName.Text = DS_Result.Tables[0].TableName;
            lb_Path.Text = stream.Name;
            for (int i = 0; i < DT_Result.Columns.Count; i++)
            {
                DT_Result.Columns[i].ColumnName = DT_Result.Rows[0][i].ToString();
                GridColumn column = gvList1.Columns.AddVisible(DT_Result.Columns[i].ColumnName, DT_Result.Columns[i].ColumnName);
                gvList1.Columns.Add(column);
                gvList1.Columns[i].OptionsColumn.AllowEdit = false;
            }

            DT_Result.Rows[0].Delete();
            DT_Result.AcceptChanges();
            gcList1.DataSource = DT_Result;
            gvList1.BestFitColumns();
        }

 

 


3. .csv파일을 DataTable로 변화하는 메소드

private void getDataTableFromCsv(string FileName, bool isFirstRowHeader)
        {
            //csv파일인경우
            string header = isFirstRowHeader ? "Yes" : "No";
            string pathOnly = Path.GetDirectoryName(FileName);
            string fileName = Path.GetFileName(FileName);
            string sql = @"SELECT * FROM [" + fileName + "]";
            using (OleDbConnection connection = new OleDbConnection(
                @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";Extended Properties=\"Text;HDR=" + header + "\""))
            using (OleDbCommand command = new OleDbCommand(sql, connection))
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
            {
                DataTable DT_Result = new DataTable();
                DT_Result.Locale = CultureInfo.CurrentCulture;
                adapter.Fill(DT_Result);

                for (int i= 0; i <= 11; i++)
                {
                    DT_Result.Rows[0].Delete();
                    DT_Result.AcceptChanges();
                }

                for (int i = 0; i < DT_Result.Columns.Count; i++)
                {
                    DT_Result.Columns[i].ColumnName = DT_Result.Rows[0][i].ToString();
                    GridColumn column = gvList1.Columns.AddVisible(DT_Result.Columns[i].ColumnName, DT_Result.Columns[i].ColumnName);
                    gvList1.Columns.Add(column);
                    gvList1.Columns[i].OptionsColumn.AllowEdit = false;
                }




                gcList1.DataSource = DT_Result;
                gvList1.BestFitColumns();

            }
        }

 

 

Tip) 벌크 카피로 DataTable이 DB에 Insert가 안되거나 NULL값이 들어간다면, 아래와 같이 SqlBulkCopyColumnMapping을 추가해주세요.

SqlBulkCopy sCopy = new SqlBulkCopy();
var mapp = new SqlBulkCopyColumnMapping("Source 칼럼명", "Destination 칼럼명");
sCopy.ColumnMappings.Add(mapp);

- Source 칼럼명       :  DataTable의 칼럼명

- Destination 칼럼명:  Insert할 DB Table의 칼럼명

 

 

감사합니다.

반응형
Comments