var createdIndexes = new List<int>();
var updatedIndexes = new List<int>();
for (int i = 0; i < sheet.NumRows; i++)
{
var heading = sheet.Rows.GetHeading(i);
if (heading == "C")
createdIndexes.Add(i);
else if (heading == "U")
updatedIndexes.Add(i);
}
private List<dynamic> ExtractDataFromSheet()
{
var result = new List<dynamic>();
var colCount = sheet.NumCols;
var rowCount = sheet.NumRows;
// 컬럼 이름 가져오기
var columnNames = sheet.Columns.GetHeadings(0, colCount - 1).ToList();
for (int row = 0; row < rowCount; row++)
{
dynamic rowData = new System.Dynamic.ExpandoObject();
var dict = (IDictionary<string, object>)rowData;
for (int col = 0; col < colCount; col++)
{
var value = sheet.Cells.GetValue(row, col);
var columnName = columnNames[col];
dict[columnName] = value;
}
result.Add(rowData);
}
return result;
}
private List<dynamic> ExtractDataFromSheetWithIndex()
{
var result = new List<dynamic>();
int colCount = sheet.NumCols;
int rowCount = sheet.NumRows;
// 컬럼 헤더 가져오기
var columnNames = sheet.Columns.GetHeadings(0, colCount - 1).ToList();
for (int row = 0; row < rowCount; row++)
{
dynamic rowData = new System.Dynamic.ExpandoObject();
var dict = (IDictionary<string, object>)rowData;
dict["Index"] = row; // ← 여기서 Index 추가
for (int col = 0; col < colCount; col++)
{
string colName = columnNames[col];
var value = sheet.Cells.GetValue(row, col);
dict[colName] = value;
}
result.Add(rowData);
}
return result;
}
// 시트 크기 재설정
var columnNames = ((IDictionary<string, object>)sortedData.First()).Keys.ToList();
sheet = new Sheet(sortedData.Count, columnNames.Count);
// 헤더 설정
for (int i = 0; i < columnNames.Count; i++)
{
sheet.Columns.SetHeadings(i, i, columnNames[i]);
}
// 값 변환
var dataValues = sortedData
.Select(row => ((IDictionary<string, object>)row)
.Values.Select(v => ConvertToCellValue(v)).ToArray())
.ToArray();
// 값 입력
sheet.Cells.SetValues(0, 0, dataValues);
var data = ExtractDataFromSheetWithIndex();
// 정렬 수행
var sortedData = data
.OrderBy(d => ((IDictionary<string, object>)d)["ProductName"])
.ThenByDescending(d => ((IDictionary<string, object>)d)["Price"])
.ToList();
// ✅ RowIndex 다시 매기기
for (int i = 0; i < sortedData.Count; i++)
{
var row = (IDictionary<string, object>)sortedData[i];
row["Index"] = i + 1; // or "RowIndex"
}
// 다시 sheet에 바인딩
RebindSheet(sortedData);
void RebindSheet(List<dynamic> data)
{
var colNames = ((IDictionary<string, object>)data.First()).Keys.ToList();
var sheet = new Sheet(data.Count, colNames.Count);
// 컬럼 헤더
for (int i = 0; i < colNames.Count; i++)
sheet.Columns.SetHeadings(i, i, colNames[i]);
// 셀 값 설정
var values = data
.Select(row => ((IDictionary<string, object>)row)
.Values.Select(ConvertToCellValue).ToArray())
.ToArray();
sheet.Cells.SetValues(0, 0, values);
// sheet 교체 후 다시 렌더링 or 바인딩 처리
this.sheet = sheet;
}