6

このようなC#プロジェクトからExcelファイルを読み取るための接続文字列があります。

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

objConn.Open();もあります。ファイルを開きます。

問題は、プログラムがファイルを開くのは、Excelファイルを手動で開いてプログラムを実行する場合だけです。最初に手動でファイルを開く代わりに、C#コードからファイルを開くのを誰かが手伝ってくれますか?最初にExcelファイルを開かずに実行しようとすると、インストール可能なISAMが見つかりませんでしたというエラーメッセージが表示されます。

ありがとうございました

4

5 に答える 5

9

接続文字列のフォーマットが間違っていると思います。通常、「インストール可能な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);
于 2011-08-30T16:24:32.003 に答える
3

最近、ExcelではなくOLEDBプロバイダーを使用する必要があるAzureWebジョブにこのプロバイダーを使用する必要がありました。

次の設定を使用して、Microsoft.ACE.OLEDB.12.0プロバイダーをインストールできます。

Microsoft Access DatabaseEngine2010再頒布可能パッケージ https://www.microsoft.com/en-us/download/details.aspx?id=13255

インストールすると、.xlsおよび.xlsxファイル拡張子の接続文字列を変更できます。

たとえば、次のコードは、ExcelファイルをExcelファイルの各ワークシートのDataTableを含むDataSetに変換します。

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;
}
于 2016-09-24T03:27:50.657 に答える
1

Excelに接続するためのさまざまなプロバイダーがあります。たぶん、別のものを使ってみるべきでしょう。ここの例を見てください:

http://www.connectionstrings.com/excel

Excel用プロバイダー»MicrosoftJetOLE DB4.0»ACEOLEDB12.0»OLEDB用.NETFrameworkデータプロバイダー(OleDbConnection)»Microsoft ExcelODBCドライバー»ODBC用.NETFrameworkデータプロバイダー(OdbcConnection)»MicrosoftExcel用.NETxlReader(ExcelConnection )。

この場合、次のようになります。Provider = Microsoft.ACE.OLEDB.12.0; Data Source = c:\ myFolder \ myOldExcelFile.xls; Extended Properties = "Excel 12.0; HDR = YES";

于 2011-08-30T16:25:33.633 に答える
1

次のコードはExcelファイルを読み取り、DataTableにそのデータを入力します

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);
            }
于 2011-08-30T16:26:49.303 に答える
1

他のオプションは、接続を作成する代わりに専用のライブラリを使用することです。C#でExcelファイルを操作するためのオープンソースライブラリであるEPPlusをご覧ください。それは私にとって非常にうまくいきました。

http://epplus.codeplex.com/

そして、このリンクでは、EPPlusでExcelファイルを読み取る例を見ることができます。

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

于 2011-08-30T16:28:11.640 に答える