当前位置: 代码迷 >> C# >> C# 用OleDb读取Excel内容不全?
  详细解决方案

C# 用OleDb读取Excel内容不全?

热度:32   发布时间:2016-05-05 02:37:48.0
求助:C# 用OleDb读取Excel内容不全??
本人在做个考试系统,试题导入题库时出现这样情况:
用OleDb进行Excel内容导入数据库,在用OleDb读取数据时发现有些字符串过长时读取不全,比如:
Excel单元格内容:上海,简称“沪”或“申”,中国第一大城市,中华人民共和国直辖市之一,中国国家中心城市,中国的经济、金融中心,繁荣的国际大都市,拥有中国大陆首个自贸区“中国(上海)自由贸易试验区”。
上海地处长江入海口,东向东海,隔海与日本九州岛相望,南濒杭州湾,西与江苏、浙江两省相接,共同构成以上海为龙头的中国最大经济区“长三角经济圈”。上海拥有深厚的近代城市文化底蕴和众多历史古迹,江南的吴越传统文化与各地移民带入的多样文化相融合,形成了特有的海派文化。2010年成功举办了2010年世界博览会。

但是读取到的字符串只有:上海,简称“沪”或“申”,中国第一大城市,中华人民共和国直辖市之一,中国国家中心城市,中国的经济、金融中心,繁荣的国际大都市,拥有中国大陆首个自贸区“中国(上海)自由贸易试验区”。上海地处长江入海口,东向东海,隔海与日本九州岛相望,南濒杭州湾,西与江苏、浙江两省相接,共同构成以上海为龙头的中国最大经济区“长三角经济圈”。上海拥有深厚的近代城市文化底蕴


由于Excel里面内容不规则,所以不好用CSV格式,请问有谁碰到这样问题?具体如何解决的,谢谢!!!

------解决思路----------------------
我做了实验,能全取出来。VB2008。Excel2007
新建立一个Excel,单元格A1里面敲入字符串“aaa”,单元格A2里面贴入你的例子,
执行程序以后,VB窗体内的TextBox1里面的内容可以显示到 2010年成功举办了2010年世界博览会。
代码

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As New OpenFileDialog
        With frm
            .ShowDialog()

            If .FileName <> "" Then
                Dim strCon As String = ""
                If .FileName.EndsWith(".xlsx") Then
                    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & .FileName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
                Else
                    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & .FileName & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
                End If

                Dim strSQL As String = "SELECT * FROM [Sheet1$]"

                Using adp As New Data.OleDb.OleDbDataAdapter(strSQL, strCon), dtbRet As New DataTable
                    adp.Fill(dtbRet)
                    TextBox1.Text = dtbRet.Rows(0)(0)
                End Using
            End If
        End With
    End Sub

------解决思路----------------------
引用:
Quote: 引用:

是不是你导出数据表的字段设置的长度不够,自动给截取掉了。

我是在读取Excel的时候以Message输出的,同样的有丢失,而数据表字段我是设置了nvarchar(MAX)


nvarchar(MAX) 的max好像是8000,我导入过excel,基本不会丢数据的。

你试试3楼的代码吧。对比你的,看有什么问题。

其实最好还是你在你代码处设置断点调试,看看读取excel的值到底是多少。
------解决思路----------------------

 public static void Main(string[] args)
        {
            QueryCSV();

            Console.ReadLine();
        }

        public static void QueryCSV()
        {
            //文件路径
            string tableName = "file.csv";
            string filePath = AppDomain.CurrentDomain.BaseDirectory;

            string pContent = string.Empty;

            OleDbConnection oledbConn = new OleDbConnection();
            OleDbCommand oledbCmd = new OleDbCommand();
            OleDbDataReader dataReader;
            try
            {
                //两种连接方式皆可
                //string strConnOledb = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";
                string strConnOledb="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
                strConnOledb += filePath;
                strConnOledb += ";Extended Properties='Text;HDR=Yes;IMEX=1;'";

                oledbConn.ConnectionString = strConnOledb;
                oledbConn.Open();
                StringBuilder commandText = new StringBuilder("SELECT ");
                commandText.AppendFormat("* From {0}", tableName);
                oledbCmd.Connection = oledbConn;
                oledbCmd.CommandText = commandText.ToString();
                dataReader = oledbCmd.ExecuteReader();

                
                while (dataReader.Read())
                {
                    pContent = Convert.ToString(dataReader["content"]);
                }
                dataReader.Close();
            }
            catch (System.Exception ex)
            {
                oledbConn.Close();
            }
            finally
            {
                oledbConn.Close();
            }

            Console.WriteLine(pContent);
        }


完全没有问题,没有出现你说的那种情况。给你来个截图:

------解决思路----------------------
引用:
Quote: 引用:

我做了实验,能全取出来。VB2008。Excel2007
新建立一个Excel,单元格A1里面敲入字符串“aaa”,单元格A2里面贴入你的例子,
执行程序以后,VB窗体内的TextBox1里面的内容可以显示到 2010年成功举办了2010年世界博览会。
代码

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As New OpenFileDialog
        With frm
            .ShowDialog()

            If .FileName <> "" Then
                Dim strCon As String = ""
                If .FileName.EndsWith(".xlsx") Then
                    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & .FileName & ";Extended Properties=""Excel 12.0 Xml;HDR=Yes"";"
                Else
                    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & .FileName & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
                End If

                Dim strSQL As String = "SELECT * FROM [Sheet1$]"

                Using adp As New Data.OleDb.OleDbDataAdapter(strSQL, strCon), dtbRet As New DataTable
                    adp.Fill(dtbRet)
                    TextBox1.Text = dtbRet.Rows(0)(0)
                End Using
            End If
        End With
    End Sub


上面单元内容是个例子,是表面这个情况,格子字数未足够长的,我自己求证过,如果字数超260就出现不全了,麻烦你再试试数字超过300的看看?

试过了,我偷懒,把你的例子在A2单元格里复制粘贴了5遍,通过上面的代码还是能正常读出到最后一句话的,大概读出来1000多个字吧。
------解决思路----------------------
引用:
Quote: 引用:


 public static void Main(string[] args)
        {
            QueryCSV();

            Console.ReadLine();
        }

        public static void QueryCSV()
        {
            //文件路径
            string tableName = "file.csv";
            string filePath = AppDomain.CurrentDomain.BaseDirectory;

            string pContent = string.Empty;

            OleDbConnection oledbConn = new OleDbConnection();
            OleDbCommand oledbCmd = new OleDbCommand();
            OleDbDataReader dataReader;
            try
            {
                //两种连接方式皆可
                //string strConnOledb = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";
                string strConnOledb="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
                strConnOledb += filePath;
                strConnOledb += ";Extended Properties='Text;HDR=Yes;IMEX=1;'";

                oledbConn.ConnectionString = strConnOledb;
                oledbConn.Open();
                StringBuilder commandText = new StringBuilder("SELECT ");
                commandText.AppendFormat("* From {0}", tableName);
                oledbCmd.Connection = oledbConn;
                oledbCmd.CommandText = commandText.ToString();
                dataReader = oledbCmd.ExecuteReader();

                
                while (dataReader.Read())
                {
                    pContent = Convert.ToString(dataReader["content"]);
                }
                dataReader.Close();
            }
            catch (System.Exception ex)
            {
                oledbConn.Close();
            }
            finally
            {
                oledbConn.Close();
            }

            Console.WriteLine(pContent);
        }


完全没有问题,没有出现你说的那种情况。给你来个截图:


我明白你的意思,你试试在Excel前面十行的字符串不超过50个字符,然后在11行后的字符串超过260个字符,试试这样读取行不行?我试过的,在前面8行前,如果字符串不超过260个字符的,后面如果有超过就读取不全了,而如果在前8行有字符串超过260个字符,后面如果有同等长度字符串,还是能读全的。所以,我判断你的长字符串是放在EXCEL的前8行了,要不你按照我说的再试试?起码你也碰到这样问题了,提前为以后准备,呵呵

我试了 也没出现你说的那种情况啊 难道是我试得不对 还有如果你真的出现这种情况 你把你Excel里面的内容用引号包起来在试试
  相关解决方案