C#读取多个Excel文件

7

是否有可能制作一个应用程序,从文件夹中读取多个Excel文件并从中提取一些信息?


7
是的,没错。 - JMK
只需读取一个提取信息,然后继续直到文件夹中的文件结束。 - Silvia Stoyanova
1
你一定在开玩笑吧!一个问题“是否可以从Excel中提取一些信息?”只有两个赞? - Tim Schmelter
这篇文章是今天发布的,提醒我起你的问题:https://www.mssqltips.com/sqlservertip/4157/how-to-read-data-from-multiple-excel-worksheets-with-sql-server-integration-services/ - Robert Paulsen
3个回答

8
是的,使用Interop就可以了。首先,您需要将Excel Interop库添加到项目中。您可以通过创建新的Visual Studio解决方案,右键单击“引用”,选择“添加引用”,然后从.NET选项卡中选择“Microsoft.Office.Interop.Excel”来完成此操作。
然后,您需要添加一个Excel using语句和一个InteropServices using语句(因为我们正在与COM对象进行交互):
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

然后,在一个方法内部,您需要创建一个Application对象:

Excel.Application application = new Excel.Application();

其次,为每个想要读取的工作簿创建一个Workbook对象,如下所示:

Excel.Workbook workbookOne;
Excel.Workbook workbookTwo;
Excel.Workbook workbookThree;

现在使用Application对象打开每个工作簿,并将每个工作簿加载到其相应的Workbook对象中:
workbookOne = application.Workbooks.Open(@"C:\workbookOneLocation.xlsx");
workbookTwo = application.Workbooks.Open(@"C:\workbookTwoLocation.xlsx");
workbookThree = application.Workbooks.Open(@"C:\workbookThreeLocation.xlsx");

现在,您需要决定要提取哪些信息。完成后,请确定工作簿中的哪张工作表包含此信息,并通过查看选项卡并计数来确定该编号。在下面的示例中,Sheet2是第1个,Sheet1 是第2个,Sheet3 是第3个:

Example

为每个所需信息创建一个变量,如下所示(任何值类型变量都需要可空):
string firstPieceOfInformationINeed;
string[] secondPieceOfInformationINeed;
double? thirdPieceOfInformationINeed;

假设我们需要的第一条信息是工作簿一中第一张工作表上A1单元格中的字符串,第二条信息是工作簿二中第二张工作表上B2-B4单元格中的内容,第三条信息是工作簿三中第三张工作表上C5单元格中的数字。我们可以这样做:

string firstPieceOfInformationINeed;
string[] secondPieceOfInformationINeed;
double? thirdPieceOfInformationINeed;

Excel.Worksheet worksheet;
Excel.Range range;

worksheet = workbookOne.Sheets[1];
range = worksheet.Cells["1", "1"];

firstPieceOfInformationINeed = range.Value as string;

worksheet = workbookTwo.Sheets[2];
range = worksheet.Range["B2", "B4"];

secondPieceOfInformationINeed = range.Value as string[];

worksheet = workbookThree.Sheets[3];
range = worksheet.Cells["3", "5"];

thirdPieceOfInformationINeed = range.Value as double?;

然后,我们使用布尔值来指示是否要保存更改,关闭工作簿:

workbookOne.Close(true);
workbookTwo.Close(false);
workbookThree.Close(true);

现在退出应用程序:
application.Quit();

释放COM对象:
Marshal.ReleaseComObject(application);

现在您已经完成了Excel操作,将所需的各种信息存储为C#变量,您可以随心所欲地处理这些变量。


由于我不知道文件夹中的文件数量和它们的名称,是否可能像这样获取它们的名称:string[] filePaths = Directory.GetFiles(@"c:\MyDir"); 然后为数组中的每个路径创建工作簿...然后执行您建议的操作以提取信息。 - Silvia Stoyanova
1
@SilviaStoyanova 当然,只需检查文件是否具有xls或xlsx扩展名,并循环遍历它们即可。 - Mikey Mouse
那个文件夹里不会有其他文件..但是没错,以防万一 :) - Silvia Stoyanova

0

是的,如果你不想使用Excel Interop,你可以使用ClosedXML,它适用于Excel 2007及以上版本。


我建议使用epplus - Tim Schmelter
从未尝试过,谢谢提示。 - Freeman

0
尝试使用NPOI (http://npoi.codeplex.com/)或NetOffice(http://netoffice.codeplex.com/)库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接