在c#中从XLSX读取数据

时间:2011-05-04 15:40:37

标签: c# excel ado.net xlsx

我是c#的新手,正在尝试使用以下代码在c#中读取XLSX文件:

string Connection = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=c:\\Temp\\source.xlsx;Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1\";";

//code to read the content of format file 
OleDbConnection con = new OleDbConnection(Connection);
OleDbCommand command = new OleDbCommand();

DataTable dt = new DataTable();
OleDbDataAdapter myCommand = new OleDbDataAdapter("select * from [Tabelle1$]", con);

myCommand.Fill(dt);
Console.Write(dt.Rows.Count);

我从输出中得到了正确的计数,但我还有两个问题:

1.如何选择where语句(如何访问行)?

 select * from [Tabelle1$] where A = '123' (A being an existing Excel row)

会引发错误提及错误的参数......

2.可以为任何人提供教程链接或简短示例如何访问数据吗?

3 个答案:

答案 0 :(得分:19)

请参阅以下示例代码:

private DataTable LoadXLS(string strFile, String sheetName, String column, String value)
{
    DataTable dtXLS = new DataTable(sheetName);

    try
    {
       string strConnectionString = "";

       if(strFile.Trim().EndsWith(".xlsx")) {

           strConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", strFile);

       } else if(strFile.Trim().EndsWith(".xls")) {

           strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";", strFile);

       }

       OleDbConnection SQLConn = new OleDbConnection(strConnectionString);

       SQLConn.Open();

       OleDbDataAdapter SQLAdapter = new OleDbDataAdapter();

       string sql = "SELECT * FROM [" + sheetName + "$] WHERE " + column + " = " + value;

       OleDbCommand selectCMD = new OleDbCommand(sql, SQLConn);

       SQLAdapter.SelectCommand = selectCMD;

       SQLAdapter.Fill(dtXLS);

       SQLConn.Close();
    }

    catch (Exception e)
    {
       Console.WriteLine(e.ToString());
    }

    return dtXLS;

}

答案 1 :(得分:1)

我个人觉得很难使用OleDbConnections读取Excel电子表格。因此,我想提供一个很棒的开源免费ExcelMapper 替代方案。

与OLE查询相比,它提供了一种更加简洁(即可读)的读取Excel文件的方式。

1。给定一个Excel文件

enter image description here

2。创建一个Person C#对象:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

3。使用ExcelMapper进行阅读

  var fileName = @"C:\Temp\Names.xlsx"; // your excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>();

您还可以通过简单地传入一个额外的工作表参数来读取其他工作表:

  var fileName = @"C:\Temp\Names.xlsx"; // your excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>("Sheet2");

您可以使用NuGet进行安装

Install-Package ExcelMapper

免责声明:我没有与ExcelMapper关联,但是在尝试了各种不同的库之后,我发现该库最容易使用。

规则:“ 2。任何人都可以向我提供教程链接或简短的示例如何访问数据”

以下是简短的video,上面显示了上面的内容。

instructional video - how to read excel files in c#

答案 2 :(得分:0)

我知道这是一个古老的问题,答案很好,但是此页面在Google的“导入xlsx c#”结果中排名很高,因此我想添加一种更现代,更简单的方法来使用NPOI库读取xls / xlsx数据。我想确保新的C#开发人员知道,与使用ado.net相比,有一种更简单的方法来导入Excel数据。

我结合使用了NPOI和Npoi.Mapper(来自donnytian:https://github.com/donnytian/Npoi.Mapper)来轻松导入Excel文件。添加对NPOI和Npoi.Mapper的nuget引用,然后就可以使用强类型化类来导入xls / xlsx数据,这些类直接与要导入的列相关。

```使用System.IO; 使用System.Linq; 使用Npoi.Mapper; 使用Npoi.Mapper.Attributes; 使用NPOI.SS.UserModel; 使用UserManagementService.Models;

命名空间JobCustomerImport.Processors {     公共类ExcelEmailProcessor     {         私人UserManagementServiceContext DataContext {get; }

    public ExcelEmailProcessor(int customerNumber)
    {
        DataContext = new UserManagementServiceContext();
    }

    public void Execute(string localPath, int sheetIndex)
    {
        IWorkbook workbook;
        using (FileStream file = new FileStream(localPath, FileMode.Open, FileAccess.Read))
        {
            workbook = WorkbookFactory.Create(file);
        }

        var importer = new Mapper(workbook);
        var items = importer.Take<MurphyExcelFormat>(sheetIndex);
        foreach(var item in items)
        {
            var row = item.Value;
            if (string.IsNullOrEmpty(row.EmailAddress))
                continue;

            UpdateUser(row);
        }

        DataContext.SaveChanges();
    }

    private void UpdateUser(MurphyExcelFormat row)
    {
        //LOGIC HERE TO UPDATE A USER IN DATABASE...
    }

    private class MurphyExcelFormat
    {
        [Column("District")]
        public int District { get; set; }

        [Column("DM")]
        public string FullName { get; set; }

        [Column("Email Address")]
        public string EmailAddress { get; set; }

        [Column(3)]
        public string Username { get; set; }

        public string FirstName
        {
            get
            {
                return Username.Split('.')[0];
            }
        }

        public string LastName
        {
            get
            {
                return Username.Split('.')[1];
            }
        }
    }
}

} ```

如果您有兴趣,我已经在我的博客How to easily import excel files中介绍了一些要点。

谢谢! 丹