我正在使用VSTO创建Excel加载项。此附加组件从sql-server检索并显示大量数据。这很好用,但后来我打算访问excel中的一些数据并以某种方式修改它。我的问题是我需要一种对我想要修改的单元格进行分类的方法。有没有办法将元数据添加到单元格中以了解它是否是应该修改的单元格?例如。向该单元格添加属性,例如“editable_cell”,并执行类似Excel.FindCellsWithAttribute(“editable_cell”)的操作来查找被搜索的单元格?
谢谢!
答案 0 :(得分:8)
有几种方法可以做到这一点。我不知道您的具体要求,因此我将简要介绍一些解决方案。
创建命名范围,但如果不正确,添加/删除数据会影响定义的命名范围。有时,最好将名为range的单个单元格定义为书签,然后“select range”将为您提供所有数据。
创建样式。将此样式应用于您要“查找”的每个数据单元格。定义一个返回Range基数的方法,单元格具有指定的样式。
创建一个PivotCache
对象。此对象具有更新自身的能力,并减小文件大小,尤其是在工作簿中重复使用缓存时。它也是解决工作表中行数限制的一种方法。
创建一个列表。这有许多优点。您可以随意添加/删除数据。添加/删除列。将列表视为表格。
使用XML映射(http://msdn.microsoft.com/en-us/library/aa203737(office.11).aspx)作为“code4life”提及。
如果工作簿是XMLSS,则定义新的命名空间,并使用命名空间中的属性装饰单元格。然后,您可以使用XPath“查询”。这是非常强大的,因为您可以将任何需要的内容嵌入到工作簿中。
每个都有其优点/缺点。我多次使用过每个解决方案。
答案 1 :(得分:3)
AMissico列出了一些非常好的解决方案。我想补充一个对我有用的东西:
在C#(ExcelDNA / VSTO)或VBA中,您可以执行以下操作:
var app = (Application) ExcelDnaUtil.Application;
app.ActiveCell.AddComment("This is an editable cell");
明显的缺点是用户可以看到这个评论 - 在我的情况下它很好用,因为我可以为用户提供有用的诊断,并且还解析相同的文本以获得我想要的元数据。 / p>
您还可以使用以下方式隐藏评论:
app.DisplayCommentIndicator = XlCommentDisplayMode.xlNoIndicator;
但请注意,这会隐藏所有评论,而不仅仅是您添加的评论。要迭代工作表中的注释,您可以使用以下内容:
var comments = ((Worksheet)app.ActiveSheet).Comments;
foreach(Comment comment in comments)
{
var text = comment.Text();
// do something...
}
答案 2 :(得分:0)
我不记得有办法完全按照你的要求去做。 我过去看到过的是根据您可能想要查找的内容设置范围名称。另一种选择是隐藏它旁边的单元格或一些其他预定的偏移量(例如,总是向右3个单元格,或者在隐藏页面上相同的位置)。隐藏的单元格/页面将包含您要查找的数据。
在我曾经工作的会计师事务所中,似乎偶然出现的一件事是您应该将所有数据推送到一个隐藏的“丑陋”页面,并使用公式/查找来引用您的数据。通过这种方式,您可以更新“丑陋”的页面并了解数据的位置,同时拥有一个“漂亮的页面”,用户可以根据自己的内容进行操作。
答案 3 :(得分:0)
答案 4 :(得分:0)
您可以在CustomXMLPart中的工作簿级别嵌入元数据。 customXMLpart可以存储序列化字典。字典可以将单元格地址存储为键,将相应的元数据存储为值。
添加自定义xml部分:http://msdn.microsoft.com/en-us/library/bb608612.aspx
请注意,这仅适用于xls和xlsx文件格式。