C# 在Excel.Range对象中存储元数据

C# 在Excel.Range对象中存储元数据,c#,.net,office-interop,C#,.net,Office Interop,我正在将excel与外部服务集成,该服务涉及从该服务接收数据并在excel中显示。我希望能够将获得的信息存储在Excel.Range对象中。Excel.Range对象是否有可以存储元数据的属性 要澄清,就像在Outlook中一样,Outlook.TaskItem具有ItemProperties,它是一个Outlook.ItemProperty对象。那么在Excel中有类似的东西吗 如果没有,那么存储Excel.Range元数据的最佳方法是什么 编辑: 我需要保存这些元数据信息。因此,如果用户保存

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

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

如果没有,那么存储
Excel.Range
元数据的最佳方法是什么

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

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

以下是一个如何开始的示例:

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(...);
    }
}
类范围列表元数据
{
私有只读列表_rangeList;
公共范围列表元数据()
{
_rangeList=新列表();
}
公共void添加(范围元数据范围元数据)
{
_添加(RangeMatadata);
}
}
类范围元数据
{
公共范围元数据(xl.Range)
{
这个。范围=范围;
}
公共范围元数据(xl.Range,对象值):此(范围)
{
this.RangeValue=值;
}
public xl.Range范围{get;private set;}
公共对象范围值{get;set;}
}
类TestRangeMatadata
{
无效测试()
{
var rangeListMetaData=新rangeListMetaData();
//存储部件
RangeMetaData range=新的RangeMetaData([您的excel单元格],[您的值]);
rangeListMetaData.Add(范围);
//取回零件
rangeListMetaData.FindByRange(…);
rangeListMetaData.FindByValue(…);
rangeListMetaData.FindBySomethingElse(…);
}
}

因为您使用的是互操作,所以需要注意释放COM对象。对于这一点,您可以参考另一篇文章,请参阅我的答案。我不确定是否存在这样的属性,即使我正在开发自己的自定义范围元数据类。这样,你就可以灵活地做任何你需要或以后可能需要的事情

以下是一个如何开始的示例:

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(...);
    }
}
类范围列表元数据
{
私有只读列表_rangeList;
公共范围列表元数据()
{
_rangeList=新列表();
}
公共void添加(范围元数据范围元数据)
{
_添加(RangeMatadata);
}
}
类范围元数据
{
公共范围元数据(xl.Range)
{
这个。范围=范围;
}
公共范围元数据(xl.Range,对象值):此(范围)
{
this.RangeValue=值;
}
public xl.Range范围{get;private set;}
公共对象范围值{get;set;}
}
类TestRangeMatadata
{
无效测试()
{
var rangeListMetaData=新rangeListMetaData();
//存储部件
RangeMetaData range=新的RangeMetaData([您的excel单元格],[您的值]);
rangeListMetaData.Add(范围);
//取回零件
rangeListMetaData.FindByRange(…);
rangeListMetaData.FindByValue(…);
rangeListMetaData.FindBySomethingElse(…);
}
}

因为您使用的是互操作,所以需要注意释放COM对象。关于这一点,你可以参考另一篇文章,见我的答案。因为你需要持久的信息,所以我使用了一种更简单更清晰的方法。 创建一个新的工作表,将其命名为[YourSheetName]Metadata(如果您有多个这样的工作表)。将其设置为VeryHidden(XlSheetVeryHidden不能从Excel中取消隐藏,必须从代码中取消隐藏):

在R1范围的元数据表中保存R1范围的所有元数据。 这样,您的代码将非常简单和清晰

它可能看起来像:

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

因为您需要持久化信息,所以我使用了一种更简单、更清晰的方法。 创建一个新的工作表,将其命名为[YourSheetName]Metadata(如果您有多个这样的工作表)。将其设置为VeryHidden(XlSheetVeryHidden不能从Excel中取消隐藏,必须从代码中取消隐藏):

在R1范围的元数据表中保存R1范围的所有元数据。 这样,您的代码将非常简单和清晰

它可能看起来像:

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

我面临的主要问题是,我希望此元数据保持不变。一旦用户保存、关闭并重新打开工作簿,我需要能够从每个单元格提取元数据。那么,就您的解决方案而言,我应该将这个RangeListMetaData和RangeMetaData保存在哪里?@Furqan Tariq,这是您在问题中没有提到的一个重要信息。我的解决方案没有解决这一点。但是,您可以向前迈出一步,将信息保存在xml、db。。。但现在,我不确定这是否是最好的解决方案。我已经对问题进行了编辑。我现在倾向的解决方案是将信息保存在Excel.Sheet的CustomProperties中。我没有在每个范围对象中存储单独的元数据,而是将所有元数据存储在自定义属性中,并在以后的过程中作为desiredOk进行处理。我不确定您想要实现什么,只是考虑到在打开excel文件之前您将无法查询、获取信息(元数据)。您还可以创建隐藏的工作表,称之为元数据,并存储每个范围所需的任何内容。您可以将excel工作表设置为非常隐藏,这意味着用户将无法取消隐藏它,但只能通过代码取消隐藏。我面临的主要问题是,我希望此元数据保持不变。一旦用户保存、关闭并重新打开工作簿,我需要能够