샘플엑셀이 아래의 캡처와 같이 중복으로 동일한 컬럼명(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;
첫 번째로 엑셀을 로드할 때, UseFirstRowAsHeader옵션을 false로 세팅하여 첫 번째 행을 컬럼으로 읽지 않고 Data로 읽도록 변경해서 로드를 합니다. 그럼 첫번째 컬럼열은 자동으로 생성이 되고, 본래의 컬럼명들은 Data로 인식되어 Row로 들어가지게 됩니다.
sourceOptions.UseFirstRowAsHeader = false;
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 컬럼명을 읽으시면 되겠습니다.