C# 通过C.NET从Excel 97-2003电子表格中提取单个单元格或单元格范围

C# 通过C.NET从Excel 97-2003电子表格中提取单个单元格或单元格范围,c#,asp.net,excel,C#,Asp.net,Excel,我正在开发一个基于web的应用程序,需要从excel 97-2003.xls电子表格中提取数据,该电子表格在一张工作表上有多个小表格 我目前正在尝试使用以下代码打开并阅读工作表: string properties = String.Format(@"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\Users\Macy\Desktop\lbr_ems.xls; Extended Properties = 'Exce

我正在开发一个基于web的应用程序,需要从excel 97-2003.xls电子表格中提取数据,该电子表格在一张工作表上有多个小表格

我目前正在尝试使用以下代码打开并阅读工作表:

            string properties = String.Format(@"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\Users\Macy\Desktop\lbr_ems.xls; Extended Properties = 'Excel 8.0;'");

        using (OleDbConnection conn = new OleDbConnection(properties))
        {
            string worksheet = "LbrRpt";
            conn.Open();
            DataSet ds = new DataSet();
            //string columns = String.Join(",", columnNames.ToArray());
            using (OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [" + worksheet + "$]", properties))
            {
                DataTable dt = new DataTable();
                da.Fill(dt);
                ds.Tables.Add(dt);

                grdComponent.DataSource = dt;
                grdComponent.DataBind();
            }
问题是它会拖拽整个工作表,而所有的数值都是空白的。我认为这不是我试图构建的应用程序所需要的代码

我一直在看这个代码:

    Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(workbookPath, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Excel.Sheets excelSheets = excelWorkbook.Worksheets;
string currentSheet = "Sheet1";
Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item(currentSheet);
var cell = (Excel.Range)excelWorksheet.Cells[10, 2];
然而,根据,我相信它可能不适合基于web的使用,因为没有提到.net,或者我在某个地方遗漏了一个using子句

我看到的大多数其他解决方案通常都表示使用第三方项目


我是否遗漏了一些简单的愚蠢的东西,或者只是找不到正确的位置?

当使用SQL从Excel读取数据时,您不必严格限制将工作表用作from子句的主题:

挑选* 从[Sheet1$] 您可以使用Excel支持的任何寻址方案。例如,您可以引用一系列单元格:

挑选* 自[表1$A1:C172] 您可以将范围的开始和结束设置为同一单元格,以返回单个单元格:

挑选* 自[表1$A1:A1] 您还可以参考一系列列:

挑选* 自[表1$A:B] 或一系列行:

挑选* 从[表1$1:5] 或指定的范围:

挑选* 来自NamedRange
请注意,如果连接字符串中的HDR=Yes,则第一行将被视为列标题。

如果决定使用第二个示例,则必须添加对Microsoft.Office.Interop.Excel的引用以及对其的using语句!可能是相关问题-如果字段实际上是文本,Excel需要一个数字。您可以修改SQL语句以返回特定列:SELECT*FROM[+工作表+$a]或特定范围:SELECT*FROM[+工作表+$A1:C172]。@Suppe,我尝试添加该字段,但它向我抛出了一个错误。Microsoft中不存在Office。我想项目中并没有安装什么东西来让它工作。因为这是一个现有的项目,而我是初级开发人员,所以我必须在负责人的带领下深入研究。@ZevSpitz,它工作得非常好!你的第二个评论解决了这两个问题!请把它作为一个答案,这样我就可以标记它,给你的信用!为清晰和完整起见,在最后一个示例中,NamedRange是一个可以在括号中包含前面任何示例的字符串吗?@IngramYates Excel允许定义一个称为命名范围的内容—一个具有名称的单元格范围—您可以通过引用SQL中的名称来处理该特定范围。我刚刚测试过,您不能通过列/行/单元格地址进一步限制命名范围。WRT方括号-方括号在SQL中用于引用带有特殊字符的表名或字段名,例如$or:。如果命名区域有一个特殊字符或SQL关键字,它也需要括号。例如,如果我在Excel中设置一个城市列表,用于其中一张工作表的下拉列表,我可以给它一个名称,然后在我的SQL中用该名称调用它,而不必使用特定的单元格区域?如果我必须添加一行或一列,导致命名范围移动,那么这会继续吗?@IngramYates是的。我刚刚测试过,当插入新行时,命名的范围会移动/扩展。