2010-03-16 59 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;