C#通过OLEDB将DataTable写入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, "数据");
C#通过OLEDB将DataTable写入Excel文件中的更多相关文章
- Python:将爬取的网页数据写入Excel文件中
Python:将爬取的网页数据写入Excel文件中 通过网络爬虫爬取信息后,我们一般是将内容存入txt文件或者数据库中,也可以写入Excel文件中,这里介绍关于使用Excel文件保存爬取到的网页数据的 ...
- Python学习笔记_从CSV读取数据写入Excel文件中
本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...
- C#实现DataTable转为Excel文件
实现DataTable转为Excel文件,和上次分享的Excel文件转为DataTable互为反操作.DataTable转化为Excel文件是通过传入一个DataTable类型的参数,然后将传入的Da ...
- java写入excel文件poi
java写入excel文件 java写入excel文件poi,支持xlsx与xls,没有文件自动创建 package com.utils; import java.io.File; import ja ...
- C#读取Excel文件:通过OleDb连接,把excel文件作为数据源来读取
转载于:http://developer.51cto.com/art/200908/142392.htm C#读取Excel文件可以通过直接读取和OleDb连接,把excel文件作为数据源来读取: ...
- 从网络上获取图片,并写入excel文件
package com.weChat.utils; import com.manage.utils.DateUtil;import com.manage.utils.MD5Util;import or ...
- python使用xlrd, xlwt读取excel文件和 写入excel文件
python 3.6 首先在cmd下执行安装指令 xlre和xlwt : pip install xlre pip install xlwt #-*- coding: utf8 -*-im ...
- python模块:xlsxwriter和xlrd相结合读取、写入excel文件
python模块简单说明: xlsxwriter:负责写入数据 xlrd:负责读取数据 xlsxwriter 官方文档:http://xlsxwriter.readthedocs.org 本实例是刚写 ...
- Delphi数据库数据用文件流方式快速写入Excel文件
在开发数据库应用程序中,经常要将类型相同的数据导出来,放到Excel文件中,利用Excel强大的编辑功能,对数据作进一步的加工处理.这有许多的方法,我们可以使用OLE技术,在Delphi中创建一个自动 ...
- java 写入数据到Excel文件中_Demo
=======第一版:基本功能实现======= import com.google.common.collect.Maps; import org.apache.log4j.Logger; impo ...
随机推荐
- 2022-11-09 Acwing每日一题
本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...
- ENS框架下一次控制灯的调试记录
正常流程 登录小站,点击管理--磁盘,在硬盘下创建分区并挂载 安全下电,拔掉硬盘和TEC,再上电 硬件端 drv_fault_check_init 初始化 并绑定硬件回调 drv_fault_chec ...
- Objects.requireNonNull的意义是什么
Objects.requireNonNull方法的源码是这样: public static <T> T requireNonNull(T obj) { if (obj == null) t ...
- JUC-学习笔记
传统的多线程开发方式 implements Runnable public class oldThreadDev implements Runnable { @Override public void ...
- C++编程笔记(通信)(win32平台)
目录 一.初始化网络库 二.socket套接字 2.1服务端 2.2客户端 三.发送.接收数据 3.1发送 3.2接收数据 四.自定义的结构体 4.1 发送端 4.2接收端 IPV6版本套接字的创建 ...
- 2.10:数据加工与展示-pandas清洗、Matplotlib绘制
〇.目标 1. 使用pandas完成基本的数据清洗加工处理: 2. 使用Matplotlib进行简单的数据图形化展示. 一.用pandas清洗处理数据 1.判断是否存在空值 数据缺失在很多数据中存在, ...
- <二>vector向量容器
底层数据结构:动态开辟的数组,每次以原始空间2倍扩容 vector vec; 增加 vec.push_back(100);容器末尾加元素 时间负责度O(1) 可能导致容器扩容 容器中的,对象的构造析构 ...
- Javascript | 模拟mvc实现点餐程序
MVC模式是一个比较成熟的开发模式.M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.其中,View的定义比较清晰,就是用 ...
- java中的字符串数组
本文主要讲述java中的字符串数组 字符串数组的声明有如下几种形式: // 第一种方式:new // 注意在String的后面[]中不需要添加字符串数组的长度.否则报错. String[] arr_1 ...
- 如何优化大场景实时渲染?HMS Core 3D Engine这么做
在先前举办的华为开发者大会2022(HDC)上,华为通过3D数字溪村展示了自有3D引擎"HMS Core 3D Engine"(以下简称3D Engine)的强大能力.作为一款高性 ...