C# oleDb方法读取Excel文件(我草 牛逼啊兄弟,我服了)select * from [计划上sheet$A3:D8]
今天学习的是从FTP上下载Excel文件,DataTable接收数据之后,在DataTable中通过筛选,删减修改之后把数据插入到DB相应表中。
优点:读取方式简单、读取速度快
缺点:除了读取过程不太灵活之外,这种读取方式还有个弊端就是,当Excel数据量很大时。会非常占用内存,当内存不够时会抛出内存溢出的异常。
命名空间:using System.Data.OleDb;
另注:
参数:HDR=NO/YES
OleDb读入一个Excel工作表(Sheet)的数据后,工作表的第一行会变成标题,第二行起,逐行变为DataTable的一个数据行(Row)
以下是代码:
//根据excle的路径把第一个sheel中的内容放入datatablepublic static DataTable ReadExcelToTable(string path)//excel存放的路径{try{//连接字符串string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; // Office 07及以上版本 不能出现多余的空格 而且分号注意//string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; //Office 07以下版本 using (OleDbConnection conn = new OleDbConnection(connstring)){conn.Open();DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //得到所有sheet的名字string firstSheetName = sheetsName.Rows[0][2].ToString(); //得到第一个sheet的名字string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); //查询字符串//string sql = string.Format("SELECT * FROM [{0}] WHERE [日期] is not null", firstSheetName); //查询字符串OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);DataSet set = new DataSet();ada.Fill(set);return set.Tables[0];}}catch (Exception){return null;}}
项目中还可以结合流文件(fileStream)的操作,检查每一行数据,数据类型等,一行一行的插入到DB的表,使用DataTable的目的就是为了检查excel的行列数(主要是列数)是否符合要求,比如今天的测试中,
网友有个说法:string sqlExcel = ("select * from [计划上sheet$A3:D8]"); sheet$后面是范围A3到D8的 如果行不确定 要取到后面行 就把D8改成D
后来看到的,所以还没测试,
以上这个问题我也在想,是不是excel里面sheet的活动界面的问题,select * from [sheetName]选取了所有的列数,所以导致可能DaTaTable导致空列,建议在DaTaTable进行删改,或者用datagrid修改,随后保存修改到DATATABLE中。
对于其他的excel读取方式,参见博客地址:http://www.cnblogs.com/icyJ/p/ReadExcel.html
另外对于参数connstring字符串的标准,
1)HDR表示要把第一行作为数据还是作为列名,作为数据用HDR=no,作为列名用HDR=yes;
使用 Excel 工作簿时,默认情况下,区域中的第一行是标题行(或字段名称)。如果第一个区域不包含标题,您可以在连接字符串的扩展属性中指定 HDR=NO。如果您在连接字符串中指定 HDR=NO,Jet OLE DB 提供程序将自动为您命名字段(不管excel中的列叫什么名字,F1 表示第一个字段,F2 表示第二个字段,依此类推,select F1,F2 from [sheet1$]);
2)IMEX=1将所有读入数据看作字符,其他值(0、2)请查阅相关帮助文档;
3)如果出现“找不到可安装的isam”错误,一般是连接字符串错误
string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";
HDR表示要把第一行作为数据还是作为列名,作为数据用HDR=no,作为列名用HDR=yes;
string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
接着继续:
这里出现的问题是:
很容易造成读入很多的空行到datatable中,比如下面的excel,我们基本上看不出到底有多少实际的行数:
string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); //查询字符串
string sql = string.Format("SELECT * FROM [{0}] WHERE [日期] is not null", firstSheetName); //查询字符串,字段名注意一定要和excel中标题名一致,有空格哦~
note:这时HDR参数必须是YES,否则会报异常
参考:http://www.devba.com/index.php/archives/4024.html
Excel读取存在空白的原因:表格有两个后台属性,分别是已使用的最大行数和已使用的最大列数。这个 adapter可能是按这两个属性来的,没法改。读取代码部分如图所示,图示为主要解析Excel到DataTable.经过仔细监视代码我们会发现在 da.Fill(dt)时,把空白行填充到DataTable了。总体来讲这个是有微软提供的方法和规则,那么是没办法改的。
解决办法有以下几个:
1、在读取的时候SQL语句上进行过滤:Select * From SheetName where col1 is not null and col2 is not null 在读取的过程时,对空白行进行非空顾虑,建议过滤非空时,根据业务,把不可为空的Excel中的列作为col1和col2;当然可以先删除空白行后再进行 读取;总之先把空白行在读取到Excel前除掉;
2、在读取Excel到DataTable后再过滤掉空白行;DataTable空白行处理空白行方法应该很多的;但是在进行业务校验的时候一定需要先删除空白行!
C# oleDb方法读取Excel文件(我草 牛逼啊兄弟,我服了)select * from [计划上sheet$A3:D8]相关推荐
- Python的xlrd的get_sheet方法读取Excel文件报错:XLRDError: Can‘t load sheets after releasing resources.
版权声明:转载请注明作者(独孤尚良dugushangliang)出处:https://blog.csdn.net/dugushangliang/article/details/109581095 遇到 ...
- php循环读取excel每个单元格,php使用PHPexcel类读取excel文件(循环读取每个单元格的数据)...
error_reporting(E_ALL); date_default_timezone_set('Asia/ShangHai'); include_once('Classes/PHPExcel/I ...
- android读取excel文件_python里读写excel等数据文件的几种常用方式
python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python ...
- js node.js读取excel文件返回为json文本
node-xlsx: 基于Node.js解析excel文件数据及生成excel文件:只支持xlsx xlsx: 基于Node.js解析excel文件数据及生成excel文件:只支持xlsx excel ...
- C# 读取EXCEL文件的三种经典方法
1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public D ...
- pythonselenium实战 excel读取和写入_Python3.6+selenium2.53.6自动化测试_读取excel文件的方法...
环境: 编辑工具: 浏览器: 安装xlrd 安装DDT 一 分析 1 目录结构 2 导入包 二 代码 import xlrd class ExcelUtil(): def __init__(self, ...
- python读取excel部分值存入另一个excel-python3读取excel文件只提取某些行某些列的值方法...
今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家: 首先安装xlrd: pip3 install xlrd 然后上代码: imp ...
- python怎么读取excel某一行某一列-python3读取excel文件只提取某些行某些列的值方法...
今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家: 首先安装xlrd: pip3 install xlrd 然后上代码: imp ...
- python读取excel某一行内容-python3读取excel文件只提取某些行某些列的值方法
今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家: 首先安装xlrd: pip3 install xlrd 然后上代码: imp ...
最新文章
- iOS UI基础-7.0 UIScrollView
- 艾伟也谈项目管理,一种适用于真实世界BPM的协作方式
- Linux之深入理解anaconda使用
- linux搭建博客Day1
- 软件持续集成(CI)、持续交付(CD)和持续部署(CD)
- 用VS2013编译FFMPEG232
- mysql视图的语法错误_MySQL视图的优缺点以及如何创建视图
- 跨5合并dnf无限连接服务器,不妨一试!跨5等跨区卡登陆卡黑屏解决办法分享
- 软件工程导论-软件工程概论(学习笔记)
- spark机器学习电影推荐
- 【coq】函数语言设计 笔记 11 - rel
- 我的NVIDIA开发者之旅——优化显卡性能
- K8S 创建 Deployment
- K8S 部署电商项目
- 运筹帷幄的“懒蚂蚁”
- 用Python+ChatGPT
- 百岁老人畅谈百年交大桥梁[转]
- Windows事件日志监听
- 泡泡龙游戏算法实现简介
- duilib开发(五):界面布局