zoukankan      html  css  js  c++  java
  • C#中datatabel导出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);
    
    摘自 brian0031的专栏
  • 相关阅读:
    jsp页面增加语音播报
    tomcat页面重定向跳转
    飘窗
    将回车键与页面ID绑定
    例35:十进制转二进制
    例33:求100-200间素数
    例30:尼科彻斯定理
    例29:哥德巴赫猜想
    例28:斐波那契数列
    例27:哈希查找
  • 原文地址:https://www.cnblogs.com/rinack/p/3110055.html
Copyright © 2011-2022 走看看