C# 以编程方式编辑Excel下拉项

C# 以编程方式编辑Excel下拉项,c#,excel,vba,automation,C#,Excel,Vba,Automation,我有成千上万的Excel文件,都是用同一个模板制作的。每个都有参数列,如日期、零件号和工程师。工程师单元格设置为下拉列表,因此用户只能输入某些工程师的姓名。当我们想要添加新的工程师或摆脱那些已经离开的工程师时,我们目前会根据需要在Microsoft Script Editor中更改姓名列表: <x:DataValidation> <x:Range>$D$19:$D$37</x:Range> <x:Type>List</x:

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

<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>

$D$19:$D$37
列表
**彼得、保罗、玛丽**
每次我们遇到一个Excel文件,我们已经有一段时间没有更新了,我们必须按下ctrl+F11,找到带有“Peter,Paul,Mary”的行,并手动将其更改为“Peter,John,Susan”。这很烦人,我想编辑上面的数据,并用“彼得,约翰,苏珊”替换“彼得,保罗,玛丽”。我想对每个文件名以“ABC”结尾的Excel文件都这样做。是否有代码解决方案,而不是查找每个文件并手动更改它?我更喜欢C++/C#,但如果需要或更简单,可以使用Visual Basic进行管理。

我建议您查看以下链接:

这是一个开源库,您可以使用它来操作excel工作表,您可以使用该库创建、加载和保存excel工作表

你说你最喜欢
c++
c#
,因为库在
c#
中,所以很容易找到

以下链接将引导您进入一个教程,该教程解释了如何使用它:

当我在互联网上搜索c#的excel库时,我发现了以下页面:


这是一个完整的教程,关于如何修改现有的excel工作表,我有理由向您推荐。

您可以使用COM interop完成所有这一切。确保项目已引用Excel互操作。(我相信您的计算机上需要安装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”,这可能会加快速度。我这样做只是为了看我的应用程序在做什么。

如果你知道哪些单元格应用了数据验证,那么你可以很容易地创建一个VBA宏来进行更新:在设置列表时尝试录制宏,然后进行修改。当“过去的”工程师仍然在场时创建的文件呢?这些数据还需要访问“旧”列表吗?谢谢!这在很大程度上起作用。我不得不对Find方法进行一些小的修改。我使用了验证界面,而不是查找/替换界面,我无法正常工作。我还让该方法在使用
workbook.close()
保存工作簿后关闭工作簿。这一点很重要,这样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();
    }
}