【问题标题】:Storing meta data in an Excel.Range object在 Excel.Range 对象中存储元数据
【发布时间】:2016-03-27 05:32:46
【问题描述】:

我正在将 excel 与外部服务集成,该服务涉及从该服务接收数据并显示在 excel 中。我希望能够将我得到的信息存储在Excel.Range 对象中。 Excel.Range 对象是否有可以存储元数据的属性?

澄清一下,就像在 Outlook 中一样,Outlook.TaskItem 具有 ItemProperties,它是一个 Outlook.ItemProperty 对象。那么Excel 有没有类似的东西呢?

如果不是,那么为Excel.Range 存储元数据的最佳方式是什么?

编辑: 我需要保留这个元数据信息。因此,如果用户保存、关闭然后重新打开工作簿,我需要能够从 Excel.Range 对象(或任何其他属性)中提取此元数据

【问题讨论】:

    标签: c# .net office-interop


    【解决方案1】:

    由于您需要持久化信息,因此我使用了一种更简单、更清晰的方法。 创建一个新的 WorkSheet,将其命名为 [YourSheetName]Metadata 之类的名称(如果您有多个此类)。将其设置为 VeryHidden(xlSheetVeryHidden 无法使用 Excel 取消隐藏,您必须从代码中取消隐藏):

    xl.XlSheetVisibility.xlSheetVeryHidden
    

    将 Range R1 的所有元数据保存在 Range R1 的元数据表中。 这样,您的代码将非常简单明了。

    它可能看起来像:

    Sheet1.Range[row,col].Value = SomeValue;
    Sheet1Metadata.Range[row,col].Value = MetaDataOfSomeValue;
    

    【讨论】:

      【解决方案2】:

      我不确定是否有这样的属性,即使我正在开发自己的自定义范围元数据类。这样,您就可以灵活地做您需要或以后可能需要的任何事情。

      以下是一个开始示例,说明如何做到这一点:

      class RangeListMetaData
      {
          private readonly List<RangeMetaData> _rangeList;
      
          public RangeListMetaData()
          {
              _rangeList = new List<RangeMetaData>();
          }
      
          public void Add (RangeMetaData rangeMetaData)
          {
              _rangeList.Add(rangeMetaData);
          }
      }
      
      
      class RangeMetaData
      {
          public RangeMetaData(xl.Range range)
          {
              this.Range = range;
          }
      
          public RangeMetaData(xl.Range range, object value) : this(range)
          {
              this.RangeValue = value;
          }
      
          public xl.Range Range { get; private set; }
      
          public object RangeValue { get; set; }
      }
      
      class TestRangeMetaData
      {
          void Test()
          {
              var rangeListMetaData = new RangeListMetaData();
      
              // storing part
              RangeMetaData range = new RangeMetaData([Your excel Cells], [You Value]);
              rangeListMetaData.Add(range);
      
              // Retrieve Part
              rangeListMetaData.FindByRange(...);
              rangeListMetaData.FindByValue(...);
              rangeListMetaData.FindBySomethingElse(...);
          }
      }
      

      由于您正在使用互操作,因此您需要小心释放 COM 对象。为此,您可以依赖另一个帖子,请参阅我的答案there

      【讨论】:

      • 我面临的主要问题是我希望这个元数据能够持续存在。一旦用户保存、关闭并重新打开工作簿,我需要能够从每个单元格中提取此元数据。那么,参考您的解决方案,我在哪里保存这个 RangeListMetaData 和 RangeMetaData?
      • @Furqan Tariq,这是您在问题中未提及的重要信息。我的解决方案没有解决这一点。但是,您可以更进一步,将信息保存在 xml、db 中……但是现在,我不确定这是不是最好的解决方案。
      • 我现在已经对问题进行了编辑。我现在倾向于的解决方案是将信息保存在 Excel.Sheet 的 CustomProperties 中。我没有在每个 Range 对象中存储单独的元数据,而是将所有元数据存储在自定义属性中,然后根据需要进行处理
      • 好的,我不确定您要达到什么目的,但请考虑到您在打开 Excel 文件之前无法查询、获取信息(元数据)。跨度>
      • 您还可以创建一个隐藏的工作表,将其称为元数据,并为每个范围存储您需要的任何内容。您可以将excel表格设置为非常隐藏,这意味着用户将无法取消隐藏,只能通过代码
      猜你喜欢
      • 2018-08-20
      • 2013-01-10
      • 2017-12-24
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      相关资源
      最近更新 更多