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 ...
随机推荐
- 闭包(Closure)基础分析
闭包(Closure) 本文聚焦于回答2个问题: 在全局作用域中,如何读取函数内部的局部变量? 在全局作用域中,如何修改函数内部的局部变量? 变量作用域 JavaScript语言的作用域,一句话概括就 ...
- [补档]暑假集训D1总结
归来 今天就这样回来了,虽然心里极其不想回来(暑假!@#的只有一天啊喂),但还是回来了,没办法,虽然不喜欢这个地方,但是机房却也是少数能给我安慰的地方,心再累,也没有办法了,不如好好集训= = %da ...
- error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
一.情形描述 下载了一个VS的源码,不知道此源码的版本.使用VS2010编译时出现如下报错: error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 二.解决方法 在VS2010界 ...
- centos7安装docker并安装jdk和tomcat(常用命令)
阿里专属的镜像加速 在宿主机器编辑文件:vi /etc/docker/daemon.json 阿里专属的镜像加速地址,类似于"https://91cntlkt.mirror.aliyuncs ...
- React Native 系列(一) -- JS入门知识
前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...
- Java Web开发 - 持久型/存储型XSS漏洞
Java Web开发 - 持久型/存储型XSS漏洞 1.什么是XSS漏洞攻击? XSS是跨站脚本攻击(Cross Site Scripting)的简称,之所以叫XSS而不是CSS相比大家都能明白了吧, ...
- 如何调节Eclipse下console输出字体的大小??
打开window - preferences-- general - appearance - colors and fonts --debug - console font 就可以调节了.
- [Java] Java读取Word文档
前言 最近需要做一些NLP 方面的工作,使用的是Java,在此总结一下使用Java读取Word(.doc)格式文件的方法. Apache基金会非常厉害,开源工具包POI就可以处理微软家的文档,甚至包括 ...
- python中类的属性(class attribute)的解释
python中的类叫 class object,类的实例叫instance object. 类 Class Objects 类拥有两种操作,1.类属性 attribute references 2.实 ...
- javascript多种方法实现数组去重
先说说这个实例的要求:写一个方法实现数组的去重.(要求:执行方法,传递一个数组,返回去重后的新数组,原数组不变,实现过程中只能用一层循环,双层嵌套循环也可写,只做参考): 先给初学者解释一下什么叫数组 ...