我有一个 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);
}