У меня возникла проблема с получением имен рабочих листов из электронной таблицы Excel с помощью OLEDB. Проблема в том, что когда я использую GetOleDbSchemaTable, результирующая таблица DataTable содержит больше, чем просто имена рабочих листов; у него есть дополнительные строки для «Таблиц», которые, как я могу предположить, используются внутри Excel.
Так, например, если у меня есть рабочий лист с именем myWorksheet, приведенный ниже код может закончиться списком, содержащим myWorksheet$, myWorksheet$PrintTable и myWorksheet$_. Только первая запись myWorksheet$ предназначена для фактического рабочего листа. Остальные просто мусор, который мне не нужен. Когда вы смотрите на них в метаданных, они выглядят как обычные таблицы, даже с типом TABLE.
На данный момент я просто вручную отфильтровал все, что содержит «$_» или «$Print» в имени, но кто знает, какая еще функция Excel может привести к тому, что эти дополнительные записи появятся в другом формате.
Кто-нибудь знает лучший способ получить ТОЛЬКО фактические имена рабочих листов, а не эти внутренние таблицы, которые не являются рабочими листами? Есть ли что-то в метаданных, что отличало бы их?
private ArrayList getXlsWorksheetNames(OleDb.OleDbConnection conn)
{
ArrayList wsList = new ArrayList();
DataTable schemaTable;
try
{
conn.Open();
schemaTable = conn.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, null);
foreach (DataRow row in schemaTable.Rows)
{
//form.appendToResultsTxt("Adding worksheet to list: " + Environment.NewLine +
// "Name = " + row.Field("TABLE_NAME") + "," + Environment.NewLine +
// "Type = " + row.Field("TABLE_TYPE") + "," + Environment.NewLine + Environment.NewLine);
wsList.Add(row.Field("TABLE_NAME"));
}
conn.Close();
}
catch (Exception ex)
{
if (this.mode == Cps2TxtUtilModes.GUI_MODE)
{
this.form.appendToResultsTxt(ex.ToString());
}
throw;
}
return wsList;
}
Я прочитал статью по этой ссылке, но, похоже, они не делают ничего отличного от того, что делаю я, и я не вижу какой-либо фильтрации дополнительных таблиц, не относящихся к рабочим листам, поэтому Microsoft, похоже, не дали правильный ответ.
http://support.microsoft.com/kb/318452
И я также много просмотрел StackOverflow, например, ветку по ссылке ниже, которая была полезной, но не решает эту проблему. .
Использование Excel OleDb для получения имен листов В ПОРЯДКЕ ЛИСТ
Прежде чем кто-либо спросит, я также хотел бы сказать, что на самом деле я не могу контролировать, какие функции используются в электронной таблице, поэтому я не могу просто скажите им: «Не включайте фильтрацию» или «Не используйте таблицы печати».
Приветствуются любые идеи. Спасибо!