2

我有一个使用 C#-4.0 和 Excel.Interop 从 .dbf 转换的 Excel 97-2003 .xls 电子表格。数据根据 D 列按日期排序。

http://www.tiikoni.com/tis/view/?id=af4cf69

现在我需要按 G 列对所选范围(如图所示)进行排序,以便空白单元格位于所选范围的底部。

该图像正确显示它,但这只是因为从输入源检索到的数据以正确的顺序输入。如果数据没有按正确的顺序输入,那么空白单元格可能不会从一开始就位于 G 列的底部。

这就是我所拥有的,对每个 D 日期范围(一天)进行排序。

    Range incasariSortRange;
    Range sRange;
    int startDateRowIndex = 6; // index of row where a D date starts
    int endDateRowIndex = 6; // index of row where the same D date ends

    public void selectGroupRange()
    {
        for (int r = startDateRowIndex; r < rowIndex; r++)
        {
            if (worksheet.Cells[endDateRowIndex, 4].Value == worksheet.Cells[r, 4].Value)
            {
                endDateRowIndex = r;
            }
            else
            {
                incasariSortRange = worksheet.get_Range("B" + startDateRowIndex, "H" + endDateRowIndex);
                sRange = incasariSortRange.get_Range("G" + startDateRowIndex, "G" + endDateRowIndex);

                // Sort the first 'D' date range's row by wether the cells in column 'G' 
                //of that range have any values (to be the first ones) or not (to be the last ones).
                incasariSortRange.Sort(sRange, XlSortOrder.xlAscending,
                    Type.Missing, Type.Missing, XlSortOrder.xlAscending,
                    Type.Missing, XlSortOrder.xlAscending, XlYesNoGuess.xlNo, Type.Missing,
                    Type.Missing, XlSortOrientation.xlSortColumns, XlSortMethod.xlPinYin, XlSortDataOption.xlSortNormal,
                    XlSortDataOption.xlSortNormal, XlSortDataOption.xlSortNormal);

                // Set the start and end (date) row indexes to the same so the incasariSortRange will be one row only.
                startDateRowIndex = r; // set the start to a new date
                endDateRowIndex = r; // set the end to the same new date
            }
        }
    }

'rowIndex' 是电子表格中最后一行数据之后的行的索引号。

但如此处所示,它对行进行排序,以便 G 列中的空白单元格到达所选范围的顶部。

http://www.tiikoni.com/tis/view/?id=ea48320

我的第二个问题是,在进行此排序后,如何从所选范围中仅选择 G 列中的单元格不为空白的行?- 这样我就可以再次对它们进行排序。

谢谢你。

4

1 回答 1

1

最后我设法做到了这样。

“数据组”是一组在 DATE 列中具有相同值的行,按天分组。“类型”并不真正相关,这只是因为在我的 DataSet.Table[0] 中有一个列,其中有两个可能的值,根据行中的值,该行将被写入工作簿中的第一个或第二个工作表。

“Incasari”是我用来排序的列。像这样,符号、数字、小写字母、大写字母,然后是空格或空字符串;并且该列只有符号、数字、小写字母和空格/空字符串。

var sortedDataGroup = datagroup.OrderBy(row =>
{
    var wrapper = new DataRowWrapper(row, type);

    if (wrapper.Incasari != null)
        return wrapper.ContCor.ToLower();
    else
        return "A"; // Capital letters are after lower case letters
});

这可能不是解决此排序问题的最佳方法,但我找不到更好的方法。

于 2012-09-07T12:43:17.597 回答