【问题标题】:c# wrong reading from excel with oledb时间:2019-01-03 标签:c#使用oledb从excel读取错误
【发布时间】:2021-10-12 01:38:21
【问题描述】:
 private void OnCreated(object sender, FileSystemEventArgs e)
        {
            excelDataSet.Clear();
            string extension = Path.GetExtension(e.FullPath);
            if (extension == ".xls" || extension == ".xlsx")
            {
                string ConnectionString = "";
                if (extension == ".xls") { ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = '" + e.FullPath + "';Extended Properties=\"Excel 8.0;HDR=YES;\""; }
                if (extension == ".xlsx") { ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = '" + e.FullPath + "';Extended Properties=\"Excel 12.0;HDR=YES;\""; }

                using (OleDbConnection conn = new OleDbConnection(ConnectionString))
                {
                    conn.Open();
                    OleDbDataAdapter objDA = new OleDbDataAdapter("select * from [Sheet1$]", conn);
                    objDA.Fill(excelDataSet);
                    conn.Close();
                    conn.Dispose();
                }
            }
        }

这是我的代码。当我的文件观察器触发时它正在工作。问题是我读取的 excel 文件有 1 个标题行和 3 个具有值的行。当我使用此代码并检查我的数据集行数时,我得到 9 .. 我不知道它从哪里得到 9,我做错了什么吗?我正在检查我的代码最后 30-35 分钟,但仍然找不到我做错了什么.. 我得到了列的权利,但行不工作。顺便说一句,我不需要标题行

更新:我的示例 excel 文件有 3 行,我得到 9 作为行数。我只是复制了这些行并使我的文件成为 24 行 + 1 个标题行,当我执行 rows.count 时,我得到 24 作为答案。所以效果很好?这正常吗?

【问题讨论】:

  • 通过 OleDb 进行未过滤选择时,Excel 中已删除的行可能会显示为现有行。如果您知道某个列将在 excel 中包含数据,请在该列中添加 where 子句

标签: c# oledbconnection


【解决方案1】:

有一个名为 Linq to Excel 的 Nuget。我在几个项目中使用了这个nuget来查询.csv和.xlsx文件中的数据没有任何困难,很容易实现。它的性能可能很差,但它可以解决您的问题。

这里是Linq to Excel的文档

【讨论】:

  • 感谢链接,我搜索并找到了更多关于 linq to excel 的文档并使用它。现在一切正常
【解决方案2】:

我强烈建议你看看 EPPLUS 库https://github.com/JanKallman/EPPlus/wiki

在我找到 EPPLUS 之前,我在 oledb 上遇到了很多麻烦。它真的很容易用于创建和更新 excel 文件。那里有很多很好的例子,比如来自How do i iterate through rows in an excel table using epplus?

var package = new ExcelPackage(new FileInfo("sample.xlsx"));

ExcelWorksheet workSheet = package.Workbook.Worksheets[1];
var start = workSheet.Dimension.Start;
var end = workSheet.Dimension.End;
for (int row = start.Row; row <= end.Row; row++)
{ // Row by row...
    for (int col = start.Column; col <= end.Column; col++)
    { // ... Cell by cell...
        object cellValue = workSheet.Cells[row, col].Text; // This got me the actual value I needed.
    }
}

【讨论】:

  • 不能使用任何额外的 dll。我使用的是 excel interop,但我发现没有 excel 就无法使用它,因为它使用的是 excel dll。而且我写的程序会在服务器上运行,所以机器上不会有excel
猜你喜欢
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多