2017-11-07 9 views
1

データを処理してエクスポートするために、Excelファイルをプログラムにインポートしようとしています。私はOleDBを使ってアクセスファイルにアクセスし、それを表示してwinformで作業できるように、データテーブルに渡そうとしています。ここで私が使用しているコードは次のとおりです。私はOleDBAdapter(のDataAdapter)とのdataTableを埋めるためにしようとしていたときにExcelをデータグリッドにインポートする

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.OleDb; 
using System.Windows; 
using System.Windows.Forms; 
using System.Globalization; 
using System.Runtime.Versioning; 
using System.Threading; 

namespace DataImportServices 
{ 
    public class ExcelImport : IDataImport 
    { 
     public DataTable ImportData(OpenFileDialog openFile) 
     { 
      var dataTable = new DataTable(); 

      string query; 
      var hasHeaders = false; 
      var HDR = hasHeaders ? "Yes" : "No"; 
      string connectionString; 

      if (openFile.FileName.Substring(openFile.FileName.LastIndexOf(".")).ToLower() == ".xlsx") 
      { 
       connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + openFile.FileName + ";Extended Properties=\"Excel 12.0;HDR=" + HDR + ";IMEX=0\""; 
      } 
      else 
      { 
       connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + openFile.FileName + ";Extended Properties=\"Excel 8.0;HDR=" + HDR + ";IMEX=0\""; 
      } 

      using (OleDbConnection cn = new OleDbConnection(connectionString)) 
      { 
       cn.Open(); 
       DataTable schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
       DataRow schemaRow = schemaTable.Rows[0]; 
       string sheet = schemaRow["TABLE_NAME"].ToString(); 

       if (!sheet.EndsWith("_")) 
       { 
        query = "SELECT * FROM [" + openFile.FileName + "]"; 
        using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, cn)) 
        { 
         dataTable.Locale = CultureInfo.CurrentCulture; 
         dataAdapter.Fill(dataTable); //The error occurs here with a "" is not an acceptable. If I put a name ie "Data" it says its not an adorecord. 
        } 
       }     
      } 
      return (dataTable); 
     } 
    } 
} 

私が負う午前エラーです。 DataTableだけのオーバーライドを持っているにもかかわらず、ADODBrecordsetを要求する例外がスローされます。これを回避するにはどうしたらいいですか?または私は何かを逃していますか?

ありがとうございます。

答えて

0

EpPlusのようなライブラリを使用できます。このサポートは、oleまたはexcelを使用せずにネイティブに優れています。

データを配列としてロードして直接アクセスすることができます。

http://epplus.codeplex.com/wikipage?title=LinqExample

0

あなたはエクスポート可能で、Excelのコンテンツを読んで試みることができます。私は以前に開発した小さなライブラリで、現在はOpenSourceとしてNugetに配布されています。

基本的に、あなたはこのようにExcelファイルを読むことができます:あなたはhere

の詳細情報を得ることができる

IImportEngine engine = new ExcelImportEngine(); 
var key = engine.AddContainer<DummyPersonWithAttributes>(); 
engine.SetDocument(pathToFile); //or MemoryStream instance 
var data = engine.GetList<DummyPersonWithAttributes>(key); 

関連する問題