c# - 读取 Excel 工作表时,如果列的值为数字,则数据表中返回 null

标签 c# asp.net

我正在从 Excel 工作表中读取值。列通常包含String,但有时也可能包含数值。将 Excel 工作表读入数据表时,数值被读取为空白。

它将 90004 读取为 null,但是如果我按数字对此列进行排序,它会读取数值并将字符串值指定为 null,如果我按字符串对此列进行排序然后它读取字符串值并将数字指定为空。

AC62614 abc     EA  MISC
AC62615 pqr     EA  MISC
AC62616 xyz     EA  MISC
AC62617 test    EA  90004
AC62618 test3   TO  MISC
AC62619 test3   TO  STEEL

我的代码:

    public static DataTable ReadExcelFile(FileUpload File1, string strSheetName)
    {
        string strExtensionName = "";
        string strFileName = System.IO.Path.GetFileName(File1.PostedFile.FileName);
        DataTable dtt = new DataTable();
        if (!string.IsNullOrEmpty(strFileName))
        {
            //get the extension name, check if it's a spreadsheet
            strExtensionName = strFileName.Substring(strFileName.IndexOf(".") + 1);
            if (strExtensionName.Equals("xls") || strExtensionName.Equals("xlsx"))
            {
                /*Import data*/
                int FileLength = File1.PostedFile.ContentLength;
                if (File1.PostedFile != null && File1.HasFile)
                {

                    //upload the file to server
                    //string strServerPath = "~/FolderName"; 
                    FileInfo file = new FileInfo(File1.PostedFile.FileName);
                    string strServerFileName = file.Name;
                    string strFullPath =     HttpContext.Current.Server.MapPath("UploadedExcel/" + strServerFileName);
                    File1.PostedFile.SaveAs(strFullPath);

                    //open connection out to read excel
                    string strConnectionString = string.Empty;
                    if (strExtensionName == "xls")
                        strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
                                                + strFullPath
                                                + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
                    else if (strExtensionName == "xlsx")
                        strConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                                                + strFullPath
                                                + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";

                    if (!string.IsNullOrEmpty(strConnectionString))
                    {
                        OleDbConnection objConnection = new OleDbConnection(strConnectionString);
                        objConnection.Open();
                        DataTable oleDbSchemaTable = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                        bool blExists = false;
                        foreach (DataRow dtr in oleDbSchemaTable.Rows)
                        {
                            //reads from the spreadsheet called 'Sheet1'
                            if (dtr["TABLE_NAME"].ToString() == "" + strSheetName + "$")
                            {
                                blExists = true;
                                break;
                            }
                        }
                        if (blExists)
                        {
                            OleDbCommand objCmd = new OleDbCommand(string.Format("Select * from [{0}$]", strSheetName), objConnection);
                            OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
                            objAdapter1.SelectCommand = objCmd;
                            DataSet objDataSet = new DataSet();
                            objAdapter1.Fill(objDataSet);
                            objConnection.Close();
                            dtt = objDataSet.Tables[0];
                        }

                    }
                }
            }
        }
        return dtt;
    }

最佳答案

如果将连接字符串中的 IMEX=2 更改为 IMEX = 1,则列将被解释为文本。然后您可以获取Sheet的所有数据并使用Int32.TryParse()检查该值是否为数字。

关于c# - 读取 Excel 工作表时,如果列的值为数字,则数据表中返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31510918/

相关文章:

javascript - 非常大的html页面: Need pointers on implementing a virtual scrolling

c# - Windows 窗体按钮。已启用无法正常工作

c# - 更改 System.Globalization.NumberFormatInfo 中的货币符号位置

c# - Windows Store Apps,使用线程下载多个文件

c# - 当设置 View 不验证的规则时,MVC 具有流畅的验证

c# - Web Api 2 RESTFUL 图片上传

c# - 我是否只需要在 Mock 对象上显式设置预期的返回值?

c# - 保存数据后如何更新gridview?

asp.net - 如何使用 ASPX NET C# 从浏览器查看当前 URL?

javascript - 回发后保持控制背景颜色