C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中;另一种方法是通过OLEDB,利用DataSet批量更新的放大写入Excel中。

这两种方法各有用处。通过Microsoft.Office.Interop.Excel.Application传数据到Excel中,可以比较好的控制表格的格式,以便于直接 查看和打印,但效率低;通过OLEDB传数据到Excel中,格式不方便控制,但效率高。

我最近在导出大数据时(750w用户数据,分城市导出,每个Excel文件只有一个sheet,其中最多1000条),通过Microsoft.Office.Interop.Excel.Application传数据到Excel中一直没有成功,这种方法通过COM传数据的方法存在内存释放以及FrameWork框架方面的问题;后来我通过OLEDB成功导出。

1、准备工作:在磁盘中建立一个模版Excel文件,这个Excel文件的sheet1的第一行填写好表头。

2、核心代码:

2.1、 取出城市数据到 DataTable cityDt="所有城市并按id排序";

2.2、文件存放的文件夹 fileOutFolder

2.3、我把数据分在五台计算机上导出,于是有一个城市分类的方法

private void city(int cityMode)
           {
                   int cityRowNum = cityDt.Rows.Count;
                   int cityColumnNum = cityDt.Columns.Count;
                  for (int i = 0; i < cityRowNum; i++)
                 {
                         if (i % 5 == cityMode)  fileOutOleDb(i);
                 }            
                 this.Close();
           }

2.4、读取需要导出的城市的用户记录数

private int  findUserCount(int cityId)

{

读取数据库数据

}

2.5、读取相应页的用户数

private DataTable findUser(int cityId,int int skipNum)

{

return DataTable("select * from user where id="+cityId.toString()+" limit "+skipNum.tostring+",1000");

}

2.6、导出Excel文件处理

        private void fileOutOleDb(int i)
{
int city_id = Convert.ToInt32(cityDt.Rows[i][0]);
string city_ename = cityDt.Rows[i]["ename"].ToString();
string city_name = cityDt.Rows[i]["ename"].ToString();
int userCount = findUserCount(city_id);
int pageCount = userCount / 1000;
if (pageCount * 1000 < userCount) userCount += 1;
int beginPageNo = 1;// Convert.ToInt32(textBox3.Text);
int endPageNo = pageCount;// Convert.ToInt32(textBox4.Text);
string curDirectory = fileOutFolder + "\\" + city_name;
if (!Directory.Exists(curDirectory))
{
Directory.CreateDirectory(curDirectory);
} for (int j = beginPageNo; j <= endPageNo; j++)
{
textBox2.Text = j.ToString();
try
{
//1、读出数据
DataTable tempdt = findUser(Convert.ToInt32(cityDt.Rows[i][0]), j * 1000);
//判断文件是否存在,不存在则拷贝一个文件
string fileFullName = curDirectory + "\\" + city_name + "_" + j.ToString() + ".xls";
if (!File.Exists(fileFullName))
{
File.Copy("d:\\model.xls", fileFullName);
} //2、得到连接对象
string strCon = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES;IMEX=0'", fileFullName);
OleDbConnection myConn = new OleDbConnection(strCon);
string strCom = "SELECT * FROM [Sheet1$]";
myConn.Open();
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(strCom, myConn);
DataSet myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet, "[Sheet1$]");
myConn.Close();
DataTable dt = myDataSet.Tables[0]; //初始化DataTable实例
dt.PrimaryKey = new DataColumn[] { dt.Columns["id"] };//创建索引列 int rowNum = tempdt.Rows.Count;
int colNum = tempdt.Columns.Count;
for (int k = 0; k < rowNum; k++)
{
DataRow myRow = dt.NewRow();
for (int m = 0; m < colNum; m++) myRow[m] = tempdt.Rows[k][m];
dt.Rows.Add(myRow);
}
OleDbCommandBuilder odcb = new OleDbCommandBuilder(myDataAdapter);
odcb.QuotePrefix = "["; //用于搞定INSERT INTO 语句的语法错误
odcb.QuoteSuffix = "]"; myDataAdapter.Update(myDataSet, "[Sheet1$]"); //更新数据集对应的表
}
catch
{
}
if (j == pageCount) break;
//System.Threading.Thread.Sleep(1000);
}
}

这个数据导出,有两个瓶颈,一个是读取数据,一个是一个城市数据量特别大。我导出100w的需要37分钟,开始导出非常快(20个文件,2W左右),到后面1分钟就2个文件了。

C#通过OLEDB导出大数据到Excel的更多相关文章

  1. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用.SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入 ...

  2. PHP导出MySQL数据到Excel文件

    PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存 ...

  3. Struts2 利用AJAX 导出大数据设置遮罩层

    Struts2 利用AJAX 导出大数据设置遮罩层 需求背景: 每次我们导出excel的时候 ,如果数据量很大,导出花费的时间会很长,页面却有没人任何反应,这个时候用户会认为系统有问题,要么关了页面, ...

  4. .NET使用Office Open XML导出大量数据到 Excel

    我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原始的HTML拼接(将需要导出的数据拼接成TABLE标签)到后来happy的使用开源的NPOI, EPPlus等开源组件导出EX ...

  5. Office Open XML导出大数据

    Office Open XML导出大量数据到 Excel .NET使用Office Open XML导出大量数据到 Excel我相信很多人在做项目的都碰到过Excel数据导出的需求,我从最开始使用最原 ...

  6. POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

    1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...

  7. Winform .NET 利用NPOI导出大数据量的Excel

    前言:公司让做一个导出数据到Excel的小工具,要求是用户前端输入sql语句,点击导出按钮之后,将数据导出到Excel,界面如图所示:文件下端显示导出的进度 遇到的问题: 1.使用NPOI进行Exce ...

  8. 大数据导入Excel

    在平时的项目中,将数据导出到Excel的需求是很常见的,在此对一些常见的方法做以总结,并提供一种大数据量导出的实现. OLEDB   使用OLEDB可以很方便导出Excel,思路很简单,处理时将Exc ...

  9. 使用OPENROWSET、Microsoft.ACE.OLEDB实现大数据量的高效导入

    首先说明使用的环境是:java和Sqlserver. 最近公司需要进行大数据量的导入操作.原来使用的是Apache POI,虽然可以实现功能,但是因为逻辑处理中需要进行许多校验,处理速度太慢,使用多线 ...

随机推荐

  1. etc/ld.so.conf的使用说明

    这个文件记录了编译时使用的动态链接库的路径.默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件如果你安装了某些库,比如在安装gtk+-2.4.13时它会需要glib-2.0 &g ...

  2. 【php】对PHPExcel一些简单的理解

    这里有关于excel文件的几个概念需要跟大家说明一下,这几个概念对于我们的后续编程是很有帮助的:1.工作簿:在excel环境中用来存储数据并处理数据的文件,又称为excel文件或excel文档,   ...

  3. 在XML里的XSD和DTD以及standalone的使用

    有关XML结构中的XSD和DTD以及standalone的使用 XmlDeclaration declare= document.CreateXmlDeclaration("1.0" ...

  4. 【HDOJ】4355 Party All the Time

    好久没做过三分的题目了. /* 4355 */ #include <iostream> #include <sstream> #include <string> # ...

  5. 转:LayoutInflater作用及使用

    作用: 1.对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入. 2.对于一个已经载入的Activity, 就可以使用实现了这个Activity的的findViewById() ...

  6. 彻底搞清js中闭包(Closure)的概念

    js中闭包这个概念对于初学js的同学来说, 会比较陌生, 有些难以理解, 理解起来非常模糊. 今天就和大家一起来探讨一下这个玩意. 相信大家在看完后, 心中的迷惑会迎然而解. 闭包概念: 闭包就是有权 ...

  7. LeetCode Maximum Depth of Binary Tree (求树的深度)

    题意:给一棵二叉树,求其深度. 思路:递归比较简洁,先求左子树深度,再求右子树深度,比较其结果,返回:max_one+1. /** * Definition for a binary tree nod ...

  8. ↗☻【编写可维护的JavaScript #BOOK#】第8章 避免“空比较”

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...

  9. android:installLocation简析

    在Froyo(android 2.2,API Level:8)中引入了android:installLocation.通过设置该属性可以使得开发者以及用户决定程序的安装位置. android:inst ...

  10. MongoDB之二基础入门(安装启动)

    mongodb中有三元素:数据库,集合,文档,其中“集合” 就是对应关系数据库中的“表”,“文档”对应“行”. 一. 下载 上MongoDB官网 ,我们发现有32bit和64bit,这个就要看你系统了 ...