巨硬为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); }
直接遍历一次,在内存中删了就是了。鄙人只能想到如此暴力的手法,有更好方法的,欢迎指教。