2

C#-4.0 と Excel.Interop を使用して .dbf から変換された Excel 97-2003 .xls スプレッドシートがあります。データは列 D に従って日付順に並べ替えられます。

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

ここで、選択した範囲 (画像に表示) を列 G で並べ替えて、空白のセルが選択した範囲の一番下になるようにする必要があります。

画像は正しく表示されていますが、これは入力ソースから取得したデータが正しい順序で入力されたためです。データが正しい順序で入力されていない場合、空のセルが最初から G 列の一番下にない可能性があります。

これは私が持っているもので、D の日付範囲 (1 日) ごとに並べ替えを行います。

    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

私の2番目の質問は、この並べ替えを行った後、選択した範囲から列Gのセルが空白ではない行のみを選択するにはどうすればよいですか? -それらをもう一度並べ替えることができるように。

ありがとうございました。

4

1 に答える 1

1

最終的には、このようにすることができました。

「データグループ」とは、日付ごとにグループ化された列 (D) DATE に同じ値を持つ行のグループです。「タイプ」は実際には関係ありません。それは、私の DataSet.Table[0] に 2 つの可能な値がある列があり、行の値に応じて、行がいずれかで書き込まれるためです。ワークブックの最初または 2 番目のワークシート。

「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 に答える