Как получить список ТОЛЬКО имен рабочих листов Excel в Excel с помощью OLEDB; отфильтровывать не рабочие листы, которые отображаются в метаданных

У меня возникла проблема с получением имен рабочих листов из электронной таблицы 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 для получения имен листов В ПОРЯДКЕ ЛИСТ

Прежде чем кто-либо спросит, я также хотел бы сказать, что на самом деле я не могу контролировать, какие функции используются в электронной таблице, поэтому я не могу просто скажите им: «Не включайте фильтрацию» или «Не используйте таблицы печати».

Приветствуются любые идеи. Спасибо!

9
задан Community 23 May 2017 в 11:46
поделиться