C#大量数据导出到Excel(转)
工作过程中经常会用到将数据导出到Excel中,一般情况下需要导出的数据都是几百几千条或者上万条,这都没有什么问题,但有时候会遇到特殊的需求,客户要求把几十万条甚至上百万条的数据导出到Excel中,这就比较麻烦了。当数据量很大导出到Excel表格的时候通常会遇到两个问题:一个是内存溢出,由于需要处理的数据量比较大,导致Excel占用的内存过多从而导致数据还没有导出完就因为内存溢出而失败;另一个是每张Excel表单最多只能有65536行,所以当DataTable或DataSet中数据多于65536行时会报错,这时候需要考虑Excel分页功能。
/// <summary>
/// 将DataTable数据导出到Excel表
/// </summary>
/// <param name="dtTmp">要导出的DataTable</param>
/// <param name="filePath">Excel的保存路径及名称</param>
public void DataTabletoExcel(System.Data.DataTable dtTmp, string filePath)
{
if (dtTmp == null)
{
return;
}
long rowNum = dtTmp.Rows.Count;//行数
int columnNum = dtTmp.Columns.Count;//列数
m_xlApp = new Excel.Application();
m_xlApp.DisplayAlerts = false;//不显示更改提示
m_xlApp.Visible = false; Excel.Workbooks workbooks = m_xlApp.Workbooks;
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[];//取得Sheet1 try
{
//单张Excel表格最大行数
if (rowNum > )
{
long pageRows = ; //定义每页显示的行数,行数必须小于65536
int scount = (int)(rowNum / pageRows); //导出数据生成的表单数
if (scount * pageRows < rowNum) //当总行数不被pageRows整除时,经过四舍五入可能页数不准
{
scount = scount + ;
}
for (int sc = ; sc <= scount; sc++)
{
if (sc > ) //这里由1改为3,20140922
{
object missing = System.Reflection.Missing.Value;
worksheet = (Excel.Worksheet)workbook.Worksheets.Add(
missing, missing, missing, missing); //添加一个sheet
}
else
{
worksheet = (Excel.Worksheet)workbook.Worksheets[sc]; //取得sheet1
}
string[,] datas = new string[pageRows + , columnNum]; for (int i = ; i < columnNum; i++) //写入字段
{
datas[, i] = dtTmp.Columns[i].Caption; //表头信息
}
Excel.Range range = worksheet.get_Range(worksheet.Cells[, ], worksheet.Cells[, columnNum]);
range.Interior.ColorIndex = ; //15代表灰色
range.Font.Bold = true;
range.Font.Size = ; int init = int.Parse(((sc - ) * pageRows).ToString());
int r = ;
int index = ;
int result;
if (pageRows * sc >= rowNum)
{
result = (int)rowNum;
}
else
{
result = int.Parse((pageRows * sc).ToString());
} for (r = init; r < result; r++)
{
index = index + ;
for (int i = ; i < columnNum; i++)
{
object obj = dtTmp.Rows[r][dtTmp.Columns[i].ToString()];
datas[index, i] = obj == null ? "" : obj.ToString().Trim();
}
} Excel.Range fchR = worksheet.get_Range(worksheet.Cells[, ], worksheet.Cells[index + , columnNum]);
fchR.Value2 = datas;
worksheet.Columns.EntireColumn.AutoFit(); //列宽自适应。
m_xlApp.WindowState = Excel.XlWindowState.xlMaximized; //Sheet表最大化
range = worksheet.get_Range(worksheet.Cells[, ], worksheet.Cells[index + , columnNum]);
range.Font.Size = ;
range.RowHeight = 14.25;
range.Borders.LineStyle = ;
range.HorizontalAlignment = ;
}
}
else
{
string[,] datas = new string[rowNum + , columnNum];
for (int i = ; i < columnNum; i++) //写入字段
{
datas[, i] = dtTmp.Columns[i].Caption;
}
Excel.Range range = worksheet.get_Range(worksheet.Cells[, ], worksheet.Cells[, columnNum]);
range.Interior.ColorIndex = ; //15代表灰色
range.Font.Bold = true;
range.Font.Size = ; int r = ;
for (r = ; r < rowNum; r++)
{
for (int i = ; i < columnNum; i++)
{
object obj = dtTmp.Rows[r][dtTmp.Columns[i].ToString()];
datas[r + , i] = obj == null ? "" : obj.ToString().Trim();
}
}
Excel.Range fchR = worksheet.get_Range(worksheet.Cells[, ], worksheet.Cells[rowNum + , columnNum]);
fchR.Value2 = datas; worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
m_xlApp.WindowState = Excel.XlWindowState.xlMaximized; range = worksheet.get_Range(worksheet.Cells[, ], worksheet.Cells[rowNum + , columnNum]);
range.Font.Size = ;
range.RowHeight = 14.25;
range.Borders.LineStyle = ;
range.HorizontalAlignment = ;
}
workbook.Saved = true;
workbook.SaveCopyAs(filePath); lblMsg.Text = "导出成功!" + DateTime.Now.ToString();
}
catch (Exception ex)
{
string dd = Server.MapPath("~/Tmp/1.txt");
System.IO.File.AppendAllText(dd, "导出异常:" + ex.Message + Environment.NewLine);
}
finally
{
EndReport();
}
} /// <summary>
/// 退出报表时关闭Excel和清理垃圾Excel进程
/// </summary>
private void EndReport()
{
object missing = System.Reflection.Missing.Value;
try
{
m_xlApp.Workbooks.Close();
m_xlApp.Workbooks.Application.Quit();
m_xlApp.Application.Quit();
m_xlApp.Quit();
}
catch
{ }
finally
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Workbooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Application);
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp);
m_xlApp = null;
}
catch
{ }
try
{
//清理垃圾进程
this.killProcessThread();
}
catch
{ }
GC.Collect();
}
} /// <summary>
/// 杀掉不死进程
/// </summary>
private void killProcessThread()
{
ArrayList myProcess = new ArrayList();
for (int i = ; i < myProcess.Count; i++)
{
try
{
System.Diagnostics.Process.GetProcessById(int.Parse((string)myProcess[i])).Kill();
}
catch
{
}
}
}
C#大量数据导出到Excel(转)的更多相关文章
- 学习笔记 DataGridView数据导出为Excel
DataGridView数据导出为Excel 怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中. 比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源 ...
- 将C1Chart数据导出到Excel
大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...
- vb.net-三种将datagridview数据导出为excel文件的函数
第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll office.dll #Region "导出excel函数 ...
- 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm
using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ...
- 数据导出到Excel中
自己修改后的一个数据导出到Excel的方法,粘出来与大家共享. 只需要将 System.Web.HttpContext.Current.Response.Charset = ...
- asp.net将数据导出到excel
本次应用datatable导出,若用gridview(假设gridview设为了分页显示)会出现只导出当前页的情况. protected void btnPrn_Click(object sender ...
- 将datagrid中数据导出到excel中 -------<<工作日志2014-6-6>>
前台datagrid数据绑定 #region 导出到excel中 /// <summary> /// 2014-6-6 /// </summary> / ...
- 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel
机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...
- Qt中将QTableView中的数据导出为Excel文件
如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...
- 将Datagridview中的数据导出至Excel中
首先添加一个模块ImportToExcel,并添加引用 然后导入命名空间: Imports Microsoft.Office.Interop Imports System.Da ...
随机推荐
- 初学django搭建一个通讯录应用
---恢复内容开始--- django搭建一个通讯录应用 一.环境介绍 window10 64位 Django-1.5.12 python 2.7 Sqlite3 二.基本安装 python2.7安装 ...
- 在html中使用javascript
使用script元素,script6个元素 1.async:应该立即下载 2.charset:通过src属性指定代码的字符集 3.defer:表示脚本可以延迟到文档完全解析和显示后运行 4.langu ...
- Can not issue data manipulation statements with executeQuery().解决的方法
query是查询用的,而update是插入和更新,删除修改用的. executeQuery()语句是用于产生单个结果集的语句,如select语句,在什么情况下用,当你的数据库已经保存了数据后,要进行查 ...
- 一次和matplotlib和numpy的初识及简单的异常值清理
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ...
- Java入门——(1)Java编程基础
Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符: ...
- HDU 4372 Count the Buildings:第一类Stirling数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4372 题意: 有n栋高楼横着排成一排,各自的高度为1到n的一个排列. 从左边看可以看到f栋楼,从右边看 ...
- 如何用CSS和jQuery实现一个侧滑导航菜单
为了建立导航菜单,让我们先看看html结构:<!DOCTYPE html><html lang="en"><head> <meta cha ...
- 第5天:js-系统时间对象
今天听了一小节,js中如何获取系统时间.最后做了一个轮播图效果,是在别人的代码上修改的,一开始做了好半天,都没做好,最后,在我的坚持下,终于做出来了.今天先到这儿,去休息了! 获取时间对象:new D ...
- cycript
cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用.它确实可以帮助你破解一些应用,但我觉得这个工具主要还是用来学习其他应用的设计(主要是 ...
- Shrio授权验证详解
所谓授权,就是控制你是否能访问某个资源,比如说,你可以方位page文件夹下的jsp页面,但是不可以访问page文件夹下的admin文件夹下的jsp页面. 在授权中,有三个核心元素:权限,角色,用户. ...