C# 动态获取第一张Excel工作表的名称并将其影响为变量
我使用SSI加载xlsx文件,这些文件具有不同的图纸名称,但结构相同。我只需要加载每个文件的第一页,但每次的名称不能相同,所以我需要始终指向第一页,而不管它的名称。我认为在Excel源任务的数据访问模式下,不可能使用索引(1),这就是为什么我尝试使用任务脚本获取每个文件的第一个工作表的名称,并将其放入变量工作表名称中,然后在每个文件的数据访问模式下使用它 我对上面的代码有一个异常,我不知道如何解决它 我试图寻找一个不使用脚本的解决方案,但我没有找到它,这就是为什么我试图让我的代码工作C# 动态获取第一张Excel工作表的名称并将其影响为变量,c#,sql-server,excel,ssis,etl,C#,Sql Server,Excel,Ssis,Etl,我使用SSI加载xlsx文件,这些文件具有不同的图纸名称,但结构相同。我只需要加载每个文件的第一页,但每次的名称不能相同,所以我需要始终指向第一页,而不管它的名称。我认为在Excel源任务的数据访问模式下,不可能使用索引(1),这就是为什么我尝试使用任务脚本获取每个文件的第一个工作表的名称,并将其放入变量工作表名称中,然后在每个文件的数据访问模式下使用它 我对上面的代码有一个异常,我不知道如何解决它 我试图寻找一个不使用脚本的解决方案,但我没有找到它,这就是为什么我试图让我的代码工作 publ
public void Main()
{
String FolderPath =
Dts.Variables["User::Folder_To_Be_Processed_Path"].Value.ToString();
String File_Name = Dts.Variables["User::File_Name"].Value.ToString();
string fileFullPath = "";
fileFullPath = FolderPath + "\\" + File_Name;
string connString = "Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" +
fileFullPath + ";Extended Properties=\"Excel 12.0;HDR=YES\";";
using (OleDbConnection conn = new OleDbConnection(connString))
{
conn.Open();
MessageBox.Show(connString);
dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] {
null, null, null, "TABLE" });
Dts.Variables["User::Sheet_Name"].Value= dtSchema.Rows[0].Field<string>
("TABLE_NAME");
}
Dts.TaskResult = (int)ScriptResults.Success;
}
public void Main()
{
字符串文件夹路径=
变量[“User::Folder_To_Be_Processed_Path”]。Value.ToString();
字符串文件_Name=Dts.Variables[“User::File_Name”].Value.ToString();
字符串fileFullPath=“”;
fileFullPath=FolderPath+“\\”+文件名;
string connString=“Provider=Microsoft.Jet.OLEDB.12.0;数据源=“+
fileFullPath+“扩展属性=\”Excel 12.0;HDR=是\“;”;
使用(OLEDB连接连接=新OLEDB连接(连接字符串))
{
conn.Open();
MessageBox.Show(字符串);
dtSchema=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,新对象[]{
null,null,null,“表”});
Dts.Variables[“User::Sheet_Name”]。Value=dtSchema.Rows[0]。字段
(“表_名称”);
}
Dts.TaskResult=(int)ScriptResults.Success;
}
动态检索excel文件表名
using (OleDbConnection conn = new OleDbConnection(connString))
{
conn.Open();
dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
Sheet1= dtSchema.Rows[0].Field<string>("TABLE_NAME");
}
使用(OLEDB连接连接=新OLEDB连接(连接字符串))
{
conn.Open();
dtSchema=conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,新对象[]{null,null,null,“TABLE”});
Sheet1=dtSchema.Rows[0]。字段(“表名称”);
}
在StackOverflow和其他社区上有许多类似的帖子,其主要思想是OLEDB不会以Excel工作簿中的相同顺序检索工作表名称,或者您需要对结果表进行排序
使用OLEDB获取图纸名称
由于OLEDB提供程序不按顺序返回数据表,因此应按顺序列对数据表进行排序
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook excelBook = xlApp.Workbooks.Open("D:\\Book1.xlsx");
String[] excelSheets = new String[excelBook.Worksheets.Count];
int i = 0;
foreach(Microsoft.Office.Interop.Excel.Worksheet wSheet in excelBook.Worksheets)
{
excelSheets[i] = wSheet.Name;
i++;
}
其他有用的链接