Excel - 复制并粘贴没有公式

时间:2017-10-27 09:06:38

标签: c# excel hyperlink clipboard clipboarddata

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

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

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

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

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

不幸的是,这不是故意的。用户期望获得他们复制的值,而不是公式。那么,我该怎么做才能确保当用户执行粘贴操作时,他们将获得超链接值而不是公式?

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

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

到目前为止它还没有用。我修改了剪贴板数据对象中的“XML Spreadsheet”,但它没有用,可能还有其他一些我需要修改的东西。

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

谢谢!

编辑:

这是我试图从剪贴板数据中的“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);
            }

2 个答案:

答案 0 :(得分:0)

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

如果你想用C#解决它 也许你可以用它中的函数设置行不可见。 并显示这个不可见记录的价值。 如果要在excel中复制值,请使用以下内容: https://stackoverflow.com/a/24555571/5713884

答案 1 :(得分:0)

如果您可以创建新列,则可以使用VBA将链接转换为您可以复制的网址。

{{1}}

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是唯一的解决方案。