C#中datatable导出excel(三种方法)

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

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(三种方法)

时间: 2024-10-04 17:20:44

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

spring在xml文件中配置bean的三种方法

一.最常见,也是缺省,是调用spring的缺省工厂类 spring缺省工厂类:org.springframework.beans.factory.support.DefaultListableBeanFactory使用其静态方法preInstantiateSingletons() 配置文件中最普通最基本的定义一个普通bean<bean id="DvdTypeDAOBean" class="com.machome.dvd.impl.DvdTypeDAO" >

Openerp 中打开 URL 的三种 方法

来自:http://shine-it.net/index.php/topic,8013.0.html 最近总结了,Openerp 中打开 URL 的三种 方法: 一.在form view 添加 <a>标签 二.使用url widget, <field name="field_name" widget="url"/> 三.使用按钮,return { 'type': 'ir.actions.act_url', 'http://www.opener

cocos2dx中创建动画的三种方法

1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg) CCSpriteFrame *frame1=CCSpriteFrame::create("1.png"); CCSpriteFrame *frame2=CCSpriteFrame::create("2.png"); CCSpriteFrame *frame3=CCS

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

弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMDDDlg类.在主对话框上我放置了一个标签页(Tab Control)控件,其实现的功能是当单击标签提示A时进入页面A,即对话框A(所对应的类为CDialogChild1),单击B时进入对话框B(CDialogChild2). 整个工程的框架已经设计好了,在对话框A和对话框B上放置了许多控件,现在我想

android应用中去掉标题栏的三种方法

在android中去掉标题栏有三种方法,它们也有各自的特点. 1.在代码里实现 this.requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 记住:这句代码要写在setContentView()前面. 2.在清单文件(manifest.xml)里面实现 <application android:icon="@drawable/icon" android:label="@string/app_name" a

从SQL Server中导入/导出 Excel 的基本方法

/*=================== 导入/导出 Excel 的基本方法 ===================*/ 从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*===================================================================*/ --如果接受数据导入的表已经存在 insert into 表 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.

linux中传文件的三种方法、windows

第一种方法:使用vsftpd服务 ftp配置文件主要内容:[[email protected] vsftpd]# cat vsftpd.conf|grep -v ^#|grep -v ^$anonymous_enable=YES #匿名登陆local_enable=YES #允许使用本地用户来登陆ftplocal_root=/var/ftp/pub #write_enable=YES #开放本地用户写的权限local_umask=022 #FTP上本地的文件权限,默认是077 anon_uplo

java中创建线程的三种方法以及区别

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 下面让我们分别来看看这三种创建线程的方法. ------------------------继承Thread类创建线程--------------------- 通过继承Thread类来创建并启动多线程的一般步骤如下 1]d定义Thread类的子类

URL转Drawable之 Android中获取网络图片的三种方法

转载自: http://doinone.iteye.com/blog/1074283 Android中获取网络图片是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况.对于这种情况,一般的方法就是耗时操作用线程来实现.下面列三种获取url图片的方法: 1.直接获取:(容易:ANR,不建议) [java] view plain copy mImageView = (ImageView)this.findViewById