以编程方式编辑Excel下拉项

本文关键字:Excel 编辑 编程 方式 | 更新日期: 2023-09-27 18:29:02

我有成千上万的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"。这很烦人,我想编辑上面的数据,用"Peter,John,Susan"代替"Peter,Paul,Mary"。我想对每个文件名以"ABC"结尾的Excel文件都这样做。有没有一个代码解决方案,而不是搜索每个文件并手动更改它?我更喜欢C++/C#,但如果需要或更容易的话,可以使用Visual Basic进行管理。

以编程方式编辑Excel下拉项

您可以使用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",这可能会加快速度。我这么做只是为了能看到我的应用程序在做什么。