본문 바로가기
카테고리 없음

참고

by keisoft 2025. 4. 8.
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;
}