2010-03-16 60 views
5

我有一個Excel電子表格,它將坐在網絡共享驅動器上。它需要被我的Winforms C#3.0應用程序訪問(許多用戶可能正在使用該應用程序並同時觸擊該電子表格)。一張工作表上有很多數據。這些數據被分解成我已經命名爲範圍的區域。我需要能夠單獨訪問這些範圍,將每個範圍作爲數據集返回,然後將其綁定到網格。將Excel範圍轉換爲ADO.NET DataSet或DataTable等

我發現使用OLE的例子,並得到這些工作。但是,我已經看到了有關使用此方法的一些警告,並且在工作中我們一直使用Microsoft.Office.Interop.Excel作爲標準。除非必須,否則我不想偏離這一點。就我所知,我們的用戶將使用Office 2003。

我能得到我需要用下面的代碼範圍:

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

的OLE方式是不錯的,因爲它會採取我的第一行,並把這些成列。我的範圍(總共12個)在大多數情況下在列數上彼此不同。不知道這個信息是否會影響任何建議。

有什麼辦法可以使用Interop並將返回的範圍返回到數據集?

回答

2

我不知道有關的內置功能,但它不應該是很難把它寫自己。僞代碼:

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

我很欣賞所有的迴應。由於我找不到任何內置的東西,我繼續前進,只是在範圍內滾動並創建了一個數據表。這裏列出的所有建議都會起作用,這只是我不想使用OLEDB,現在我無法引入第三方庫。感謝您的快速回復。非常感激。 – user295197 2010-03-18 14:41:43

+0

這是僞代碼... – 2013-02-15 03:26:11

0

說到讀寫Excel 2003 XLS文件,值得看看NPOI。 NPOI是一種拯救生命的方式。

我想你必須迭代你的範圍,並創建DataRows放入你的DataTable。

StackOverflow上這個問題提供了更多的資源:

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

+0

我會記住這一點對未來的項目。截至目前,我無法將一個新庫引入到我們的應用程序中。 – user295197 2010-03-22 16:16:17

2

我不知道你have.But的Excel數據何種類型的數據顯示一樣在這個環節上http://www.freeimagehosting.net/image.php?f8d4ef4173.png,您可以使用下面的代碼加載到數據表。

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

欣賞代碼和OLEDB絕對讓它變得簡單,但我現在需要堅持使用Excel Interop。 – user295197 2010-03-18 14:43:00

0

當Excel電子表格中的同一列包含文本和數字時,此方法無法正常工作。舉例來說,如果Range("A3")=HelloRange("A7")=5那麼它只能讀取您好,爲Range("A7")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;