Чтение файла Excel из C # - PullRequest
       17

Чтение файла Excel из C #

4 голосов
/ 30 августа 2011

У меня есть строка подключения для чтения файла Excel из моего проекта C #, который выглядит следующим образом ..

String ConnectionString  = "Provider=Microsoft.ACE.OLEDB.12.0;" +
                                      "Data Source=" + VariableFile + ";" +
                                      "Extended Properties=Excel 8.0;";

и у меня также есть objConn.Open (); открыть файл ..

Проблема - единственный раз, когда моя программа открывает файл, если я открываю файл Excel вручную и запускаю свою программу. Может кто-нибудь помочь мне открыть файл из моего кода C # вместо того, чтобы открывать его сначала вручную. Я получаю сообщение об ошибке: не удается найти устанавливаемый ISAM, когда я пытаюсь запустить его, не открывая файл Excel.

Спасибо

Ответы [ 5 ]

8 голосов
/ 30 августа 2011

Я думаю, что ваша строка подключения отформатирована неправильно, и "Не удалось найти устанавливаемый ISAM", как правило, указывает на это.

Попробуйте, это из части кода, который у меня есть:

Excel 2007

string connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=No;IMEX=1\";", fullPath);

Excel 2003

string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";", fullPath);
2 голосов
/ 24 сентября 2016

Мне недавно пришлось использовать этого провайдера для веб-задания Azure, где мне нужно было использовать провайдера OLEDB, а не Excel.

Вы можете установить провайдера Microsoft.ACE.OLEDB.12.0, используя следующую настройку.

Microsoft Access Database Engine 2010 распространяемый https://www.microsoft.com/en-us/download/details.aspx?id=13255

После установки вы можете изменить строку подключения для расширений .xls и .xlsx.

Например,следующий код преобразует файл Excel в набор данных с таблицей данных для каждого рабочего листа в файле Excel.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Net;

...

public DataSet ExcelToDataSet(string excelFilename)
{
    var dataSet = new DataSet(excelFilename);

    // Setup Connection string based on which excel file format we are using
    var excelType = "Excel 8.0";
    if (excelFilename.Contains(".xlsx"))
    {
        excelType = "Excel 12.0 XML";
    }

    // <add key="Microsoft.ACE.OLEDB" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='{1};HDR=YES;READONLY=TRUE'"/>
    var connectionStringFormat = ConfigurationManager.AppSettings["Microsoft.ACE.OLEDB"].ToString();
    var excelNamePath = string.Format(@"{0}\{1}", Environment.CurrentDirectory, excelFilename);
    var connectionString = string.Format(connectionStringFormat, excelNamePath, excelType);

    // Create a connection to the excel file
    using (var oleDbConnection = new OleDbConnection(connectionString))
    {
        // Get the excel's sheet names
        oleDbConnection.Open();
        var schemaDataTable = (DataTable)oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        oleDbConnection.Close();
        var sheetsName = GetSheetsName(schemaDataTable);

        // For each sheet name 
        OleDbCommand selectCommand = null;
        for (var i = 0; i < sheetsName.Count; i++)
        {
            // Setup select command
            selectCommand = new OleDbCommand();
            selectCommand.CommandText = "SELECT * FROM [" + sheetsName[i] + "]";
            selectCommand.Connection = oleDbConnection;

            // Get the data from the sheet
            oleDbConnection.Open();
            using (var oleDbDataReader = selectCommand.ExecuteReader(CommandBehavior.CloseConnection))
            {
                // Convert data to DataTable
                var dataTable = new DataTable(sheetsName[i].Replace("$", "").Replace("'", ""));
                dataTable.Load(oleDbDataReader);

                // Add to Dataset
                dataSet.Tables.Add(dataTable);
            }
        }

        return dataSet;
    }
}

private List<string> GetSheetsName(DataTable schemaDataTable)
{
    var sheets = new List<string>();
    foreach(var dataRow in schemaDataTable.AsEnumerable())
    {
        sheets.Add(dataRow.ItemArray[2].ToString());
    }

    return sheets;
}
1 голос
/ 30 августа 2011

Другим вариантом будет использование специализированной библиотеки вместо создания соединения. Взгляните на EPPlus, библиотеку с открытым исходным кодом для работы с файлами Excel в C #. Это сработало очень хорошо для меня.

http://epplus.codeplex.com/

И по этой ссылке вы можете увидеть примеры чтения файлов Excel с помощью EPPlus:

http://blog.fryhard.com/archive/2010/10/28/reading-xlsx-files-using-c-and-epplus.aspx

1 голос
/ 30 августа 2011

Следующий код будет считывать файл Excel и заполнять таблицу данных ее данными

try
            {
                string connectionString = string.Empty;

                if (Path.GetExtension(ExcelFileName) == ".xlsx")
                {
                    connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ExcelFileName +
                        ";Extended Properties=Excel 12.0;";
                }
                else
                {
                    connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;";
                }

                OleDbCommand selectCommand = new OleDbCommand();
                OleDbConnection connection = new OleDbConnection();
                OleDbDataAdapter adapter = new OleDbDataAdapter();
                connection.ConnectionString = connectionString;

                if (connection.State != ConnectionState.Open)
                    connection.Open();

                DataTable dtSchema = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                List<string> SheetsName = GetSheetsName(dtSchema);
                for (int i = 0; i < SheetsName.Count; i++)
                {
                    selectCommand.CommandText = "SELECT * FROM [" + SheetsName[i] + "]";
                    selectCommand.Connection = connection;
                    adapter.SelectCommand = selectCommand;
                    DataTable Sheet = new DataTable();
                    Sheet.TableName = SheetsName[i].Replace("$", "").Replace("'", "");
                    adapter.Fill(Sheet);

                    if (Sheet.Rows.Count > 0)
                    {
                        Records.Tables.Add(Sheet);                        
                    }
                }
            }
            catch (Exception ex)
            {
                WriteLog(ex);
            }
0 голосов
/ 30 августа 2011

Существуют разные провайдеры для подключения к Excel.Может быть, вы должны попробовать использовать другой.Посмотрите примеры здесь:

http://www.connectionstrings.com/excel

Поставщики для Excel »Microsoft Jet OLE DB 4.0» ACE OLEDB 12.0 »Поставщик данных .NET Framework для OLE DB (OleDbConnection)» MicrosoftДрайвер ODBC для Excel »Поставщик данных .NET Framework для ODBC (OdbcConnection)» .NET xlReader для Microsoft Excel (ExcelConnection)

В вашем случае у вас должно быть что-то вроде этого: Provider = Microsoft.ACE.OLEDB.12.0;Источник данных = c: \ myFolder \ myOldExcelFile.xls; Расширенные свойства = "Excel 12.0; HDR = ДА";

...