datatable导出excel(三种方法)

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

 private void excelout()
        {
            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 < totaldata.Columns.Count; i++)
            {


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


            }


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


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


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


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


            int irowcount = totaldata.Rows.Count;


            int iparstedrow = 0, icurrsize = 0;


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


            int ieachsize = 1000;


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


            int icolumnaccount = totaldata.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] = totaldata.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 SaveFileDialog()
        {
            //string localFilePath, fileNameExt, newFileName, FilePath;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            //设置文件类型
            saveFileDialog1.Filter = " excel files(*.xls)|*.xls";
            //设置默认文件类型显示顺序
            saveFileDialog1.FilterIndex = 2;
            //保存对话框是否记忆上次打开的目录
            saveFileDialog1.RestoreDirectory = true;
            //点了保存按钮进入
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
               // DataTable dt = (DataTable)this.dataGridView1.DataSource;
                dataTableToCsv(totaldata, saveFileDialog1.FileName);
            }

        }


  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();


        }


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

 


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

 private void ExportToExcel(DataTable dtqzh)
        {
            if (dtqzh.Rows.Count <= 0)
            {
                MessageBox.Show("没有可供导出的数据");
                return;
            }


            //创建Excel对象
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            excel.Application.Workbooks.Add(true);
            excel.Visible = true;
            //生成字段,即添加表头
            for (int i = 0; i < dtqzh.Columns.Count; i++)
            {
                excel.Cells[1, i + 1] = dtqzh.Columns[i].ColumnName;
            }
            //填充内容
            for (int i = 0; i < dtqzh.Rows.Count; i++)
            {
                for (int j = 0; j < dtqzh.Columns.Count; j++)
                {
                    if (dtqzh.Rows[i][j] == null)
                    {
                        excel.Cells[i + 2, j + 1] = "";
                    }
                    else
                    {
                        excel.Cells[i + 2, j + 1] = dtqzh.Rows[i][j].ToString();
                    }
                }
            }


        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值