Быстрый способ перехода из Excel в DataSet или DataGridView - PullRequest
0 голосов
/ 28 июля 2010

У меня есть данные, которые я беру с листа Excel с конечной целью отображения в DataGridView.

В настоящее время я просто перебираю данные UsedRange из excel и подключаю их к представлению данных.Это прекрасно работает, но может затормозиться, когда есть 100+ строк данных.

Я также поиграл с переходом из Excel в набор данных (используя тот же расточительный метод), и, как и ожидалось, это займет примерно столько жевремя для загрузки данных.

Мне было интересно, есть ли у кого-нибудь информация для лучшего способа?Может быть, использовать XML из файла Excel?

РЕДАКТИРОВАТЬ:

Некоторая дополнительная информация:

Это приложение WinFormsи пользователь будет выбирать и загружать файл Excel во время выполнения.

РЕДАКТИРОВАТЬ

Возврат некоторой дополнительной информации:

Файл Excel находится на компьютере пользователя.Общее предположение состоит в том, что они будут загружать разные файлы каждый раз, когда они используют приложение.[не уверен, поможет ли это, но может быть полезно знать:)]

Ответы [ 3 ]

2 голосов
/ 29 июля 2010

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

У меня фактически есть два разных решения в моей библиотеке кода: одно использует OLEDB, а другое использует Excel Interop.Из вашего вопроса, я предполагаю, что вы пытались использовать решение для взаимодействия, и это слишком медленно.Если все, что вам нужно, - это читать таблицы непосредственно из Excel, где на листе есть одна таблица, решение OLEDB, вероятно, будет чище и быстрее.Если вы когда-нибудь дойдете до точки, где вам нужно записать файл Excel, вы можете обнаружить, что OLEDB слишком ограничен.Это был мой опыт для одного проекта.

В любом случае, я опубликую несколько кусочков моего решения OLEDB, которое, надеюсь, поможет вам начать:

    public void FillDataTables(DataSet dataSet)
    {
        var worksheetNames = GetWorksheetNames();
        foreach (DataTable table in dataSet.Tables)
        {
            if (!worksheetNames.Contains(table.TableName + "$")) continue;
            FillDataTable(table);
        }
    }

    public void FillDataTable(DataTable table)
    {
        using (var connection = ConnectionProvider.GetNew())
        {
            var adapter = GetNewDataAdapter(table, connection);
            adapter.Fill(table);
        }
    }

    private IEnumerable<string> GetWorksheetNames()
    {
        return GetSchemaTable()
            .AsEnumerable()
            .Select(dr => dr.Field<string>("TABLE_NAME"));
    }

    public DataTable GetSchemaTable()
    {
        using (var connection = (OleDbConnection)ConnectionProvider.GetNew())
        {
            connection.Open();
            return connection.GetSchema("Tables");
        }
    }

Вот код дляExcelConnectionProvider:

public class ExcelConnectionProvider : IConnectionProvider
{
    private readonly string _connectionString;
    private readonly string _workbookPath;

    public string ConnectionString
    {
        get { return _connectionString; }
    }

    public string WorkbookPath
    {
        get { return _workbookPath; }
    }

    public ExcelConnectionProvider(string workbookPath)
    {
        _workbookPath = workbookPath;
        _connectionString = GetConnectionString();
    }

    private string GetConnectionString()
    {
        var builder = new OleDbConnectionStringBuilder { Provider = "Microsoft.ACE.OLEDB.12.0", DataSource = _workbookPath };
        builder.Add("Extended Properties", "Excel 12.0 Xml;HDR=Yes");
        return builder.ConnectionString;
    }

    public DbConnection GetNew()
    {
        return new OleDbConnection(_connectionString);
    }
}

Если у вас возникнут проблемы с этим компиляцией, попробуйте включить сборку «System.Data.DataSetExtensions» в ваш проект.

РЕДАКТИРОВАТЬ: : IConnectionProvider не нужен - это интерфейс, который я добавил в свою библиотеку, потому что у меня есть другие поставщики соединений, кроме Excel.

1 голос
/ 28 июля 2010

Если у вас есть выбор, я сначала экспортирую данные Excel в базу данных или XML-файл (только один раз, а не каждый раз, когда приложение запускается).Если ваши пользователи не обновляют этот файл Excel на регулярной основе и не хотят, чтобы результаты сразу отображались в вашем приложении.

Вот как использовать Excel в качестве источника данных (у вас, вероятно, он уже есть, но стоитДоказательство, поскольку на данный момент проблема заключается только в производительности): http://support.microsoft.com/default.aspx?scid=kb;en-us;311731

Но да - конвертируйте его в таблицу sql-server или в файл xml, прежде чем ваше приложение получит его, ия буду намного счастливее, я думаю.

0 голосов
/ 29 июля 2010

Это документы Office Open XML? Если бы они были, вы могли бы использовать пространство имен System.IO.Packaging или Open XML SDK 2.0 для просмотра данных. Это должно быть довольно быстро, так как он работает только с файлами XML. Конечно, если они не OOXML, то это действительно бесполезно, и я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...