利用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, "数据");

C#通过OLEDB将DataTable写入Excel文件中的更多相关文章

  1. Python:将爬取的网页数据写入Excel文件中

    Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...

  2. Python学习笔记_从CSV读取数据写入Excel文件中

    本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...

  3. C#实现DataTable转为Excel文件

    实现DataTable转为Excel文件,和上次分享的Excel文件转为DataTable互为反操作.DataTable转化为Excel文件是通过传入一个DataTable类型的参数,然后将传入的Da ...

  4. java写入excel文件poi

    java写入excel文件 java写入excel文件poi,支持xlsx与xls,没有文件自动创建 package com.utils; import java.io.File; import ja ...

  5. C#读取Excel文件:通过OleDb连接,把excel文件作为数据源来读取

    转载于:http://developer.51cto.com/art/200908/142392.htm C#读取Excel文件可以通过直接读取和OleDb连接,把excel文件作为数据源来读取:   ...

  6. 从网络上获取图片,并写入excel文件

    package com.weChat.utils; import com.manage.utils.DateUtil;import com.manage.utils.MD5Util;import or ...

  7. python使用xlrd, xlwt读取excel文件和 写入excel文件

    python 3.6 首先在cmd下执行安装指令 xlre和xlwt : pip  install  xlre    pip install  xlwt #-*- coding: utf8 -*-im ...

  8. python模块:xlsxwriter和xlrd相结合读取、写入excel文件

    python模块简单说明: xlsxwriter:负责写入数据 xlrd:负责读取数据 xlsxwriter 官方文档:http://xlsxwriter.readthedocs.org 本实例是刚写 ...

  9. Delphi数据库数据用文件流方式快速写入Excel文件

    在开发数据库应用程序中,经常要将类型相同的数据导出来,放到Excel文件中,利用Excel强大的编辑功能,对数据作进一步的加工处理.这有许多的方法,我们可以使用OLE技术,在Delphi中创建一个自动 ...

  10. java 写入数据到Excel文件中_Demo

    =======第一版:基本功能实现======= import com.google.common.collect.Maps; import org.apache.log4j.Logger; impo ...

随机推荐

  1. Perl读取Excel中的数据

    #!usr/bin/perl -W use strict; use Spreadsheet::ParseExcel;#PERL的Spreadsheet::ParseExcel模块支持Excel的读操作 ...

  2. 2022-11-11 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  3. 网络yum源下载

    思路一: 按照本地网罗源,然后使用reposync直接将源同步下载到本地 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/re ...

  4. 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化

    前言 我的服务器带宽比较高,博客部署在上面访问的时候几乎没感觉有加载延迟,就没做图片这块的优化,不过最近有小伙伴说博客的图片加载比较慢,那就来把图片优化完善一下吧~ 目前有两个地方需要完善 图片瀑布流 ...

  5. JavaEE Day07 HTML

    今日内容 Web概念概述 HTML 一.Web概念概述 1. JavaWeb:使用Java语言开发的基于互联网的项目 2.软件架构 C/S架构:Client/Server--- 客户端/服务器端(安卓 ...

  6. ClickHouse入门教程

    目录 什么是ClickHouse? OLAP场景的关键特征 列式数据库更适合OLAP场景的原因 输入/输出 CPU ClickHouse的特性 真正的列式数据库管理系统 数据压缩 数据的磁盘存储 多核 ...

  7. 深度剖析 | 【JVM深层系列】[HotSpotVM研究系列] JVM调优的"标准参数"的各种陷阱和坑点分析(攻克盲点及混淆点)「 1 」

    [易错问题]Major GC和Full GC的区别是什么?触发条件呢? 相信大多数人的理解是Major GC只针对老年代,Full GC会先触发一次Minor GC,不知对否?我参考了R大的分析和介绍 ...

  8. PyTorch复现LeNet-5手写识别学习笔记

    用PyTorch搭建LeNet-5手写识别 首先申明,这篇博客用于记录本人看完LeNet-5论文,并对其中的算法进行复现的记录,可以看成是学习笔记 这里只介绍复现的工作,如果想了解更多有关网络的细节, ...

  9. avue框架 拼接后端返回的数据到table中

    根据要求展示下列详细地址情况: 后端返回的数据: 具体实现步骤: { label: "详细地址", prop: "buildingName", display: ...

  10. C++可执行文件绝对路径获取与屏蔽VS安全检查

    :前言 前几天写新项目需要用到程序所在绝对路径的时候,发现网上居然一点相关分享都没有. :_pgmptr 翻箱倒柜找出了几本教程,发现了一个叫_pgmptr的东西. 进去看了一下,在stdlib.h里 ...