Динамически получить имя первого листа Excel и привязать его к переменной - PullRequest
0 голосов
/ 13 января 2019

Я использую SSIS для загрузки файлов xlsx с разными именами листов, но с одинаковой структурой. Мне нужно загружать только первый лист каждого файла, но имя не может быть одинаковым каждый раз, поэтому мне нужно всегда указывать на первый лист независимо от его имени. Я думаю, что в режиме доступа к данным в исходной задаче Excel невозможно использовать индекс (1-й), поэтому я пытаюсь использовать сценарий задачи, чтобы получить имя первого листа каждого файла и поместить его в переменную 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;
}

Ответы [ 2 ]

0 голосов
/ 13 января 2019

В StackOverflow и других сообществах есть много похожих сообщений. Основная идея заключается в том, что OLEDB не получает имена листов в том же порядке, что и в книге Excel, или вам нужно упорядочить таблицу результатов.

Получение имен листов с использованием OLEDB

Вы должны отсортировать DataTable dtSchema по столбцу ORDINAL_POSITION, поскольку поставщик OLEDB не возвращает их в этом порядке.

Получение имен листов с использованием библиотеки Interop

Из этого MSDN - сообщение , модератор упомянул, что:

Боюсь, что OLEDB не сохраняет порядок листов, как это было в Excel. Вы должны использовать 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++;
}

Другие полезные ссылки

0 голосов
/ 13 января 2019

Для динамического получения имени листа файла 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");
}
...