如何使用 c# excel interop 读取 excel 自定义文档属性

2024-04-07

我正在尝试检查是否已为 Excel 文件设置自定义文档属性。如果设置了则读取该值。

这是我正在使用的代码,但到目前为止还没有运气。它不会进入 foreach 循环并出来。

var propval = ReadDocumentProperty("TestProp");

private string ReadDocumentProperty(string propertyName)
{
    Office.DocumentProperties properties;
    Excel.Workbook Wb = Globals.ThisAddIn.Application.ActiveWorkbook;
    properties = (Office.DocumentProperties)Wb.CustomDocumentProperties;

    foreach (Office.DocumentProperty prop in properties)
    {
        if (prop.Name == propertyName)
        {
            return prop.Value.ToString();
        }
    }
    return null;
}

Update1:

我找到了用于设置自定义属性的代码。

Excel.Workbook workBk = Globals.ThisAddIn.Application.ActiveWorkbook;

            object oDocCustomProps = workBk.CustomDocumentProperties;
            Type typeDocCustomProps = oDocCustomProps.GetType();

            object[] oArgs = {propertyName,false,
         Microsoft.Office.Core.MsoDocProperties.msoPropertyTypeString,
         propertyValue};

            typeDocCustomProps.InvokeMember("Add", BindingFlags.Default |
                                       BindingFlags.InvokeMethod, null,
                                       oDocCustomProps, oArgs);

这可以很好地设置自定义属性。我不知道如何修改它来读取属性值。


原理是一样的。当需要使用 Office“互操作”时,对如何使用 PInvoke 进行一些研究将会有所帮助。为了使用它,需要充分认识您需要解决的 Office 对象模型的部分:对象、属性或方法以及确切需要哪些参数,因为没有 IntelliSense 可以提供帮助。首先在 VBA 界面中进行测试可以使这变得更容易。

我在测试项目中拥有的以下代码片段演示了如何寻址单个文档属性并读取然后写入其值。请注意,示例代码适用于BuiltInDocumentProperties。这可以更改为CustomDocumentProperties如果这就是所需要的。

    private void btnUpdateCustomDocProp_Click(object sender, EventArgs e)
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
        Excel.Application xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.application");
        Excel.Workbook wb = xlApp.ActiveWorkbook;
        object docProps = wb.BuiltinDocumentProperties;

        object prop = ExistsDocProp("Author", docProps);
        if (prop!=null)
        {
            object oProp = prop;
            Type oPropType = oProp.GetType();
            //read current value
            string propValue = oPropType.InvokeMember("Value",
                BindingFlags.GetProperty | BindingFlags.Default,
                null, oProp, new object[] { }).ToString();

            object oPropValue = "new test author";
            //write new value
            oPropType.InvokeMember("Value",
                BindingFlags.SetProperty | BindingFlags.Default,
                null, oProp, new object[] {oPropValue});

            MessageBox.Show(propValue + ", " + oPropValue.ToString());         
        }
    }

    private object ExistsDocProp(string propName, object props)
    {
        Office.DocumentProperty customDocProp = null;
        Type docPropsType = props.GetType();
        object nrProps;
        object itemProp = null;
        object oPropName;

        nrProps = docPropsType.InvokeMember("Count",
            BindingFlags.GetProperty | BindingFlags.Default,
            null, props, new object[] { });
        int iProps = (int)nrProps;

        for (int counter = 1; counter <= ((int)nrProps); counter++)
        {
            itemProp = docPropsType.InvokeMember("Item",
                BindingFlags.GetProperty | BindingFlags.Default,
                null, props, new object[] { counter });

            oPropName = docPropsType.InvokeMember("Name",
                BindingFlags.GetProperty | BindingFlags.Default,
                null, itemProp, new object[] { });

            if (propName == oPropName.ToString())
            {
                break;
            }
        }
        return itemProp; 
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 c# excel interop 读取 excel 自定义文档属性 的相关文章

  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • is_integral 与 is_integer:其中之一是多余的吗?

    是积分 http en cppreference com w cpp types is integral and 是整数 http en cppreference com w cpp types numeric limits is inte
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • C# 并行与并行线程代码性能

    我一直在测试 System Threading Parallel 与线程的性能 我很惊讶地发现并行比线程花费更长的时间来完成任务 我确信这是由于我对并行的了解有限 我刚刚开始阅读 我想我会分享一些片段 如果有人可以向我指出并行代码比线程代码
  • 比较 LINQ to SQL 中的两个日期

    我有一个数据库 其中有一个名为会议的表 会议日期使用以下格式存储在此表中 May 2nd 2011 例如 格式为5 2 2011 我的要求是获取两个日期 例如 2011 年 4 月 25 日和 2011 年 5 月 2 日 之间的会议 并编
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • 多维数组和指向指针的指针

    创建多维数组时char a 10 10 根据我的书 它说你必须使用类似于char a 10 将数组传递给函数 为什么必须这样指定长度 您不是只是将双指针传递给 with 并且该双指针不是已经指向分配的内存吗 那么为什么参数不能是char a
  • 函数指针上的未知类型 F TYPE

    include
  • 如何在 apache poi 中找到包含图片的单元格

    我尝试在 xls 文档中循环图像 我写下一个代码 HSSFPatriarch patriarch sheet getDrawingPatriarch if patriarch null Loop through the objects fo
  • Nuget - 对象引用未设置为对象的实例

    我在 vs 2015 中遇到了 nuget 包管理器的问题 像Unity这样的一些包已经安装没有问题了 某些软件包 例如 EF 在安装时出现问题 像 Automapper 这样的一些软件包也有同样的问题 但是当我安装这个软件包的另一个版本时
  • 为什么我无法调试动态加载的程序集?

    我正在开发一个 Web API 项目 该项目使用内部模拟框架 允许拦截和修改来自控制器的响应 它使用 MEF 加载包含某些先决条件匹配时执行的代码的程序集 我知道这是正常工作的 因为我可以在响应中看到模拟已被执行 但由于某种原因我无法调试动
  • C 中的链表数组:初始化和插入?

    我需要创建一个链表数组 如图所示 这就是我到目前为止所做的 typedef struct Node int data struct Node next Node int main void Node link 5 for int q 0 q
  • C++:LPWSTR 在 cout 中打印为地址

    我有一个类型变量LPTSTR 我打印到std cout with lt lt 在 ANSI 系统中 不知道它是在哪里确定的 它工作得很好 它打印了字符串 现在 在 Unicode 系统中 我得到的是十六进制地址而不是字符串 那么 为什么LP
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 生成范围 [min,max] 内的随机数 [重复]

    这个问题在这里已经有答案了 我正在使用 C 生成范围 min max 内的整数随机数 我在用 int random int int min int max return min rand max min 但我认为上面的代码适用于范围 min
  • 是否可以编写一个在另一个 Windows 应用程序中选择文本时收到通知的 Windows 应用程序?

    我很好奇是否可以编写一个程序来监视我的文本选择 一种可能的用途是编写一个与编辑器 IDE 无关的代码格式化程序 应用程序 服务 P 启动并以某种方式挂接到窗口中 以便在任何窗口中选择文本时收到通知 启动其他一些应用程序 A 用户选择 A 中
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • Ruby - 如何将消息长度表示为 2 个二进制字节

    我正在使用 Ruby 并且正在与一个网络端点进行通信 该端点需要在发送消息本身之前格式化 标头 标头中的第一个字段必须是消息长度 它被定义为网络字节顺序中的 2 个二进制字节消息长度 例如 我的消息长度是1024 如何将 1024 表示为二
  • 使用 group_by 完成列并完成

    我在使用 dplyr 时遇到了一些问题group by功能 执行此操作后 datasetALL gt group by YEAR Region gt summarise count number n 这是结果 YEAR Region cou
  • addEventListener 仅在页面刷新时工作?

    我正在修改两个下拉列表的外观 这里没有问题 一切都很好 唯一的问题是addEventListener该方法仅在页面刷新时有效 如何使此代码在页面加载时工作而无需点击刷新按钮 window addEventListener load func
  • 输入中每 4 个字符后插入破折号

    我想在输入中每四个字符后插入一个破折号 我有一个信用卡输入框 当用户输入并到达每个第 4 个字符时 jQuery 将插入一个连字符 例如 1234 5678 1234 1231 UPDATE 我正在尝试一些代码 我认为我非常接近正确的代码
  • 具有模糊轮廓的单张多边形

    我正在寻找一种方法来获得传单多边形的模糊 模糊 渐变轮廓 这应该有助于使国家 地区轮廓更加简单 目前 当您放大代表国家 地区的 svg 时 它会变得丑陋 不准确 我正在考虑将 CSS 属性附加到 svg 上 类似于这样 http www w
  • 计算组平均值,同时排除每个案例的个体值

    我有一个包含 70 个案例 研究参与者 的数据集 是否有一个函数可以计算这 70 个案例的平均值 以便分析中不包含每个单独的案例 这看起来像 mean for case x value 1 value n value x n 任何信息都会有
  • CSS 100% 宽度,每 20px 步长

    是否可以在纯CSS中设置一些宽度变化的步骤 假设我的 div 宽度为 100 所以当容器为 30px 时 它的宽度将为 30px 但是是否可以将一些 跳跃 设置为 20px 这样当容器为 30px 时 它仍然是 20px 但是当容器为 40
  • 使用 EaselJS 的无限画布

    有没有办法用 EaselJS 显示无限画布 我已经阅读了使用 Javascript 或 JQuery 执行此操作的方法 但是有什么方法可以使用 EaselJS 进行管理吗 Thanks 您可以使用 JavaScript jQuery 拖放画
  • Meteor 登录服务未配置

    我正在使用 Meteor loginWithFacebook 来让用户访问我的应用程序 代码是 Meteor loginWithFacebook loginStyle redirect function err if err throw e
  • 简单的倒计时器打字稿

    我的构造函数中有以下代码 constructor for let i 0 i lt 90 i setTimeout gt this counter this counter 1 1000 我真正想要的是显示一个倒计时 90 秒的数字 现在它
  • 如何在 UML 活动图上显示异步操作

    我即将绘制 记录一些客户端 服务器连接建立代码 以更好地理解它 有几个操作是在单独的线程中异步完成的 连接线程 数据接收线程等 我应该在单独的图表上显示它们吗 我更愿意将其放在单个图表上以掌握整体视图 但不知道如何在活动图上表示它 我不确定
  • 如何将本地 html 文件加载到 NativeScript webview 中

    我修改了 webpack config js 以添加一个名为 index html 的本地文件 代码如下 new CopyWebpackPlugin from glob index html from glob fonts from glo
  • AWS Cognito 托管 UI 在 URL 中返回 id_token

    我正在使用 AWS Cognito 的托管 UI 进行用户登录 id 令牌作为 URL 的一部分返回 如中所述https docs aws amazon com cognito latest developerguide cognito u
  • 实体框架中添加的多个实体可能具有相同的主键

    我正在使用 EF 4 0 的项目中工作 The Employee表有一列ReferEmployeeID其中包含在系统中引用新员工的员工的员工 ID 所以Employee是一个自引用表 现在 如果一个未添加到系统中的员工要添加 并且他还引用了
  • 如何抑制命令的错误消息?

    如何抑制 shell 命令的错误消息 例如 如果只有jpg目录中的文件 正在运行ls zip给出错误消息 ls zip ls cannot access zip No such file or directory 是否有一个选项可以抑制此类
  • 根据另一个列表从列表中过滤元素[重复]

    这个问题在这里已经有答案了 我想在Java 8 我有一个Boolean清单和另一个Object列表 这两个列表的大小始终相同 我想从中删除所有元素object列表 其中有false在相应的索引处boolean list 我将尝试用一个例子来
  • WPF datagrid 选定行单击事件?

    我想在双击 WPF DataGrid 的选定行时执行一些代码 我知道数据网格有一个 MouseDoubleClicked 事件 并且它还有一个行选定事件 但我没有看到任何 选定行双击 事件 您认为有可能以某种方式捕捉到这一事件吗 您可以在中
  • ModuleNotFoundError:没有名为“MySQLdb”的模块

    在完成我的一个 Flask 项目后 我像其他人一样将其上传到 github 上 2 3 个月后 我将整个 githube 存储库下载到另一台机器上来运行它 但是 该应用程序无法运行 因为找不到软件包 并显示以下消息 ModuleNotFou
  • 未找到 Hadoop 命令

    我已经在 Linux 机器上安装并配置了 hadoop 现在我正在尝试运行示例 MR 作业 我已经通过命令 usr local hadoop bin start all sh 启动了 hadoop 输出为 namenode running
  • 如何使用 c# excel interop 读取 excel 自定义文档属性

    我正在尝试检查是否已为 Excel 文件设置自定义文档属性 如果设置了则读取该值 这是我正在使用的代码 但到目前为止还没有运气 它不会进入 foreach 循环并出来 var propval ReadDocumentProperty Tes