【问题标题】:Copy multiple cells from grid to clipboard in excel format?以excel格式将多个单元格从网格复制到剪贴板?
【发布时间】:2012-08-11 17:54:13
【问题描述】:

我正在开发一种工具,该工具连接到 SQL 数据库、获取数据集并在网格中显示该数据。用户必须能够选择一个单元格块(只是矩形)并按 CTRL+C 将其复制到剪贴板。

我该怎么做:

  • 可以粘贴到 Excel 中的格式?我希望已经为此做好了准备。它不需要像 Excel 那样的所有剪贴板功能,只需突出显示一组矩形单元格并将其复制到剪贴板即可。

  • 如果可以在 TStringGrid 中完成,我希望将我的功能保留在其中,但也可以使用支持此功能的组件。

【问题讨论】:

  • @TLama 发布了一个有效的答案(他删除了它,因为他没有安装 Excel 进行测试)。我已经测试过了,希望他能看到这条评论并回来取消删除它。
  • @Ken,感谢您的测试!我已经修复了代码(至少是我发现的)并取消了删除帖子。
  • 我认为要插入 Excel 和大多数平板电脑,必须制作 RTF 或 HTML 表格并将它们复制到剪贴板。 HTML 构建可能更容易。

标签: delphi excel delphi-xe2 clipboard tstringgrid


【解决方案1】:

您可以尝试将单元格值复制为TAB delimited text,类似于以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  S: string;
  X, Y: Integer;
begin
  S := '';
  for Y := StringGrid1.Selection.Top to StringGrid1.Selection.Bottom do
  begin
    for X := StringGrid1.Selection.Left to StringGrid1.Selection.Right - 1 do
      S := S + StringGrid1.Cells[X, Y] + #9;
    S := S + StringGrid1.Cells[StringGrid1.Selection.Right, Y] + sLineBreak;
  end;
  Delete(S, Length(S) - Length(sLineBreak) + 1, Length(sLineBreak));
  Clipboard.AsText := S;
end;

【讨论】:

  • 我要发布一个答案,看到你的,想知道为什么它被删除了。然后我看到了你关于没有 Excel 的注释,所以我几乎只是检查了 Excel 是否会正确地从剪贴板中获取选项卡式文本。确实如此,所以我发布答案对我来说是不公平的。 :-)
  • 问题是关于使用 Ctrl+C 从TStringGrid 复制到剪贴板,然后用户可以将其粘贴到 Excel 范围内。不需要任何其他格式;您的代码可以正常工作。 :-)
  • @Jerry,另一种方法是使用自然 Excel 格式,即 XLS。我根据 Excel 文件format description 找到了this unit。有一个字符串网格的 XLS 导出过程,StringGridToXLS,您可以尝试根据您的目的进行修改(将TXLSWriter.FStream 成员的内容复制到剪贴板而不是文件),但是,我无法验证它...
  • 但制表符分隔的文本几乎是普遍接受的。您可以从记事本复制并粘贴到任何商业文本编辑器等中。您可以将其作为字符串读取,在选项卡上对其进行解析,然后将其放入另一个 StringGrid。使用 Excel 格式将不允许上述任何一项。 (例如,使用 Excel 格式在任何地方都不适合您;您没有 Excel。
  • @Jerry:制表符分隔适用于其他场景。 Excel 特定格式 - 它是 Office 应用程序特定的;制表符分隔适用于 Excel、Word、地球上任何可识别制表符的文本编辑器等。此外,这不是您的问题 - 它会是一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多