【问题标题】:Using .NET to get data from Excel as a database使用 .NET 从 Excel 中获取数据作为数据库
【发布时间】:2009-09-15 12:00:59
【问题描述】:

我想使用 .NET 从 Excel 文件中获取数据 正在使用 Excel 文件,所以我无法打开它。我所做的是使用 OleDB 将其作为数据源连接到它。

问题是我得到了一个单元格的数据而不是它的样式。 Excel 中的日期值在 .NET 中更改为日期时间格式,在 Excel 中设置为货币的单元格在 .NET 中显示为整数。使用 OleDB 从 Excel 导出数据时,您不知道单元格是否包含日期、货币等。例如,如果单元格设置为文本并包含从零开始的五位数字,您将只得到四位数字。

我正在寻找一种方法来获取数据,就像您在 Excel 中查看数据时所显示的一样。

使用 .NET 3.5 和 Excel 2007。

【问题讨论】:

    标签: .net excel oledb


    【解决方案1】:

    为了找出列的数据类型,你必须使用 FillSchema 方法:

    OleDbConnection conn = new OleDbConnection(...);
    conn.Open();
    
    DataSet dataSet = new DataSet();
    OleDbDataAdapter dataAdapter = new OleDbDataAdapter("SELECT * FROM <table>", conn);
    dataAdapter.FillSchema(dataSet, SchemaType.Source);
    dataAdapter.Fill(dataSet);
    
    //Now you can access the data type like this
    dataSet.Tables[0].Columns[0].DataType
    

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 谢谢,但这些都不能解决我的问题。我知道如何使用 OleDB 连接到 Excel,但我得到的数据不完整,因为我不知道每个单元格的格式类型。
      • OP 真正要求确定单元格格式(指问题中的样式),而不是如何通过 OLEDB 连接。虽然如果您阅读 Mitch 提供的 4 个链接,这也会给您答案。
      【解决方案3】:

      SpreadsheetGear for .NET 可以打开 Excel 2007 xlsx 工作簿,而 Excel 2007 会打开该工作簿。

      Excel 将日期、时间、货币、数字等存储为数字(C# 双精度)。数字格式通知 Excel 如何显示数字。 Excel 和 SpreadsheetGear 具有返回格式化文本的属性 - Excel 中的 Range.Text 和 SpreadsheetGear 中的 IRange.Text。

      SpreadsheetGear 还有一个属性,它告诉您单元格的数字格式的类型,因此您可以确定单元格是否格式化为日期、货币等...如果这对您的应用程序很重要。有关详细信息,请参阅 IRange.NumberFormatType 属性。

      如果您想试用,可以下载免费试用版here

      免责声明:我拥有 SpreadsheetGear LLC

      【讨论】:

      • 谢谢乔。我一定会试一试您的产品并会报告。
      【解决方案4】:

      要连接到 excel 文件,您需要适当的连接字符串:

      string connString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=<YourExcelPath>;Extended Properties=\"Excel 12.0;HDR=YES;\"";
      

      使用OleDb类从文件中查询信息后:

      string selectCmd = "SELECT * FROM <SheetName>";
      
      using(OleDbConnection excelConn = new OleDbConnection(connString))
      {
          excelConn.Open(); 
          OleDbCommand command = new OleDbCommand(selectCmd, excelConn);
          OleDbDataAdapter da = new OleDbDataAdapter(command);
      
          DataTable sheetInfo = new DataTable();
          dataAdapter.Fill(sheetInfo);
      
          //Do something with the data.
      }
      

      因此,您需要将“YourExcelPath”替换为您的 Excel 文件的路径,将“SheetName”替换为您要检索数据的工作表的名称。

      【讨论】:

        【解决方案5】:

        它并不漂亮,但您可以在 Excel 应用程序上使用 COM Interop 来读取工作表。

        这将允许您访问任何您喜欢的单元格,但更容易出错。

                System.Reflection.Missing ms = System.Reflection.Missing.Value;
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
                xlApp.Visible = true;
                Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Open(@"C:\Demo.xlsx", ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms, ms);
                Microsoft.Office.Interop.Excel.Worksheet xlSheet = xlBook.Sheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
                Microsoft.Office.Interop.Excel.Range rng = xlSheet.Cells[1, 1] as Microsoft.Office.Interop.Excel.Range;
                System.Console.WriteLine(String.Format("{0} {1} {2}", rng.Value2, rng.Text, rng.NumberFormat));
                xlBook.Close(false, ms, ms);
                xlApp.Quit();
        
                System.Console.ReadLine();
        

        【讨论】:

        • 问题是寻求一种使用 OLEDB 确定单元格格式的方法,而不是如何使用另一种方法(例如 com interop)。
        【解决方案6】:

        You can use IMEX=1 in the connection string 强制将所有列作为文本读取,而不是让 OleDB 尝试推断数据类型。

        我相信这会尊重包含数值的单元格的格式,但会留给您进行测试和确认。

        【讨论】:

          猜你喜欢
          • 2015-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-14
          • 2012-03-04
          • 2016-11-21
          相关资源
          最近更新 更多