Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态获取第一张Excel工作表的名称并将其影响为变量_C#_Sql Server_Excel_Ssis_Etl - Fatal编程技术网

C# 动态获取第一张Excel工作表的名称并将其影响为变量

C# 动态获取第一张Excel工作表的名称并将其影响为变量,c#,sql-server,excel,ssis,etl,C#,Sql Server,Excel,Ssis,Etl,我使用SSI加载xlsx文件,这些文件具有不同的图纸名称,但结构相同。我只需要加载每个文件的第一页,但每次的名称不能相同,所以我需要始终指向第一页,而不管它的名称。我认为在Excel源任务的数据访问模式下,不可能使用索引(1),这就是为什么我尝试使用任务脚本获取每个文件的第一个工作表的名称,并将其放入变量工作表名称中,然后在每个文件的数据访问模式下使用它 我对上面的代码有一个异常,我不知道如何解决它 我试图寻找一个不使用脚本的解决方案,但我没有找到它,这就是为什么我试图让我的代码工作 publ

我使用SSI加载xlsx文件,这些文件具有不同的图纸名称,但结构相同。我只需要加载每个文件的第一页,但每次的名称不能相同,所以我需要始终指向第一页,而不管它的名称。我认为在Excel源任务的数据访问模式下,不可能使用索引(1),这就是为什么我尝试使用任务脚本获取每个文件的第一个工作表的名称,并将其放入变量工作表名称中,然后在每个文件的数据访问模式下使用它

我对上面的代码有一个异常,我不知道如何解决它

我试图寻找一个不使用脚本的解决方案,但我没有找到它,这就是为什么我试图让我的代码工作

 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提供程序不按顺序返回数据表,因此应按顺序列对数据表进行排序

使用互操作库获取图纸名称 因此,主持人提到:

恐怕OLEDB不能像在Excel中那样保留图纸顺序。你必须使用OLEDB吗?获取图纸名称的另一种方法是使用office互操作类

并提供以下代码以获取图纸名称:

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++;
}
其他有用的链接

感谢您的回答@Mohammed Alghanem,但我仍然有一个例外,就是打电话给conn.Open();。谢谢你的帮助,先生。我修改了我的第一个代码,使之适合你的。感谢您的帮助。@M.ECH请告诉我异常详细信息?Aghanem,DTS脚本任务在用户代码中遇到异常:调用系统的目标引发异常。RuntimeMethodHandle.InvokeMethod(对象目标,对象[]参数,签名sig,布尔构造函数)在System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(对象obj,对象[]参数,对象[]参数)在System.Reflection.RuntimeMethodInfo.Invoke(对象obj,BindingFlags invokeAttr,Binder Binder,对象[]参数,文化信息文化)感谢您的回答@Hadi,你的脚本看起来很有效,因为我添加了一个messageBox,并且我得到了和我文件中的表单一样多的信息。但是,在将工作表名称添加到外部变量Dts.Variables[“@User::sheet_name”].Value=excelSheets[0]时,我仍然有一个异常;我只需要第一张纸的名字。帮助please@M.ECH还要注意,变量名是casesensitive@M.ECH确保在脚本ReadWrite variablesIt中选择了变量。非常感谢您宝贵的回答和帮助。谢谢大家的帮助。我怎样才能用你的答案来结束这个问题,或者这是你的选择?已经完成了,如果我这边有更多必要的行动,请你检查并通知pe。谢谢