无法在 C# 中循环打开 Excel 个工作簿
unable to loop through open Excel workbooks in C#
我目前一直无法完成一项非常简单的任务:
- 我想遍历所有当前打开的 Excel 文件(工作簿)
当然,我按照惯例谷歌搜索代码片段,发现了很多现成的代码,根据威胁和评级讨论中的评论,它们应该可以工作.但对我来说,它们都不起作用
我也看到有人提到释放 COM 对象,但我并没有真正理解它,所有现成的代码示例也不包含它。
我正在使用:
- Windows 10
- 办公室 16
- Visual Studio 2017 (V15.9.41)
- COM-参考 'Microsoft Excel 16.0 Object Library'
我修改了网上找到的代码片段,所以我现在的代码是这样的:
using System;
using Microsoft.Office.Interop.Excel;
private void PrintListOfOpenWB()
{
Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application();
foreach (Workbook item in xlApp.Workbooks)
{
Console.WriteLine(item.Name);
}
}
我将其用作 WindowsFormsApp 的一部分,因此也 使用 System.Windows.Forms 等,但是我删除了这部分,所以这里只显示相关代码。
我确实打开了多个工作簿,并且在编译和 运行 代码时都没有出现任何错误。但是绝对没有输出产生,因为它直接跳到foreach循环的末尾。
知道我做错了什么吗?
这可能 returns 没有输出,因为变量是空的,做你所做的你只创建了让你访问库方法的变量,你不能用实际的 excel 文件,要这样做:
Workbook workBook = xlApp.Workbooks.Open(yourExcelFilePath);
//Cycle through the workBook and display the sheets
workBook.Close(false, yourExcelFilePath, null);
请记住,使用 excel 文件的层次结构(这实际上与帮助您执行此操作的所有不同库相同)的结构如下:
- 测试=新Microsoft.Office.Interop.Excel.Application(); : 这仅用于与库方法交互
- 工作簿:这是您要处理的完整 excel 文件的实际等价物,您需要先填充它
- 工作表:这是一个实体,表示文件中的单个 excel“页面”
P.S:Re-reading这个问题我可能理解错了,你能指定是显示文件夹内的excel个文件名还是显示excel个文件名单个 excel 文件中的单页
要在某处显示不同 excel 文件的名称,您可以这样做:
string[] temp = Directory.GetFiles(directoryPath);
List<string> ExcelFilesInDirectory = new();
foreach (var item in temp)
{
if (item.Contains(".xlsx"))
{
ExcelFilesInDirectory.Add(item);
}
}
然后使用该列表,您可以让用户 select 他想要修改的文件,然后您可以使用我发送的第一个代码示例来使其工作
我进一步研究并找到了以下适合我的解决方案。
using System;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
private void PrintListOfOpenWorkbooks()
{
Excel.Application xlApp;
xlApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
foreach(Excel.Workbook xlWorkBook in xlApp.Workbooks)
{
Console.WriteLine(xlWorkBook.Name);
}
}
也许这对以后的其他人也有帮助。
我目前一直无法完成一项非常简单的任务:
- 我想遍历所有当前打开的 Excel 文件(工作簿)
当然,我按照惯例谷歌搜索代码片段,发现了很多现成的代码,根据威胁和评级讨论中的评论,它们应该可以工作.但对我来说,它们都不起作用
我也看到有人提到释放 COM 对象,但我并没有真正理解它,所有现成的代码示例也不包含它。
我正在使用:
- Windows 10
- 办公室 16
- Visual Studio 2017 (V15.9.41)
- COM-参考 'Microsoft Excel 16.0 Object Library'
我修改了网上找到的代码片段,所以我现在的代码是这样的:
using System;
using Microsoft.Office.Interop.Excel;
private void PrintListOfOpenWB()
{
Microsoft.Office.Interop.Excel.Application xlApp;
xlApp = new Microsoft.Office.Interop.Excel.Application();
foreach (Workbook item in xlApp.Workbooks)
{
Console.WriteLine(item.Name);
}
}
我将其用作 WindowsFormsApp 的一部分,因此也 使用 System.Windows.Forms 等,但是我删除了这部分,所以这里只显示相关代码。
我确实打开了多个工作簿,并且在编译和 运行 代码时都没有出现任何错误。但是绝对没有输出产生,因为它直接跳到foreach循环的末尾。
知道我做错了什么吗?
这可能 returns 没有输出,因为变量是空的,做你所做的你只创建了让你访问库方法的变量,你不能用实际的 excel 文件,要这样做:
Workbook workBook = xlApp.Workbooks.Open(yourExcelFilePath);
//Cycle through the workBook and display the sheets
workBook.Close(false, yourExcelFilePath, null);
请记住,使用 excel 文件的层次结构(这实际上与帮助您执行此操作的所有不同库相同)的结构如下:
- 测试=新Microsoft.Office.Interop.Excel.Application(); : 这仅用于与库方法交互
- 工作簿:这是您要处理的完整 excel 文件的实际等价物,您需要先填充它
- 工作表:这是一个实体,表示文件中的单个 excel“页面”
P.S:Re-reading这个问题我可能理解错了,你能指定是显示文件夹内的excel个文件名还是显示excel个文件名单个 excel 文件中的单页
要在某处显示不同 excel 文件的名称,您可以这样做:
string[] temp = Directory.GetFiles(directoryPath);
List<string> ExcelFilesInDirectory = new();
foreach (var item in temp)
{
if (item.Contains(".xlsx"))
{
ExcelFilesInDirectory.Add(item);
}
}
然后使用该列表,您可以让用户 select 他想要修改的文件,然后您可以使用我发送的第一个代码示例来使其工作
我进一步研究并找到了以下适合我的解决方案。
using System;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
private void PrintListOfOpenWorkbooks()
{
Excel.Application xlApp;
xlApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");
foreach(Excel.Workbook xlWorkBook in xlApp.Workbooks)
{
Console.WriteLine(xlWorkBook.Name);
}
}
也许这对以后的其他人也有帮助。