C#利用OLEDB实现将DataTable写入Excel文件中

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C#利用OLEDB实现将DataTable写入Excel文件中

£冷☆月№   2023-03-21 我要评论

OLEDB

定义:

OLE DB(OLEDB)是微软设计的通向不同的数据源的低级应用程序接口。OLE DB不仅包括微软资助的标准数据接口开放数据库连通性(ODBC)的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。 作为微软的组件对象模型(COM)的一种设计,OLE DB是一组读写数据的方法(在过去可能被称为渠道)。OLE DB中的对象主要包括数据源对象、阶段对象、命令对象和行组对象。

优缺点:

优点:简单快速,能够操作高版本Excel

缺点:只能够进行有限的操作(读、写)

应用

利用OLEDB将DataTable数据写入Excel文件中,如果数据量过多,执行效率很缓慢,大数据量不推荐使用此方法。

/// <summary>
        /// 创建DataTable
        /// </summary>
        /// <returns></returns>
        private DataTable CreateDataTable()
        {
            var dt = new DataTable();
            dt.Columns.Add("Field1");
            dt.Columns.Add("Field2"); 
            return dt;
        }

        /// <summary>
        /// 根据文件后缀名判断Excel版本 链接字符串
        /// 参数HDR的值:
        /// HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。
        /// 参数IMEX的值:
        /// 当 IMEX = 0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。
        /// 当 IMEX = 1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。
        /// 当 IMEX = 2 时为“链接模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。
        /// </summary>
        /// <param name="filepath">文件目录和文件名</param>
        /// <param name="pagesize">每页记录数</param>
        /// <returns></returns>
        public static string GetExcelConnStr(string filepath, out int pagesize)
        {
            StringBuilder sb = new StringBuilder();
            string extension = Path.GetExtension(filepath);
            if (extension == ".xlsx")
            {
                pagesize = 1048575; //实际行数 1048576
                sb.Append("Provider=Microsoft.Ace.OleDb.12.0;Data Source=");
                sb.Append(filepath);
                sb.Append(";Extended Properties='Excel 12.0;HDR=Yes;IMEX=2'");
            }
            else
            {
                pagesize = 65535; //实际行数 65536
                sb.Append("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");
                sb.Append(filepath);
                sb.Append(";Extended Properties='Excel 8.0;HDR=Yes;IMEX=2'");
            }
            return sb.ToString();
        }
        /// <summary>
        /// 使用OLEDB导出Excel
        /// Excel程序支持的文件类型不止一种。
        /// 在excel早期版本中,默认的工作薄扩展名为".xls",这种格式的文件最多可以包含255个工作页(Worksheet),每个zhidao工作页中包含65535行(Row)和256列(Column)。
        /// 自Office2007版本起,excel默认的工作薄扩展名为".xlsx",这种格式的文件中每个工作页包含1048576行(Row),16384列(Column)。
        /// </summary>
        /// <param name="dt">数据集</param>
        /// <param name="filepath">文件目录和文件名</param>
        /// <param name="tablename">SHEET页名称</param>
        /// <param name="pagesize">每页记录数</param>
        public static void Export(DataTable dt, string filepath, string tablename, int pagesize = 0)
        {
            int pagecount = 0;
            string connString = GetExcelConnStr(filepath, out pagecount);
            if (pagesize > 0)
            {
                pagecount = pagesize;
            }

            try
            {
                using (OleDbConnection con = new OleDbConnection(connString))
                {
                    con.Open();

                    DataTable dtSheet = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    var sheetCount = dtSheet.Rows.Count;

                    //总记录数
                    var recordCount = dt.Rows.Count;
                    //列数
                    var columnCount = dt.Columns.Count;

                    OleDbCommand cmd = new OleDbCommand();
                    cmd.Connection = con;

                    //开始分页
                    int page = (recordCount + pagecount - 1) / pagecount; //总页数
                    for (int i = 0; i < page; i++)
                    {
                        //新的Sheet名称
                        string tabname = tablename + (i + 1).ToString();

                        //获取已存在的表
                        if (sheetCount > 0)
                        {
                            int m = 0;
                            foreach (DataRow dr in dtSheet.Rows)
                            {
                                if (m == i)
                                {
                                    tabname = dr["TABLE_NAME"].ToString();

                                    cmd.CommandText = "DROP TABLE [" + tabname + "]";
                                    cmd.ExecuteNonQuery();// 执行创建sheet的语句
                                }
                                m++;
                            }
                        }

                        //建新sheet和表头
                        StringBuilder createSQL = new StringBuilder();
                        createSQL.Append("CREATE TABLE ").Append("[" + tabname + "]"); //每60000项建一页
                        createSQL.Append("(");
                        for (int j = 0; j < columnCount; j++)
                        {
                            createSQL.Append("[" + dt.Columns[j].ColumnName + "] text,");
                        }
                        createSQL = createSQL.Remove(createSQL.Length - 1, 1);
                        createSQL.Append(")");

                        cmd.CommandText = createSQL.ToString();
                        cmd.ExecuteNonQuery();


                        StringBuilder strfield = new StringBuilder();
                        for (int z = 0; z < columnCount; z++)
                        {
                            if (z > 0)
                            {
                                strfield.Append(",");
                            }
                            strfield.Append("[" + dt.Columns[z].ColumnName + "]");
                        }

                        //准备逐条插入数据
                        for (int j = i * pagecount; j < (i + 1) * pagecount; j++)
                        {
                            if (i == 0 || j < recordCount)
                            {
                                StringBuilder insertSQL = new StringBuilder();
                                StringBuilder strvalue = new StringBuilder();
                                for (int z = 0; z < columnCount; z++)
                                {
                                    if (z > 0)
                                    {
                                        strvalue.Append(",");
                                    }
                                    strvalue.Append("'" + dt.Rows[j][z].ToString() + "'");
                                }

                                insertSQL.Append(" insert into [" + tabname + "]( ")
                                        .Append(strfield.ToString())
                                        .Append(") values (").Append(strvalue).Append(") ");

                                cmd.CommandText = insertSQL.ToString();
                                cmd.ExecuteNonQuery();
                            }
                        }
                    }

                    con.Close();
                }
            }
            catch (Exception ex)
            {
                GC.Collect();
            }
        }

具体使用方法:

DataTable dt = CreateDataTable();
            for (int i = 0; i < 70000; i++)
            {
                DataRow dr = dt.NewRow();
                dr[0] = i;
                dr[1] = "Value" + i.ToString();
                dt.Rows.Add(dr);
            }
            string filepath = Server.MapPath("~/") + "数据_" + DateTime.Now.ToString("yyyyMMddhhmmssffff") + ".xls";
            Export(dt, filepath, "数据");

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们