方法一:(拷贝直接可以使用,适合大批量资料, 上万笔)

Microsoft.Office.Interop.Excel.Application appexcel = new Microsoft.Office.Interop.Excel.Application();

SaveFileDialog savefiledialog = new SaveFileDialog();

System.Reflection.Missing miss = System.Reflection.Missing.Value;

appexcel = new Microsoft.Office.Interop.Excel.Application();

Microsoft.Office.Interop.Excel.Workbook workbookdata;

Microsoft.Office.Interop.Excel.Worksheet worksheetdata;

Microsoft.Office.Interop.Excel.Range rangedata;

//设置对象不可见

appexcel.Visible = false;

System.Globalization.CultureInfo currentci = System.Threading.Thread.CurrentThread.CurrentCulture;

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");

workbookdata = appexcel.Workbooks.Add(miss);

worksheetdata = (Microsoft.Office.Interop.Excel.Worksheet)workbookdata.Worksheets.Add(miss, miss, miss, miss);

//给工作表赋名称

worksheetdata.Name = "saved";

for (int i = 0; i < dt.Columns.Count; i++)

{

worksheetdata.Cells[1, i + 1] = dt.Columns[i].ColumnName.ToString();

}

//因为第一行已经写了表头,所以所有数据都应该从a2开始

rangedata = worksheetdata.get_Range("a2", miss);

Microsoft.Office.Interop.Excel.Range xlrang = null;

//irowcount为实际行数,最大行

int irowcount = dt.Rows.Count;

int iparstedrow = 0, icurrsize = 0;

//ieachsize为每次写行的数值,可以自己设置

int ieachsize = 1000;

//icolumnaccount为实际列数,最大列数

int icolumnaccount = dt.Columns.Count;

//在内存中声明一个ieachsize×icolumnaccount的数组,ieachsize是每次最大存储的行数,icolumnaccount就是存储的实际列数

object[,] objval = new object[ieachsize, icolumnaccount];

icurrsize = ieachsize;

while (iparstedrow < irowcount)

{

if ((irowcount - iparstedrow) < ieachsize)

icurrsize = irowcount - iparstedrow;

//用for循环给数组赋值

for (int i = 0; i < icurrsize; i++)

{

for (int j = 0; j < icolumnaccount; j++)

objval[i, j] = dt.Rows[i + iparstedrow][j].ToString();

System.Windows.Forms.Application.DoEvents();

}

string X = "A" + ((int)(iparstedrow + 2)).ToString();

string col = "";

if (icolumnaccount <= 26)

{

col = ((char)('A' + icolumnaccount - 1)).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();

}

else

{

col = ((char)('A' + (icolumnaccount / 26 - 1))).ToString() + ((char)('A' + (icolumnaccount % 26 - 1))).ToString() + ((int)(iparstedrow + icurrsize + 1)).ToString();

}

xlrang = worksheetdata.get_Range(X, col);

// 调用range的value2属性,把内存中的值赋给excel

xlrang.Value2 = objval;

iparstedrow = iparstedrow + icurrsize;

}

//保存工作表

System.Runtime.InteropServices.Marshal.ReleaseComObject(xlrang);

xlrang = null;

//调用方法关闭excel进程

appexcel.Visible = true;

方法二:(自己建函数,适合大批量资料, 上万笔)

using System.IO;

private void dataTableToCsv(DataTable table, string file)

{

string title = "";

FileStream fs = new FileStream(file, FileMode.OpenOrCreate);

//FileStream fs1 = File.Open(file, FileMode.Open, FileAccess.Read);

StreamWriter sw = new StreamWriter(new BufferedStream(fs), System.Text.Encoding.Default);

for (int i = 0; i < table.Columns.Count; i++)

{

title += table.Columns[i].ColumnName + "\t"; //栏位:自动跳到下一单元格

}

title = title.Substring(0, title.Length - 1) + "\n";

sw.Write(title);

foreach (DataRow row in table.Rows)

{

string line = "";

for (int i = 0; i < table.Columns.Count; i++)

{

line += row[i].ToString().Trim() + "\t"; //内容:自动跳到下一单元格

}

line = line.Substring(0, line.Length - 1) + "\n";

sw.Write(line);

}

sw.Close();

fs.Close();

}

dataTableToCsv(dt, @"c:\1.xls"); //调用函数

System.Diagnostics.Process.Start(@"c:\1.xls"); //打开excel文件

www.2cto.com

方法三:(可以自己调整单元格的格式,适合小批量的数量)

try

{

//没有数据的话就不往下执行

if (dataGridView1.Rows.Count == 0)

return;

//实例化一个Excel.Application对象

Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写

//excel.Visible = false;

excel.Visible = true;

//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错

excel.Application.Workbooks.Add(true);

//生成Excel中列头名称

for (int i = 0; i < dataGridView1.Columns.Count; i++)

{

excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;

}

//把DataGridView当前页的数据保存在Excel中

for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)

{

for (int j = 0; j < dataGridView1.Columns.Count; j++)

{

if (dataGridView1[j, i].ValueType == typeof(string))

{

excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString();

}

else

{

excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString();

}

}

}

//设置禁止弹出保存和覆盖的询问提示框

excel.DisplayAlerts = false;

excel.AlertBeforeOverwriting = false;

////保存工作簿

//excel.Application.Workbooks.Add(true).Save();

////保存excel文件

//excel.Save("D:" + "\\KKHMD.xls");

////确保Excel进程关闭

//excel.Quit(); //可以直接打开文件

//excel = null;

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "错误提示");

}

Excel.output((DataTable)dataGridView1.DataSource);

C#中datatable导出excel(三种方法)的更多相关文章

  1. 从SQL Server中导入/导出Excel的基本方法(转)

    从sql server中导入/导出 excel 的基本方法 /*=========== 导入/导出 excel 的基本方法 ===========*/ 从excel文档中,导入数据到sql数据库中,很 ...

  2. Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)

    Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法http://www.cnblogs.com/zdz8207/archive/2013/02/27/android- ...

  3. Openerp 中打开 URL 的三种 方法

    来自:http://shine-it.net/index.php/topic,8013.0.html 最近总结了,Openerp 中打开 URL 的三种 方法: 一.在form view 添加 < ...

  4. mysql 中添加索引的三种方法

    原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...

  5. jQuery中detach&&remove&&empty三种方法的区别

    jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...

  6. mfc 在VC的两个对话框类中传递参数的三种方法

    弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMD ...

  7. cocos2dx中创建动画的三种方法

    1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...

  8. vue后台管理项目中菜单栏切换的三种方法

    第一种方法:vue嵌套路由(二) <el-menu :default-active="defaultActive" style="min-height: 100%; ...

  9. STM32中AD采样的三种方法分析

    在进行STM32F中AD采样的学习中,我们知道AD采样的方法有多种,按照逻辑程序处理有三种方式,一种是查询模式,一种是中断处理模式,一种是DMA模式.三种方法按照处理复杂方法DMA模式处理模式效率最高 ...

随机推荐

  1. Asp.net有关GridView的使用

    一.带提示语句的删除 二.使用config里面的连接字符串 三.鼠标移到GridView某一行时改变该行的背景色方法 四.两个事件 五.GridView实现自动编号 不难写

  2. Anaconda died after receiving signal 7

    安装RHEL6-64时出现如下提示 Anaconda died after receiving signal 7 1 Anaconda是啥 是RedHat.CentOS.Fedora等Linux的安装 ...

  3. GbkToUtf8 Utf8ToGbk PackHttp

    void CFunc::GbkToUtf8(CString &strGBK) { , (LPCTSTR)strGBK, -, NULL, ); unsigned ]; memset(wszUt ...

  4. C++ 多态、虚函数机制以及虚函数表

    1.非virtual函数,调用规则取决于对象的显式类型.例如 A* a  = new B(); a->display(); 调用的就是A类中定义的display().和对象本体是B无关系. 2. ...

  5. Redis常用命令入门4:集合类型

    集合类型 之前我们已经介绍过了最基本的字符串类型.散列类型.列表类型,下面我们一起学习一下集合类型. 集合类型也是体现redis一个比较高价值的一个类型了.因为Redis的集合类型,所以我们可以很容易 ...

  6. zoom和transform:scale的区别

    小tips: zoom和transform:scale的区别 这篇文章发布于 2015年11月3日,星期二,00:52,归类于 css相关. 阅读 7876 次, 今日 8 次 by zhangxin ...

  7. 代码成长记录之jquery this使用

    后台管理的一个项目,第一次主动尝试自己动手写交互,果然问题来了,之前想当然觉得自己能写,不动笔,真的是对自己不负责任啊! 效果图是这样的,按我的思维写下来是点击一个‘更改’  多个地方会同时触发下拉 ...

  8. Mallet 使用说明

    Mallet:自然语言处理工具包 发表于128 天前 ⁄ 技术, 科研 ⁄ 评论数 6 ⁄ 被围观 1006 Views+ MALLET是基于java的自然语言处理工具箱,包括分档得分类.句类.主题模 ...

  9. spring框架详解: IOC装配Bean

    1 Spring框架Bean实例化的方式: 提供了三种方式实例化Bean. 构造方法实例化:(默认无参数) 静态工厂实例化: 实例工厂实例化: 无参数构造方法的实例化: <!-- 默认情况下使用 ...

  10. 【jQuery】百分比自适应屏幕轮播图特效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...