2017-11-07 14 views
1

데이터를 작업하고 내보낼 수 있도록 Excel 프로그램을 프로그램에 가져 오려고합니다. OleDB를 사용하여 액세스 파일에 액세스하고 그것을 볼 수 있고 winform에서 사용할 수 있도록 데이터 테이블에 전달하려고합니다. 나는 OleDBAdapter (데이터 어댑터)와 데이터 테이블을 채우기 위해 노력하고 때Excel을 Datagrid로 가져 오기

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을 사용하지 않고도 네이티브를 능가하거나 탁월합니다.

데이터를 배열로로드하고 직접 액세스 할 수 있습니다.

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

0

당신은 내보낼 수와 엑셀의 컨텐츠를 읽는 시도 할 수 있습니다. 제가 작년에 개발 한 작은 라이브러리는 현재 Nuget에서 OpenSource로 배포되고 있습니다.

기본적으로, 당신은 엑셀과 같은 파일을 읽을 수 있습니다 : 당신이 더 많은 정보를 얻을 수

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

here