如何以编程方式访问从剪贴板复制的select地址

这是我想要达到的:

用户复制一个单元格(或范围),比如说A3,当她点击一个button时,我需要通过编程访问单元格的地址(创build一个链接)。

以文本格式访问剪贴板非常简单:

string clip; if (Clipboard.ContainsText()) clip = Clipboard.GetText(); 

我也发现可以像这样以不同的格式访问剪贴板

 var dataObj = Clipboard.GetDataObject(); var format = DataFormats.CommaSeparatedValue; if (dataObj != null && dataObj.GetDataPresent(format)) { var csvData = dataObj.GetData(format); //... } 

但我不能为我的生活find哪个格式包含链接和如何得到它。 (我循环通过Clipboard.GetDataObject()提供的所有格式。GetFormats(),但一些返回的不可思议的stream,我无法理解。

背景信息:

答:链接必须在那里,因为我可以使用“粘贴链接”,它创build一个绝对的参考

B.我正在使用Excel 2010和VS2010 – Win7下的C#

C.代码在自定义任务窗格中运行

任何帮助感激!


所以,

并感谢所有设法读到这一点的人。 我终于弄明白了。 我的解决scheme仍然很尴尬,因为我无法从剪贴板中获得stream的实际结构,但是我发现我在寻找什么:

  protected override void WndProc(ref Message m) { const int WM_PASTE = 0x0302; var enc = new System.Text.UTF7Encoding(); string buffer, rangeAddress; if (m.Msg == WM_PASTE) { if (Clipboard.ContainsText()) { string clip = Clipboard.GetText(); var dataObject = Clipboard.GetDataObject(); var mstream = (MemoryStream)dataObject.GetData("Link Source", true); if(mstream == null) return; var rdr = new System.IO.StreamReader(mstream, enc, true); buffer = rdr.ReadToEnd(); buffer = StripWeirdChars(buffer); int IndexExcl = buffer.IndexOf("!"); if (IndexExcl >= 0) { rangeAddress = buffer.Substring(IndexExcl + 1, buffer.Length - IndexExcl - 4); // do whatever you want to do with it, eg:Globals.ThisAddIn.Application.ActiveCell.Value = rangeAddress; return; } } } base.WndProc(ref m); } } 

这里的关键显然是GetData的特殊格式:“链接源”。

读取结果stream会产生一个带有许多怪异字符的string,而且还会产生表格名称和复制范围的坐标。 我用直截了当的方式去除怪异的字符

  public static string StripWeirdChars(string source) { string res = ""; foreach (char c in source) if ((int)c >= 32) res += c; return res; } 

还有一些我不能理解的奇怪字符,但是好消息是,在第一个惊叹号之后,你会发现范围的地址(带有一些固定长度的垃圾)。 即使范围是从另一个工作表复制的,即使这个工作表的名称中包含奇怪的字符(如德语元音变音符号),这也是有效的。

那里肯定有更好的解决scheme

通过IStream接口从剪贴板获取Excel范围对象

但是我在那里find的代码并不完整(这些“显而易见”的部分被遗漏了),由于我的无能和缺lessIStream的经验,我无法工作。

任何帮助使用这个得到一个整洁的解决scheme是赞赏,但我满足于我目前所拥有的。 多谢你们。

这只是@drdhk的答案,因为这是在一个评论中要求显示这个答案:

所以,

并感谢所有设法读到这一点的人。 我终于弄明白了。 我的解决scheme仍然很尴尬,因为我无法从剪贴板中获得stream的实际结构,但是我发现我在寻找什么:

  protected override void WndProc(ref Message m) { const int WM_PASTE = 0x0302; var enc = new System.Text.UTF7Encoding(); string buffer, rangeAddress; if (m.Msg == WM_PASTE) { if (Clipboard.ContainsText()) { string clip = Clipboard.GetText(); var dataObject = Clipboard.GetDataObject(); var mstream = (MemoryStream)dataObject.GetData("Link Source", true); if(mstream == null) return; var rdr = new System.IO.StreamReader(mstream, enc, true); buffer = rdr.ReadToEnd(); buffer = StripWeirdChars(buffer); int IndexExcl = buffer.IndexOf("!"); if (IndexExcl >= 0) { rangeAddress = buffer.Substring(IndexExcl + 1, buffer.Length - IndexExcl - 4); // do whatever you want to do with it, eg:Globals.ThisAddIn.Application.ActiveCell.Value = rangeAddress; return; } } } base.WndProc(ref m); } } 

这里的关键显然是GetData的特殊格式:“链接源”。

读取结果stream会产生一个带有许多怪异字符的string,而且还会产生表格名称和复制范围的坐标。 我用直截了当的方式去除怪异的字符

  public static string StripWeirdChars(string source) { string res = ""; foreach (char c in source) if ((int)c >= 32) res += c; return res; } 

还有一些我不能理解的奇怪字符,但是好消息是,在第一个惊叹号之后,你会发现范围的地址(带有一些固定长度的垃圾)。 即使范围是从另一个工作表复制的,即使这个工作表的名称中包含奇怪的字符(如德语元音变音符号),这也是有效的。

那里肯定有更好的解决scheme

通过IStream接口从剪贴板获取Excel范围对象:( http://www.codeproject.com/Articles/149009/Getting-the-Excel-Range-object-from-the-Clipboard

但是我在那里find的代码并不完整(这些“显而易见”的部分被遗漏了),由于我的无能和缺lessIStream的经验,我无法工作。

任何帮助使用这个得到一个整洁的解决scheme是赞赏,但我满足于我目前所拥有的。 多谢你们。

你的方法有一个限制:结果总是一个矩形范围。 如果复制了A1:B2A4:B5 ,则返回A1:B5 ,这意味着第3行包含在结果范围内,实际上,它不是范围的一部分剪贴板。 还有更多的剪贴板数据types包含较less奇怪的字符,比如ObjectLinkLink ,但它们对于非矩形范围具有相同的限制。

在select范围时,可以通过按Ctrl键来select非矩形范围。