OleDB读取Myxls生成的Excel文本,结果只能读取到第一列的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OleDB读取Myxls生成的Excel文本,结果只能读取到第一列的值相关的知识,希望对你有一定的参考价值。

利用第三方插件Myxls生成了excel文本,然后用OleDB方式连接该Excel文本,读取数据,结果只能读取到第一列的值。
将该Excel文本打开,另存一份,再用OleDB去读数据,就能够读取到所有的,说明OleDB连接及读取方式不存在问题,应该是Excel本身的原因。
是不是第三方插件导致的Excel格式问题导致不能读取,如何解决呢?谢谢

参考技术A OLEDB....

先创建连接对象:
set cnt=CreateObject("ADODB.Connection")

再连接
cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES';Data Sourece='x:\xxxx.xls'

然后执行
rec = cnt.Execute ("Select * from [Sheet1$] where ....")

关于提到的:Excel 另存一份就能正常打开嘛……
目前想到两个思路:
1、确认下 MyXls 输出的 xls 文件版本,然后修改 OLEDB 的 ConnectionString
2、如果 MyXls 输出的文件确实和 Excel 另存的不大一样的话,可以考虑写个 VBA 代码来完成 Excel 另存的操作。

关于oledb对Excel的读取(转)

这两天项目需求要检索excel的内容,于是就研究了一下,话不多说,我就直接贴代码1.首先是连接excel。

复制代码
public DataTable SearchSheetToDT(string strSearch, string sheetName)
        {
            //文件路径
            string path = Server.MapPath("~/Content/custom/Excel1.xlsx");
            //连接表字符串
            string ExcelConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + @path + ";Extended Properties=\'Excel 12.0;HDR=Yes;IMEX=2;ImportMixedTypes=Text\'";
            using (OleDbConnection ole_conn = new OleDbConnection(ExcelConnection))
            {
                ole_conn.Open();
                using (OleDbCommand ole_cmd = ole_conn.CreateCommand())
                {
                    ole_cmd.CommandText = strSearch;
                    OleDbDataAdapter adapter = new OleDbDataAdapter(ole_cmd);
                    DataSet ds = new DataSet();
                    adapter.Fill(ds, sheetName);//sheetName就是excel里的sheet表名
                    DataTable dt = new DataTable();
                    dt = ds.Tables[0];
                    return dt;
                }
            }
        }
复制代码

简单解释一下连接字符串
HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES
IMEX 参数因为不同的模式代表著不同的读写行为:
  当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
  当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
  当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
Provider=Microsoft.ACE.OLEDB.12.0;这说明是excel2007以上的版本,xls文件一般都是03版本,Provider=Microsoft.Jet.OLEDB.4.0; 
详情连接字符根据版本怎么写可以参照网站:http://www.connectionstrings.com/excel/
在写的时候可能出现“找不到可安装的ISAM ”这个时候出现这种情况多可能是你的连接语句缺斤少两了,你仔细检查Extended Properties=\'Excel 12.0;HDR=Yes;IMEX=2\'"这个是不是少了分号什么的,我当时出错是因为Data Source这个,少了一个空格,写成了DataSource,找了好久。如果你确定真真没错,那就看看电脑有没有excel,重新安装ISAM呗。具体得操作步骤:在“运行”对话框中输入以下内容:Regsvr32 c:\\WINDOWS\\system32\\msexcl40.dll  然后回车
之后就没问题,连接上了。就看操作语句

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public bool SearchIndexSheet(string k)
        {
            string strIndex = "select * from [sheet1$]";//这里sheet1就是你的表名是什么就写什么,例如学生表就是 学生表$
            string sheetName = "[sheet1$]";
            DataTable indexdt = new DataTable();
            //读取excel
            indexdt = SearchSheetToDT(strIndex, sheetName);
            //indexdt.DefaultView.RowFilter = "列名1=\'上证A股指数\'";
            //查询条件
            var reslut = indexdt.Select("列名1=\'" + k + "\' or 列名2=\'" + k  + "\'").ToList();
           if (reslut.Count != 0)
            {
                return true;
            }
            else return false;
        }

 

  可能有些人会直接写string strIndex = "select * from [sheet1$] where [列名1]=\'"+k"\'";这个也是可以的,只是有时候会报错
例如这种错误 标准表达式中数据类型不匹配  ,不是因为你语句写错了,而是因为excel中有表达式,所以我就把数据取出来放在datatable里了。
基本上对于excel的读取就这样了。
这算是导入吧,导出还没写过。

 

复制代码
     /// <summary>
        /// 查询文档-字段返回查询
        /// </summary>
        /// <param name="k"></param>
        /// <returns></returns>
        public List<DataRow> SearchMatchSheet(string k)
        {
            string strMatch = "select * from [<span style="line-height: 19.2000007629395px;">表名1</span>$]";
            string sheetName = "[表名1$]";
            DataTable matchdt = new DataTable();
            matchdt = SearchSheetToDT(strMatch, sheetName);
            var reslut = matchdt.Select("列名1=\'" + k  + "\'").ToList();
            return reslut;
        }

 

 

以上是关于OleDB读取Myxls生成的Excel文本,结果只能读取到第一列的值的主要内容,如果未能解决你的问题,请参考以下文章

Excel、OleDb 和前导零

MyXls导出Excel的各种设置

MyXls导出Excel的各种设置

将 excel 列作为文本读取

使用 OLEDB 从 Excel 中读取数据

如何在使用 Oledb 的其他用户使用时读取 excel?