2012-05-24 5 views
1

Я пытаюсь получить список рабочих листов в книге Excel, но в коллекции, которую я получаю, есть имена листов и идентификаторы столбца данных, которые, как представляется, называются «Определенные имена» в исходном xlsx xml. Можете ли вы сказать мне, как вернуть только имена рабочих листов?OleDb - Получение имен рабочих листов Excel также извлекает определенные имена

код я использую вдоль линий:

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" 
      + @"Data Source=" + FilePath + ";" 
      + @"Extended Properties=""Excel 8.0;HDR=Yes;"""); 

OleDbCommand cmdExcel = new OleDbCommand(); 
cmdExcel.Connection = connExcel; 
connExcel.Open(); 

DataTable testTable = connExcel.GetSchema("Tables"); 

содержимое результирующего TESTTABLE коллекции содержат записи под TABLE_NAME из:

  • DATA1
  • data2
  • DATA3
  • DATA4
  • данные 5
  • Лист1 $
  • TEST1 -TEST2
  • TESTHKEY
  • TESTKEYS
  • TESTVKEY

Все они имеют TABLE_TYPE стола.

Исходная книга, соответствующая вышеизложенному, имеет 1 лист, содержащий 5 столбцов, первая строка будет содержать заголовок. Меня интересует только запись Sheet1 $. Электронная таблица , созданная в Excel 2010, я пытаюсь обработать ее в приложении ASP.NET 4, написанном на C#. Потенциально имя рабочего листа может быть изменено, поэтому я не могу гарантировать, что он всегда будет Sheet1 $.

ответ

2

Мои первые мысли были неправильными, поэтому я придумал это как обходное решение. Фактические имена рабочих листов должны всегда заканчиваться на $, поэтому я взломал его, чтобы проверить это. Беспокойно, но вы получите общую идею, я уверен.

OleDbConnection connExcel = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;" 
     + @"Data Source=c:\test.xlsx;" 
     + @"Extended Properties=""Excel 12.0 Xml;HDR=Yes;"""); 

     OleDbCommand cmdExcel = new OleDbCommand(); 
     cmdExcel.Connection = connExcel; 
     connExcel.Open(); 

     DataTable testTable = connExcel.GetSchema("Tables"); 

     String[] excelSheets = new String[testTable.Rows.Count]; 
     int i = 0; 

     foreach (DataRow row in testTable.Rows) 
     { 
      excelSheets[i] = row["TABLE_NAME"].ToString(); 

      if (excelSheets[i].EndsWith("$")) 
      { 
       Console.WriteLine(excelSheets[i] = row["TABLE_NAME"].ToString()); 
       i++; 
      } 
      else 
      { 
       i++; 
      } 

     } 

     Console.ReadLine(); 
+0

Спасибо за ваш ответ, работает для меня как метод пост-обработки! – Mike

+0

После небольшого копания я обнаружил, что определенные имена были автоматически созданы, когда электронная таблица была создана путем экспорта данных из SAP. Кажется, что в итоговом результате в столбце данных есть элемент . Элементы сгруппированы под родительским элементом после группы в пределах элемента . Метод GetSchema выбирает их как «Таблицы». Вы можете удалить определенные имена в Excel, выбрав «Формулы» в ленте, а затем «Менеджер имен» в разделе «Определенные имена». – Mike

+0

У меня такая же проблема, когда я получаю больше листов, чем фактических, и у меня нет определенного имени. если мое имя листа «abc», то у меня есть другой рабочий лист с именем «abc $». Может ли кто-нибудь объяснить, почему он так себя ведет? Я попытался импортировать этот файл через импорт sql, и он также показывает, что дополнительные листы и я не могу их видеть, когда я открываю файл excel. –

Смежные вопросы