none
Excelのセルコメントとしてデータを貼り付けたい RRS feed

  • 質問

  • いつも参考にさせていただいております。

     

    アプリケーション側のデータを、コピー(クリップボード)経由でExcelのセルのコメント(右上に赤ポチがでるもの)として貼り付けたいと考えています。

    アプリケーション側で所望のデータをExcelネイティブなデータ形式であるBIFFフォーマットに変換すれば可能とまでは

    当たりをつけているのですが、変換手順など具体的な実装方法がつかめない状況です。

    このようなプログラムを記述した経験のある方、実装方法をお知りの方からアドバイスをいただければ幸いです。

     

    なお、対象のアプリケーションはWPFアプリケーションになります。

    2010年12月12日 6:04

回答

  • BIFFでできるかは知りませんが、Excel2002以降で良いならクリップボードの形式をXML Spreadsheet(XMLSS)にすると楽です。
    #私はDataGridViewからExcelにコピーするのに、CSVの代わりにフォーマットが維持できるXML Spreadsheet形式のクラスを作って使ってます。

    XML Spreadsheetの情報はMSDN にありますし、クリップボードにセルをコピーしてFormatが"XML Spreadsheet"になっているストリームを読んでみれば、どんな感じか判ると思います。

    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    
    System.Xml.XmlWriterSettings xws = new System.Xml.XmlWriterSettings();
    xws.Encoding = System.Text.Encoding.Default;
    xws.Indent = true;
    xws.NewLineChars = "\r\n";
    xws.NewLineOnAttributes = true;
    xws.OmitXmlDeclaration = false;
    
    System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(ms , xws);
    xw.WriteProcessingInstruction("xml" , @"version=""1.0""");
    xw.WriteProcessingInstruction("mso-application",@"progid=""Excel.Sheet""");
    xw.WriteStartElement("Workbook", @"urn:schemas-microsoft-com:office:spreadsheet");
    {
      xw.WriteAttributeString("xmlns","o","" , @"urn:schemas-microsoft-com:office:office");
      xw.WriteAttributeString("xmlns" , "x","" , @"urn:schemas-microsoft-com:office:excel");
      xw.WriteAttributeString("xmlns" , "ss" ,"", @"urn:schemas-microsoft-com:office:spreadsheet");
      xw.WriteStartElement("Worksheet");
      {
        xw.WriteAttributeString("ss",@"Name" , null , "Sheet1");
        xw.WriteStartElement("Table");
        {
          xw.WriteAttributeString("ss","ExpandedColumnCount" , "" , "1");
          xw.WriteAttributeString("ss" , "ExpandedRowCount" , "" , "1");
          xw.WriteStartElement ("ss","Row" , null);
          {
            xw.WriteStartElement("Cell");
            {
              xw.WriteStartElement("Data");
              {
                xw.WriteAttributeString("ss" ,"Type" , null,"String");
                xw.WriteValue("ABC");
              }
              xw.WriteEndElement();
              xw.WriteStartElement("Comment");
              {
                xw.WriteElementString("Data" , "ss" , "ABCDEFG");
              }
              xw.WriteEndElement();
            }
            xw.WriteEndElement();
          }
          xw.WriteEndElement();
        }
        xw.WriteEndElement();
      }
      xw.WriteEndElement();
    }
    xw.WriteEndElement();
    xw.WriteEndDocument();
    
    xw.Close();
    ms.Position = 0;
    
    System.Windows.Forms.DataObject clip = new System.Windows.Forms.DataObject();
    clip.SetData("Text" , System.Text.Encoding.UTF8.GetString(ms.ToArray()));
    clip.SetData("XML Spreadsheet" , ms);
    System.Windows.Forms.Clipboard.SetDataObject(clip);
    
    2010年12月12日 12:49

すべての返信

  • BIFFでできるかは知りませんが、Excel2002以降で良いならクリップボードの形式をXML Spreadsheet(XMLSS)にすると楽です。
    #私はDataGridViewからExcelにコピーするのに、CSVの代わりにフォーマットが維持できるXML Spreadsheet形式のクラスを作って使ってます。

    XML Spreadsheetの情報はMSDN にありますし、クリップボードにセルをコピーしてFormatが"XML Spreadsheet"になっているストリームを読んでみれば、どんな感じか判ると思います。

    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    
    System.Xml.XmlWriterSettings xws = new System.Xml.XmlWriterSettings();
    xws.Encoding = System.Text.Encoding.Default;
    xws.Indent = true;
    xws.NewLineChars = "\r\n";
    xws.NewLineOnAttributes = true;
    xws.OmitXmlDeclaration = false;
    
    System.Xml.XmlWriter xw = System.Xml.XmlTextWriter.Create(ms , xws);
    xw.WriteProcessingInstruction("xml" , @"version=""1.0""");
    xw.WriteProcessingInstruction("mso-application",@"progid=""Excel.Sheet""");
    xw.WriteStartElement("Workbook", @"urn:schemas-microsoft-com:office:spreadsheet");
    {
      xw.WriteAttributeString("xmlns","o","" , @"urn:schemas-microsoft-com:office:office");
      xw.WriteAttributeString("xmlns" , "x","" , @"urn:schemas-microsoft-com:office:excel");
      xw.WriteAttributeString("xmlns" , "ss" ,"", @"urn:schemas-microsoft-com:office:spreadsheet");
      xw.WriteStartElement("Worksheet");
      {
        xw.WriteAttributeString("ss",@"Name" , null , "Sheet1");
        xw.WriteStartElement("Table");
        {
          xw.WriteAttributeString("ss","ExpandedColumnCount" , "" , "1");
          xw.WriteAttributeString("ss" , "ExpandedRowCount" , "" , "1");
          xw.WriteStartElement ("ss","Row" , null);
          {
            xw.WriteStartElement("Cell");
            {
              xw.WriteStartElement("Data");
              {
                xw.WriteAttributeString("ss" ,"Type" , null,"String");
                xw.WriteValue("ABC");
              }
              xw.WriteEndElement();
              xw.WriteStartElement("Comment");
              {
                xw.WriteElementString("Data" , "ss" , "ABCDEFG");
              }
              xw.WriteEndElement();
            }
            xw.WriteEndElement();
          }
          xw.WriteEndElement();
        }
        xw.WriteEndElement();
      }
      xw.WriteEndElement();
    }
    xw.WriteEndElement();
    xw.WriteEndDocument();
    
    xw.Close();
    ms.Position = 0;
    
    System.Windows.Forms.DataObject clip = new System.Windows.Forms.DataObject();
    clip.SetData("Text" , System.Text.Encoding.UTF8.GetString(ms.ToArray()));
    clip.SetData("XML Spreadsheet" , ms);
    System.Windows.Forms.Clipboard.SetDataObject(clip);
    
    2010年12月12日 12:49
  • 返信が遅くなり申しわけありません。

    なるほど、XML形式がありましたか。BIFFにこだわる必要はないですね。

    ご提示いただいたサンプルコードを今度試してみたいと思います。

     

    お忙しい中のご回答、ありがとうございました。

    2010年12月15日 3:10