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\"";

posted @ 2013-08-27 12:38  Rinysky  阅读(348)  评论(0编辑  收藏  举报