【问题标题】:Programmatically Edit Excel Drop-Down Items以编程方式编辑 Excel 下拉项
【发布时间】:2013-08-29 10:06:06
【问题描述】:

我有成千上万个 Excel 文件,它们都是由同一个模板制作的。每个都有日期、零件编号和工程师等参数列。工程师单元格设置为下拉列表,因此用户只能输入某些工程师的姓名。当我们想要添加新工程师或摆脱已离开的工程师时,我们目前根据需要更改 Microsoft 脚本编辑器中的名称列表:

<x:DataValidation>
     <x:Range>$D$19:$D$37</x:Range>
     <x:Type>List</x:Type>
     <x:CellRangeList/>
     **<x:Value>&quot;Peter, Paul, Mary&quot;</x:Value>**
</x:DataValidation>

每次遇到有一段时间没有更新的 Excel 文件时,我们必须按 ctrl+F11,找到“Peter, Paul, Mary”这一行并手动将其更改为“Peter, John, Susan ”。这变得非常烦人,我想编辑上述数据并将“彼得,保罗,玛丽”替换为“彼得,约翰,苏珊”。我想对文件名以“ABC”结尾的每个 Excel 文件执行此操作。是否有针对此的代码解决方案,而不是寻找每个文件并手动更改它?我更喜欢 C++/C#,但如果需要或者更容易的话,可以使用 Visual Basic 进行管理。

【问题讨论】:

  • 如果您知道哪些单元格应用了数据验证,那么您可以很容易地创建一个 VBA 宏来进行更新:尝试在设置列表时录制一个宏,然后对其进行修改。当“过去的”工程师仍然在场时创建的文件呢?这些数据是否仍需要访问“旧”列表?

标签: c# excel vba automation


【解决方案1】:

您可以使用 COM 互操作来完成所有这些工作。确保您的项目引用了 Excel 互操作。 (我相信你需要在你的机器上安装 excel)

using System.IO;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;

然后是应用程序

class Program
{
    static void Main(string[] args)
    {
        var mypath = @"c:\my\search\directory";
        string[] files = Directory.GetFiles(mypath, "*abc.xls", SearchOption.AllDirectories);

        foreach (var file in files)
        {
            Find(Path.Combine(mypath,file));
        }
    }

    private static void Find(string path)
    {
        object missing = null;
        Excel.Range currentFind = null;
        Excel.Range firstFind = null;
        var app = new Excel.Application();
        app.Visible = true;
        Excel.Workbook workbook = app.Workbooks.Open(path, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
        var worksheet = workbook.Sheets[1];


        Excel.Range foundNames = worksheet.Range["A1", "B3"];
        // You should specify all these parameters every time you call this method, 
        // since they can be overridden in the user interface. 
        currentFind = foundNames.Find("Peter, Paul, Mary", LookIn: XlFindLookIn.xlValues, LookAt: XlLookAt.xlPart);

        currentFind.Replace(What:"Peter, Paul, Mary", Replacement:"Peter, John, Susan");

        workbook.Save();
    }
}

此示例假定所有内容都在 A1 和 B3 内的第一个工作表上。显然,您的工作表会有所不同,因此需要更改这些值以反映这一点。 此外,您可以删除“visible=true”,可能会加快速度。我这样做只是为了让我可以看到我的应用在做什么。

【讨论】:

  • 谢谢!这在大多数情况下都有效。我不得不对 Find 方法进行一些小修复。我使用了验证界面而不是查找/替换,我无法正常工作。在使用workbook.Close() 保存工作簿后,我还使该方法关闭了工作簿。这很重要,因此 Excel 不会在后台运行。
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多