2014年4月6日日曜日

[WPF][C#]ExcelデータからDataGridへコピー&ペースト

Excelデータやタブ区切りのテキスト文字列などを DataGrid コントロールに貼付ける処理の実装例です。

    /// <summary>
    /// キーダウンイベント
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void dataGrid_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.V)
        {
            if (Keyboard.Modifiers == ModifierKeys.Control)
            {
                var dataGrid = sender as DataGrid;
                if (dataGrid != null)
                {
                    pasteClipboard(dataGrid);
                }
            }
        }
    }
    /// <summary>
    /// クリップボード貼り付け
    /// </summary>
    /// <param name="dataGrid"></param>
    private void pasteClipboard(DataGrid dataGrid)
    {
        try
        {
            // 張り付け開始位置設定
            var startRowIndex = dataGrid.ItemContainerGenerator.IndexFromContainer(
                (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem
                (dataGrid.CurrentCell.Item));
            var startColIndex = dataGrid.SelectedCells[0].Column.DisplayIndex;

            // クリップボード文字列から行を取得
            var pasteRows = ((string)Clipboard.GetData(DataFormats.Text)).Replace("\r", "")
                .Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);

            var maxRowCount = pasteRows.Count();
            for (int rowCount = 0; rowCount < maxRowCount; rowCount++)
            {
                var rowIndex = startRowIndex + rowCount;

                // タブ区切りでセル値を取得
                var pasteCells = pasteRows[rowCount].Split('\t');

                // 選択位置から列数繰り返す
                var maxColCount = Math.Min(pasteCells.Count(), dataGrid.Columns.Count - startColIndex);
                for (int colCount = 0; colCount < maxColCount; colCount++)
                {
                    var column = dataGrid.Columns[colCount + startColIndex];

                    // 貼り付け
                    if (!byteFiled.Contains(column.Header.ToString()))
                    {
                        column.OnPastingCellClipboardContent(dataGrid.Items[rowIndex], pasteCells[colCount]);
                    }
                }
            }

            // 選択位置復元
            dataGrid.CurrentCell = new DataGridCellInfo(
                dataGrid.Items[startRowIndex], dataGrid.Columns[startColIndex]);
        }
        catch
        {
        }
    }



途中、byteField というのが出てきますが、バイト配列型の所を貼付けようとすると Validation エラーになってしまうので、AutoGeneratingColumn でバイト配列型のカラム名のリストを保持して、無視するようにしています。

MVVM で実装されている場合は Behavior で KeyDown イベントを引っ掛けてあげれば OK です。

    /// <summary>
    /// アタッチ
    /// </summary>
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.KeyDown += dataGrid_KeyDown;

    }





0 件のコメント:

コメントを投稿