我使用SSIS加载具有不同工作表名称但结构相同的xlsx文件。我只需要加载每个文件的第一张纸,但是每次的名称不能相同,因此无论其名称如何,我都必须始终指向第一张纸。我认为在Excel源任务中的数据访问模式下无法使用index(1st),这就是为什么我试图使用Task脚本获取每个文件的第一张纸的名称并将其放在变量Sheet_name中的原因,在每个文件的数据访问模式下使用它。
上面的代码有一个例外,我不知道如何解决。
我试图在不使用脚本的情况下寻找解决方案,但没有找到,这就是为什么我要使代码正常工作的原因。
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;
}
答案 0 :(得分:2)
StackOverflow和其他社区上有很多类似的帖子,主要思想是OLEDB不会以Excel工作簿中找到的相同顺序检索工作表名称,否则您需要对结果表进行排序。
您应该按dtSchema
列对数据表ORDINAL_POSITION
进行排序,因为OLEDB提供程序不会按此顺序返回它们。
主持人在此MSDN - post中提到:
恐怕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++;
}
答案 1 :(得分:0)
要动态检索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");
}