加载Excel时,如何过滤空行空列
巨硬为Excel提供了丰富的C#接口,基本上可以将Excel当做一个微型数据库来用,奈何前端的我们,sql也只会写两句select * from table;
目前工作中遇到了一个问题,在需要读取的Excel中,存在大量毫无内容的列和行,C#的Excel空间里,分为有效数据,和占用数据,具体是为了干啥,这个也就不深究了。
如果我们只需要其中有数据的列,无数据的不想加载进内存怎么办呢。下面是我的一个解决方法:
private static DataSet ExcelToDS(string Path)
{
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Path + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1'";
using (OleDbConnection conn = new OleDbConnection(strConn))
{
conn.Open();
var tv = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
var completeds = new DataSet();
foreach (DataRow row in tv.Rows)
{
var sheetName = row["TABLE_NAME"].ToString().Trim();
if (sheetName.LastIndexOf('$') != -1)
{
var ds = new DataSet();
var dt = new DataTable();
var strExcel = "select * from [" + row["TABLE_NAME"] + "]";
var myCommand = new OleDbDataAdapter(strExcel, strConn);
myCommand.Fill(ds);
dt = ds.Tables[0].Copy();
dt.TableName = row["TABLE_NAME"].ToString();
RemoveEmpty(dt);
completeds.Tables.Add(dt);
}
} return completeds;
}
} private static void RemoveEmpty(DataTable dt)
{
var eRow = new List<DataRow>();
var eCol = new List<DataColumn>();
for (var i = 0; i < dt.Rows.Count; ++i)
{
if (string.IsNullOrWhiteSpace(dt.Rows[i][0].ToString()))
eRow.Add(dt.Rows[i]);
}
for (var i = 0; i < dt.Columns.Count; ++i)
{
if (dt.Rows.Count > 0)
{
if (string.IsNullOrWhiteSpace(dt.Rows[0][i].ToString()))
eCol.Add(dt.Columns[i]);
}
}
foreach (var r in eRow)
dt.Rows.Remove(r);
foreach (var c in eCol)
dt.Columns.Remove(c);
}
直接遍历一次,在内存中删了就是了。鄙人只能想到如此暴力的手法,有更好方法的,欢迎指教。
加载Excel时,如何过滤空行空列的更多相关文章
- 个人永久性免费-Excel催化剂功能第32波-空行空列批量插入和删除
批量操作永远是效率提升的王道,也是Excel用户们最喜欢能够实现的操作虽说有些批量操作不一定合适Excel的最佳实践操作,但万千世界,无奇不有,特别是在国人眼中领导最大的等级森严的职场环境下.Exce ...
- Spire.XLS,生成Excel文件、加载Excel文件
一.组件介绍 Spire.XLS是E-iceblue开发的一套基于企业级的专业Office文档处理的组件之一,全称Spire.Office for .NET.旗下有Spire.Doc,Spire XL ...
- 用C3中的animation和transform写的一个模仿加载的时动画效果
用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h ...
- seajs加载jquery时提示$ is not a function该怎么解决
这篇文章主要介绍了seajs加载jquery时提示$ is not a function该怎么解决的相关资料,需要的朋友可以参考下 jquery1.7以上的都支持模块化加载,只是jquery默认的是支 ...
- Struts2配置拦截器,struts2加载常量时的搜索顺序
1:struts2加载常量时的搜索顺序 1.Struts-default.xml 2.Struts-plugin.xml 3.Struts.xml 4.Struts-properties(自己创建的) ...
- Android Glide加载图片时转换为圆形、圆角、毛玻璃等图片效果
Android Glide加载图片时转换为圆形.圆角.毛玻璃等图片效果 附录1简单介绍了Android开源的图片加载框架.在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬 ...
- 加载驱动模块时Device or resource busy的解决方法
加载驱动模块时Device or resource busy的解决方法 加载驱动模块时Device or resource busy的解决方法 insmod或modprobe驱动模块时Device o ...
- Unity3D基础学习 加载场景时隐藏物体,点击显示时显示物体
隐藏物体有两种方法,一是设置Meshrender为False,即不渲染物体. 二是设置物体为False,禁用物体,我使用的第二种. 当场景中需要隐藏的物体很多时,我们可以添加一个层来表示需要隐藏的物体 ...
- 解决easyui datagrid加载数据时,checkbox列没有根据checkbox的值来确定是否选中
背景: 昨天帮朋友做一个easyui datagrid的小实例时,才发现easyui datagrid的checkbox列,没有根据值为true或false来选中checkbox,当时感觉太让人失 ...
随机推荐
- 20190219备份 java spring boot 学习链接(日/英)
Building web applications with Spring Boot and Kotlin https://www.slideshare.net/masuda220/spring-82 ...
- Java线程面试题Top50
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...
- 服务集群session问题
1. http协议本身无状态,可通过Session与Cookie记录前端与后端服务器的交互状态: 2. 但是每次客户端回传必须在头信息中带有cookie, 如果session过多,会增加数据传输量: ...
- WPF 系统关闭模式
WPF App.xaml中ShutdownMode的属性值 OnLastWindowClose(默认值) 最后一个窗体关闭或调用Application对象的Shutdown()方法时,应用程序关闭. ...
- [JDBC] 实用性能提升
在Java以及JavaWeb中,应用的性能是很重要的.尤其是数据库后端对应用的性能影响. 一.使用缓存 性能问题大多数情况下罪魁祸首是访问数据库的那些代码.因为连接到数据库需要准备好连接(connec ...
- Phone 3rd Recovery
#解锁之后会低级格式化,请做好相关备份.1.#unlock code#2.adb reboot-bootloader3.fastboot devices4.fastboot oem unlock ** ...
- TkbmMWClientQuery的计算字段在CalcFields事件触发次数太多
kbmmw有两处BUG和作者提下,一个是TkbmMWClientQuery的计算字段在CalcFields事件触发次数太多,另一个是在TkbmMemTable的加载数据时字段会执行OnValidate ...
- 安装openssh
在推进ansible用于配置管理与自动部署,其中一个很困扰的问题是创建ssh通道很慢,虽然ansible在同一个task里面是并行的控制多台受控端.但是每一个task都需要和受控端创建ssh通道,非常 ...
- .NET并行计算和并发8:硬件支持
共享内存多核系统,分布式内存系统 区别 分布式内存系统主要通过Message passing interface在各个微处理器之间通信,但是MPI共享内存多核系统是没有必要的,会造成额外的开销. 分布 ...
- win10操作系统 安装nodejs报2503错误解决方法
报该错误的原因是由于安装操作没有获得足够的管理权限导致. 在电脑左下角开始菜单[右键]选择"命令提示符(管理员)“ 敲入如下命令 msiexec /package 后面加你nodejs的本机 ...