C#操作 excel表格
最近忙于winform的项目,客户想要将数据保存成excel表格的形式,考虑到数据量不是很大,所以打算用微软自带的excel com组件来实现,几经周折才发现效率实在是太低,不到2K行的数据,要运行7s的时间,这让客户情何以堪,所以改用ado,但是只能增删改查数据,无法创建excel表,如果要创建,最好还是用com组件,代码:
string connStr = ""; string fileType = System.IO.Path.GetExtension(FileName); if (string.IsNullOrEmpty(fileType)) { return null; } if (fileType == ".xls") { connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + FileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\""; } else { connStr = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + FileName + ";" + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; } string sel_F = "select * from [{0}]"; OleDbConnection conn = null; OleDbDataAdapter da = null; System.Data.DataTable dtSheetName = null; DataSet ds = new DataSet(); try { conn = new OleDbConnection(connStr); conn.Open(); string SheetName = ""; dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); da = new OleDbDataAdapter(); for (int i = 0; i < dtSheetName.Rows.Count; i++) { SheetName = (string)dtSheetName.Rows[i]["TABLE_NAME"]; /** * 读取出来无效SheetName一般情况最后一个字符都不会是$。 * 如果SheetName有一些特殊符号,读取出来的SheetName会 * 自动加上单引号,比如在Excel中将SheetName编辑成:MySheet(1), * 此时读取出来的SheetName就为:'MySheet(1)$',所以判断最后一个 * 字符是不是$之前最好过滤一下单引号。 * */ if (SheetName.Contains("$") && SheetName.Replace("'", "").EndsWith("$")) { continue; } da.SelectCommand = new OleDbCommand(string.Format(sel_F, SheetName), conn); da.Fill(ds,SheetName); } } catch (Exception err) { Console.WriteLine(err.Message + "\n" + err.StackTrace); } finally { conn.Dispose(); conn.Close(); da.Dispose(); }
以上为查询,但是当我进行插入修改操作时却提示 “操作必须使用一个可更新的查询”,查了半天资料,终于找到原因原来是连接字符串的问题,HDR ( HeaDer Row )设置若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,IMEX ( IMport EXport mode )设置MEX 有三种模式,各自引起的读写行为也不同,容後再述:0 is Export mode1 is Import mode2 is Linked mode (full update capabilities),改为2,搞定。即字符串为:
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + FileName + ";" + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=2\"";