加载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);
        }

  直接遍历一次,在内存中删了就是了。鄙人只能想到如此暴力的手法,有更好方法的,欢迎指教。

猜你喜欢

转载自www.cnblogs.com/Fivee/p/9593787.html
今日推荐