度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1998|回复: 2
打印 上一主题 下一主题

[分享] C#中datatable导出excel(三种方法)

[复制链接]

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
跳转到指定楼层
楼主
发表于 2020-5-8 17:36:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
方法一:
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.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.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.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文件



方法三:
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.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);

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
沙发
 楼主| 发表于 2020-5-8 17:37:25 | 只看该作者
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
板凳
 楼主| 发表于 2020-5-11 14:25:36 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-12-22 21:24 , Processed in 0.116844 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表