删除 DevExpress 电子表格中列中的重复值

Removing duplicate values in a column in DevEpress Spreadsheet

DevEpress 电子表格目前不支持“删除重复项”功能。我想编写一个 C# 代码来手动执行此操作。我有一列值。其中一些是重复的,这些重复值可能相邻也可能不相邻。我想删除相应行的重复值。我试过这段代码:

IWorkbook workbook = spreadsheetControl.Document;
        Worksheet worksheet = workbook.Worksheets["Sheet1"];
        CellRange range = worksheet.GetUsedRange();
        int LastRow = range.BottomRowIndex;
        //MessageBox.Show(Convert.ToString(LastRow));
        for (int i = 0; i < LastRow; i++)
        {
            for (int j = i+1; j < LastRow; j++)
            {
                if (worksheet.Cells[i,0].Value == worksheet.Cells[j,0].Value)
                {
                    worksheet.Rows[j].Delete();
                }
            }
        }

无法正常工作。

It doesn't remove non-adjacent duplicate values.

你的循环中有一个错误。由于 Delete 调用,索引未说明集合正在更改的事实。

通过多次遍历所有行,您也做了比必要更多的工作。

这将创建需要删除的 DevExpress Row 对象列表。而且它只遍历行一次。

//Let's keep track of every value seen as we go through the rows
var valuesSeen = new HashSet<string>();
//Rows marked for deletion
var duplicateRows = new List<Row>();
for (int i = 0; i < LastRow; i++)
{
    string cellValue = worksheet.Cells[i, 0].DisplayText;
    //Returns false if the value already exists
    if (!valuesSeen.Add(cellValue))
    {
        //Mark this row for deletion since we've seen the value before
        duplicateRows.Add(worksheet.Rows[i]);
    }
}
//Delete all marked rows only after we're done identifying them.
foreach (var row in duplicateRows)
    row.Delete();

您可能需要为 Row 指定命名空间,因为它是一个相当常见的 class 名称。

在上面的代码中,我比较的是显示文本(不是实际值)。如果您不想这样,请使用 HashSet<CellValue> 而不是 HashSet<string>

我找到了解决方案:

  IWorkbook workbook = spreadsheetControl.Document;
        Worksheet worksheet = workbook.Worksheets["Sheet1"];
        CellRange range = worksheet.GetUsedRange();
        int LastRow = range.BottomRowIndex;
        //MessageBox.Show(Convert.ToString(LastRow));
        //Let's keep track of every value seen as we go through the rows
        var valuesSeen = new HashSet<CellValue>();
        //Rows marked for deletion
        var duplicateRows = new List<Row>();
        for (int i = 0; i < LastRow+1; i++)
        {
            string cellValue = worksheet.Cells[i, 0].DisplayText;
            //Returns false if the value already exists
            if (valuesSeen.Add(cellValue)==false)
            {
                //Mark this row for deletion since we've seen the value before
                duplicateRows.Add(worksheet.Rows[i]);
            }
        }
        //Delete all marked rows only after we're done identifying them.
        for (int index = duplicateRows.Count-1; index >= 0; index--)
        {
            Row item = duplicateRows[index];
            item.Delete();
        }