0

我有一个 Excel 加载项,它将创建一个表,其中一列有这个 HYPERLINK 公式:

=HYPERLINK(CONCATENATE("https://www.example.org/",[id]),[id])

当用户复制包含此公式的单元格并将其粘贴到另一个工作表中时,他们会得到:

=HYPERLINK(CONCATENATE("https://www.example.org/",ListObject1[id]),ListObject1[id])

因此,假设他们从第一个工作表的第一行复制一个单元格,并将其粘贴到另一个工作表的第 5 行,由于引用了公式,他们将获得第一个工作表的第 5 行的值。

不幸的是,这不是故意的。用户期望的是得到他们复制的值,而不是公式。那么,如何确保用户在执行粘贴操作时获得的是超链接值而不是公式?

不幸的是,“粘贴为值”不起作用,因为我们将丢失超链接。

现在,我正在尝试研究是否有任何方法可以编辑剪贴板数据以删除公式并在剪贴板数据中插入超链接值,以便用户在粘贴时获得超链接数据。

到目前为止,它不起作用。我修改了剪贴板数据对象中的“XML 电子表格”,但它不起作用,可能还有一些我需要修改的东西。

感谢您提供解决此问题的任何帮助或建议。

谢谢!

编辑:

这是我尝试从剪贴板数据中的“XML 电子表格”中删除“ss:Formula”的代码。“ss:Formula”存储单元格公式,所以我认为如果我删除它,用户在粘贴时会得到准确的值,而不是得到公式。

            var dataObject = Clipboard.GetDataObject();
            var newDo = new DataObject();
            foreach (var format in dataObject.GetFormats())
            {
                try
                {
                    var value = dataObject.GetData(format);
                    newDo.SetData(format, value);
                }
                catch (Exception e)
                {
                   Logger.Debug(e);
                }
            }

            var xmlSpreadsheetClipboardData = Clipboard.GetData("XML Spreadsheet");
            if (xmlSpreadsheetClipboardData != null)
            {
                // Read the data and extract the workbook name, worksheet name, and cell.
                var memoryStream = (MemoryStream) xmlSpreadsheetClipboardData;
                var reader = new StreamReader(memoryStream, new System.Text.UTF7Encoding(), true);
                var xml = reader.ReadToEnd().Replace("\0", "");
                var xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(xml);
                var node = xmlDoc.SelectSingleNode("/Workbook/Worksheet/Table");
                var worksheetXmlElementList = xmlDoc.GetElementsByTagName("Worksheet");
                var worksheetXmlElement = worksheetXmlElementList[0] as XmlElement;
                var tableXmlElement = worksheetXmlElement.GetElementsByTagName("Table")[0] as XmlElement;
                var rowXmlElement = tableXmlElement.GetElementsByTagName("Row")[0] as XmlElement;
                var cellXmlElement = rowXmlElement.GetElementsByTagName("Cell")[0] as XmlElement;
                cellXmlElement.Attributes.RemoveNamedItem("ss:Formula");
                newDo.SetData("XML Spreadsheet", xmlDoc.InnerXml);
                Clipboard.SetDataObject(newDo);
            }
4

2 回答 2

0

这就是 Excel 的构建方式。如果您想否决可以通过按 ctrl C 复制公式。并且要粘贴它的位置按 ctr+alt+V 而不是仅选择 tekst。

如果您想在 C# 中解决它,也许您可​​以使用其中的函数将行设置为不可见。并把这个无形记录的价值放在一边。如果您想在 excel 中复制一个值,请使用类似: https ://stackoverflow.com/a/24555571/5713884

于 2017-10-27T09:16:20.367 回答
0

如果您可以创建一个新列,那么您可以使用 VBA 将链接转换为您可以复制的 url。

Sub ExtractHL()
Dim HL As Hyperlink
    For Each HL In ActiveSheet.Hyperlinks
        HL.Range.Offset(0, 1).Value = HL.Address
    Next
End Sub

https://answers.microsoft.com/en-us/office/forum/office_2007-excel/remove-friendlyname-from-hyperlink-via-function-or/3ccec10d-d7cc-4c56-a9a3-9e13aeda77e1

或者您可以跳过第二列计划并仅使用 offset(0,0) 并将当前单元格中的链接替换为 URL。这个宏可以通过一个按钮运行,也许您可​​以编辑它以将 URL 复制/粘贴到用户的其他工作表,并将链接保留在其原始位置。

如果仅使用 Excel,我认为 VBA 是您唯一的解决方案。

于 2017-10-27T09:49:38.017 回答