CODEKILLER

반응형

DevExpress Excel 스키마 처리
DevExpress Excel 스키마 처리

DevExpress Excel 스키마 가져오기

샘플엑셀이 아래의 캡처와 같이 중복으로 동일한 컬럼명(QQ)이 존재한다고 가정해 봅니다.

중복컬럼이 존재하는 엑셀 샘플
중복컬럼이 존재하는 엑셀 샘플

 

엑셀을 ExcelDataSource를 이용하여 오픈을 해둡니다. UseFirstRowAsHeader옵션은 첫 번째 행을 컬럼으로 읽겠다고 하는 옵션입니다. 컬럼을 자동으로 읽게 되면 문제가 발생하는 부분이 있습니다. 바로 동일한 컬럼명이 존재하는 엑셀일 경우에 DevExpress GridControl의 정책에 의해 자동으로 컬럼명이 바뀌게 됩니다.

ExcelDataSource source = new ExcelDataSource();
source.FileName = filePath;

ExcelWorksheetSettings worksheetSettings = new ExcelWorksheetSettings();
worksheetSettings.WorksheetName = "읽으려는 엑셀을 sheet name";

ExcelSourceOptions sourceOptions = new ExcelSourceOptions();
sourceOptions.ImportSettings = worksheetSettings;
sourceOptions.SkipHiddenRows = false;
sourceOptions.SkipHiddenColumns = false;
sourceOptions.SkipHiddenRows = false;
sourceOptions.UseFirstRowAsHeader = true;  // 주의해서 봐야하는 부분
sourceOptions.SkipEmptyRows = true;

DevExpress에서 동일컬럼을 변경함
DevExpress에서 동일컬럼을 변경함

동일 컬럼명 처리방법

첫 번째로 엑셀을 로드할 때, UseFirstRowAsHeader옵션을 false로 세팅하여 첫 번째 행을 컬럼으로 읽지 않고 Data로 읽도록 변경해서 로드를 합니다. 그럼 첫번째 컬럼열은 자동으로 생성이 되고, 본래의 컬럼명들은 Data로 인식되어 Row로 들어가지게 됩니다.

sourceOptions.UseFirstRowAsHeader = false;

컬럼을 Data로 읽기
컬럼을 Data로 읽기

DevExpress에서 엑셀스키마를 가져오거나, 스키마를 저장 및 로드할 수 있습니다. 아래의 코드는 IExcelSchemaProvider를 이용하여 간단하게 엑셀의 스키마를 불러왔습니다. 아래의 코드를 이용하여 자동으로 생성된 컬럼명들을 바꾸어 주면 됩니다. 

IExcelSchemaProvider schemaProvider = source.GetService(typeof(IExcelSchemaProvider)) as IExcelSchemaProvider;
FieldInfo[] availableFields = schemaProvider.GetSchema(source.FileName, null, ExcelDocumentFormat.Xlsx, source.SourceOptions, CancellationToken.None);
source.Schema.Clear();
foreach (FieldInfo field in availableFields)
{
    if (field.Name == "Column1") 
    {
        field.Name = "ColNum";
        field.Type = typeof(string);
    }
    source.Schema.Add(field);
}

 

그리고, 0번째 Row를 Hidden처리를 하면 되겠습니다.

private void GridView1_CustomRowFilter(object sender, DevExpress.XtraGrid.Views.Base.RowFilterEventArgs e)
{
    if (e.ListSourceRow == 0)
    {
        e.Visible = false; // REAL 컬럼정보를 숨겨둠.
        e.Handled = true;
    }
}

 

결과는 아래와 같은 모습이고, 실제 컬럼을 읽어 들이거나 할 때에는 0번째 Row에 숨겨 있는 Real 컬럼명을 읽으시면 되겠습니다.

 

중복컬럼 없이 컬럼명 변경
중복컬럼 없이 컬럼명 변경

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band