2010-03-16 9 views
5

Mam arkusz kalkulacyjny Excel, który będzie siedzieć na dysku sieciowego. Dostęp do niego musi mieć moja aplikacja WinForm C# 3.0 (wielu użytkowników może korzystać z aplikacji i jednocześnie naciskać ten arkusz kalkulacyjny). W jednym arkuszu jest dużo danych. Te dane są podzielone na obszary, które nazwałam zakresami. Muszę mieć dostęp do tych zakresów indywidualnie, zwrócić każdy zakres jako zbiór danych, a następnie powiązać go z siatką.Konwersja zakresu Excel do ADO.NET DataSet lub DataTable, itp.

Znalazłem przykłady, które używają OLE i mam je do pracy. Jednak widziałem kilka ostrzeżeń na temat korzystania z tej metody, a także w pracy używaliśmy Microsoft.Office.Interop.Excel jako standard do tej pory. Naprawdę nie chcę odejść od tego, chyba że muszę. Nasi użytkownicy będą używać pakietu Office 2003 w miarę możliwości.

mogę zakres muszę z następującego kodu:

MyDataRange = (Microsoft.Office.Interop.Excel.Range) 
    MyWorkSheet.get_Range("MyExcelRange", Type.Missing); 

OLE sposób było miłe, jak zajęłoby mój pierwszy wiersz i skręcić w tych kolumnach. Moje zakresy (12 w sumie) są w większości różne od siebie w liczbie kolumn. Nie wiedziałem, czy te informacje wpłyną na jakiekolwiek rekomendacje.

Czy istnieje sposób użycia Interop i odzyskania zwróconego zakresu z powrotem do zestawu danych?

Odpowiedz

2

nie wiem o wbudowanej funkcji, ale to nie powinno być trudne, aby je napisać samemu. Pseudokod:

DataTable MakeTableFromRange(Range range) 
{ 
    table = new DataTable 
    for every column in range 
    { 
     add new column to table 
    } 
    for every row in range 
    { 
     add new datarow to table 
     for every column in range 
     { 
     table.cells[column, row].value = range[column, row].value 
     } 
    } 
    return table 
} 
+0

Doceniam wszystkie odpowiedzi. Ponieważ nie mogłem znaleźć niczego wbudowanego, poszedłem do przodu i po prostu przetasowałem zakres i stworzyłem datatable "w locie". Wszystkie sugestie tutaj wymienione naprawdę działałyby, po prostu nie chciałem używać OLEDB i nie mogę w tym momencie wprowadzić biblioteki 3rd party. Dziękuję za szybkie odpowiedzi. Bardzo doceniane. – user295197

+0

To jest pseudo kod ... –

0

Warto spojrzeć na , jeśli chodzi o odczyt/zapis plików XLS programu Excel 2003. NPOI to ratownik.

Myślę, że będziesz musiał powtórzyć swój zakres i utworzyć DataRows, aby umieścić w DataTable.

To pytanie na StackOverflow zapewnia więcej zasobów:

Create Excel (.XLS and .XLSX) file from C#

+0

będę o tym pamiętać o przyszłych projektach. W tej chwili nie mogę wprowadzić nowej biblioteki do naszej aplikacji. – user295197

2

Nie wiem, jaki rodzaj danych, które have.But jeszcze przez dane programu Excel jak pokazano w ten link http://www.freeimagehosting.net/image.php?f8d4ef4173.png, można użyć następującego kodu załadować do tabeli danych.

private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     {   
      DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$"); 
      dataGridView1.DataSource = sheetTable; 
     } 
     catch (Exception Ex) 
     { 
      MessageBox.Show(Ex.Message, ""); 
     } 
    }   

    private OleDbConnection returnConnection(string fileName) 
    { 
     return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""); 
    } 

    private DataTable loadSingleSheet(string fileName, string sheetName) 
    {   
     DataTable sheetData = new DataTable(); 
     using (OleDbConnection conn = this.returnConnection(fileName)) 
     { 
      conn.Open(); 
      // retrieve the data using data adapter 
      OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); 
      sheetAdapter.Fill(sheetData); 
     }       
     return sheetData; 
    } 
+2

Docenić kod i OLEDB zdecydowanie ułatwia, ale muszę trzymać z Excelem Interop na razie. – user295197

0

Ta metoda nie działa dobrze, gdy ta sama kolumna w arkuszu kalkulacyjnym programu Excel zawiera zarówno tekst, jak i liczby. Na przykład, jeśli Range("A3")=Hello i Range("A7")=5 następnie odczytuje tylko cześć i wartość dla Range("A7") jest DBNULL

private void Form1_Load(object sender, EventArgs e) 
{ 
    try 
    {   
     DataTable sheetTable = loadSingleSheet(@"C:\excelFile.xls", "Sheet1$"); 
     dataGridView1.DataSource = sheetTable; 
    } 
    catch (Exception Ex) 
    { 
     MessageBox.Show(Ex.Message, ""); 
    } 
}   

private OleDbConnection returnConnection(string fileName) 
{ 
    return new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + "; Jet OLEDB:Engine Type=5;Extended Properties=\"Excel 8.0;\""); 
} 

private DataTable loadSingleSheet(string fileName, string sheetName) 
{   
    DataTable sheetData = new DataTable(); 
    using (OleDbConnection conn = this.returnConnection(fileName)) 
    { 
     conn.Open(); 
     // retrieve the data using data adapter 
     OleDbDataAdapter sheetAdapter = new OleDbDataAdapter("select * from [" + sheetName + "]", conn); 
     sheetAdapter.Fill(sheetData); 
    }       
    return sheetData;