ダブルクォーテーションが含まれる文字列を正しく貼り付けられない

文書番号 : 39433     文書種別 : 不具合     登録日 : 2016/06/16     最終更新日 : 2016/12/07
文書を印刷する
対象製品
SPREAD for WPF 1.0J
状況
修正済み
詳細
ダブルクォーテーションが含まれる文字列をクリップボードから貼り付けると、正しい値で貼り付けられません。クリアされるべきダブルクォーテーションダがそのまま貼り付けられたり、改行位置が不正になるという動作になります。

【例】
  • 「"AA」という文字列は「"AA」と貼り付けられます。正しくは「AA」です。
  • 「A"B(改行)C」という文字は、一つのセル内に貼り付けられます。正しくは二つのセルに「A"B」と「C」という文字が貼り付けられます。
  • 回避方法
    Service Pack 3(v1.0.2016.1207)で修正済みです。
    Service Pack 3(v1.0.2016.1207)より前のバージョンでは次の回避方法が有効です。
    ------------------------------------------

    CsvHelperを使用して回避可能です。
    1. Visual Studioの「プロジェクト」メニューから「NuGetパッケージの管理」を選択します。
    2. [CsvHelper]を検索し、インストールします。
    3. SPREADコントロールのClipboardPastingイベントを次のように実装します。

    ◎サンプルコード(VB)
    Private Sub GcSpreadGrid1_ClipboardPasting(sender As Object, e As ClipboardPastingEventArgs) Handles GcSpreadGrid1.ClipboardPasting
      ' SPREADからSPREADへのコピー&ペーストでは、既定動作を適用します。
      If Clipboard.ContainsData("SpreadGridXml") Or Clipboard.ContainsData("SpreadGridNative") Then
        Return
      End If
      ' 他のアプリケーションからのペースト時の回避コードです。
      e.Handled = True
      Dim Text = Clipboard.GetText()
      Dim rowCount = 0
      Dim colCount = 0
      Using textWriter As New StringWriter
        Using csvWriter As New CsvHelper.CsvWriter(textWriter)
          Using textReader As New StringReader(Text)
            Using csvParser As New CsvHelper.CsvParser(textReader)
              ' TSVフォーマットを使用します。
              csvParser.Configuration.Delimiter = "¥t"
              csvWriter.Configuration.Delimiter = "¥t"

              csvWriter.Configuration.QuoteAllFields = True
              ' ParserからWriterへコピーします。
              While True
                Dim row = csvParser.Read()
                If row Is Nothing Then
                  Exit While
                End If

                rowCount += 1
                colCount = Math.Max(colCount, row.Length)

                For Each item In row
                  csvWriter.WriteField(item)
                Next

                csvWriter.NextRecord()
              End While

              Text = textWriter.ToString()
            End Using
          End Using
        End Using
      End Using

      ' 文字列をSPREADコントロールに設定します。
      GcSpreadGrid1.SetClip(e.CellRange.Row, e.CellRange.Column, rowCount, colCount, Text)
    End Sub

    ◎サンプルコード(C#)
    void gcSpreadGrid1_ClipboardPasting(object sender, ClipboardPastingEventArgs e)
    {
      if (Clipboard.ContainsData("SpreadGridXml") || Clipboard.ContainsData("SpreadGridNative"))
      {
        // SPREADからSPREADへのコピー&ペーストでは、既定動作を適用します。
        return;
      }

      // 他のアプリケーションからのペースト時の回避コードです。
      e.Handled = true;
      var text = Clipboard.GetText();
      var rowCount = 0;
      var colCount = 0;
      using (var textWriter = new StringWriter())
      using (var csvWriter = new CsvWriter(textWriter))
      using (var textReader = new StringReader(text))
      using (var csvParser = new CsvParser(textReader))
      {
        // TSVフォーマットを使用します。
        csvParser.Configuration.Delimiter = "¥t";
        csvWriter.Configuration.Delimiter = "¥t";
        csvWriter.Configuration.QuoteAllFields = true;

        // ParserからWriterへコピーします。
        while (true)
        {
          var row = csvParser.Read();
          if (row == null)
          {
            break;
          }

          rowCount++;
          colCount = Math.Max(colCount, row.Length);

          foreach (var item in row)
          {
            csvWriter.WriteField(item);
          }
          csvWriter.NextRecord();
        }

        text = textWriter.ToString();
      }

      // 文字列をSPREADコントロールに設定します。
      this.gcSpreadGrid1.SetClip(e.CellRange.Row, e.CellRange.Column, rowCount, colCount, text);
    }