【问题标题】:Oledb skips the first column of excel fileOledb跳过excel文件的第一列
【发布时间】:2017-05-02 08:12:28
【问题描述】:

当我尝试使用 OLEDB 将 Excel 文件保存到 C# 上的 DataTable 时遇到问题。

DataTable 没有我的 Excel 文件的第一列,但有一个额外的空列作为最后一列。我不知道我做错了什么。如果我的 Excel 文件有这样的内容:

身份证、姓名、地址

DataTable 列是:

姓名、地址、F3(空)

这是我的功能:

    public DataTable GetExcel(string[] files, string sheetName, string pathName)
    {
        for (int i = 0; i < files.Length; i++)
        {
            string strConn = string.Empty;
            if (string.IsNullOrEmpty(sheetName)) { sheetName = "Sheet1"; }
            FileInfo file = new FileInfo(files[i]);
            if (!file.Exists) { throw new Exception("Error, file doesn't exists!"); }
            string extension = file.Extension;
            switch (extension)
            {
                case ".xls":
                    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + file + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                    break;
                case ".xlsx":
                    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
                    break;
                default:
                    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + file + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                    break;
            }
            OleDbConnection cnnxls = new OleDbConnection(strConn);
            OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), cnnxls);
            oda.Fill(dataTable);
        }
        return dataTable;
    }

谢谢!

【问题讨论】:

  • 在调用oda.Fill(dataTable)之前自己创建列,例如dataTable.Columns.Add("Name", typeof(string)
  • 它不起作用,我还有一个空的最后一列,它错过了第一列。非常感谢。
  • 适配器从查询中猜测表列,有时会发生类似的事情。你知道你的细胞的范围吗?如果你这样做,你可以像这样查询表:string.Format("select * from [{0}$A1:C200]", sheetName)
  • 为什么不只选择整个工作表?
  • @Nino 我永远不会知道范围,无论如何我都试过了,现在没有创建一个空列但仍然错过了第一个列,谢谢。

标签: c# excel oledb


【解决方案1】:

最终问题出在 Excel 文件上,我只是使用另一台计算机将所有内容复制到另一个 Excel 文件中并工作。我不知道出了什么问题。

我希望我可以帮助别人。

感谢您的回答。

【讨论】:

    【解决方案2】:

    我不知道这是否发生在你身上,但我希望可以帮助其他人。 当我遇到这个错误时,是因为我的 csv 文件在它的开头有一个空格,这使得 Excel 忽略它之后的所有内容 - 这是我想要使用的整个字符串(出于某种原因,Excel 忽略了空格之后的所有内容在 C# 中)。

    您可以使用 Trim,或者如果您想更安全,请使用此正则表达式来仅定位单词、数字和更多字符:

    string s = file.ToString().Trim();
    string s = new Regex(@"(\w|[0-9]|\\|\/|\.|\:)+").Match(file.ToString()).Value;
    

    【讨论】:

      【解决方案3】:

      在 Excel 的第一列写入一个值后,它起作用了。当在第一列上找不到数据时,它似乎会跳过它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多