• [转]C#导出到EXCEL


     [转]C#导出到EXCEL  
     
    [原]
    http://community.csdn.net/Expert/topic/4570/4570895.xml?temp=1.687258E-02

    1.首先声明,这些方法也都是本人搜集的资料,然后为已所用,程序中不足之处,还请高手指点.
    2.网上有好多关于用SQL语句导入导出的例子,这里不再重复写了。

    方法1:调用com组件,导出access数据到Excel,就是直接调用access的导出功能,此方法速度超级快
    using Access;

    Access.ApplicationClass oAccess = new Access.ApplicationClass();
    oAccess.Visible = false;
    try
    {
    //ACCESS9:
    oAccess.OpenCurrentDatabase("d:\\wcf.mdb",false,"");
    //导出到excel
    oAccess.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport,Access.AcSpreadSheetType.acSpreadsheetTypeExcel9,"工作表名","d:\\wcf.xls",true,null,null);
    //导入txt
    //oAccess.DoCmd.TransferText(Access.AcTextTransferType.acExportDelim,"","Enterprise","d:\\wcf.txt",true,"",0);
    oAccess.CloseCurrentDatabase();
    oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone);
    System.Runtime.InteropServices.Marshal.ReleaseComObject (oAccess);
    oAccess = null;
    MessageBox.Show("导入成功");
    }
    catch(Exception ex)
    {
    MessageBox.Show(ex.ToString());
    }
    finally
    {
    GC.Collect();
    }
    方法2:此方法速度也是超级快,只不过导出的格式非标准的Excel格式,默认工作表名与文件名相同
    string FileName="d:\\abc.xls";
    System.Data.DataTable dt=new System.Data.DataTable();
    FileStream objFileStream;
    StreamWriter objStreamWriter;
    string strLine="";
    objFileStream = new FileStream(FileName,FileMode.OpenOrCreate,FileAccess.Write);
    objStreamWriter = new StreamWriter(objFileStream,System.Text.Encoding.Unicode);

    for(int i=0;i<dt.Columns.Count;i++)
    {
    strLine=strLine+dt.Columns[i].ColumnName.ToString()+Convert.ToChar(9);
    }
    objStreamWriter.WriteLine(strLine);
    strLine="";

    for(int i=0;i<dt.Rows.Count;i++)
    {
    strLine=strLine+(i+1)+Convert.ToChar(9);
    for(int j=1;j<dt.Columns.Count;j++)
    {
    strLine=strLine+dt.Rows[i][j].ToString()+Convert.ToChar(9);
    }
    objStreamWriter.WriteLine(strLine);
    strLine="";
    }
    objStreamWriter.Close();
    objFileStream.Close();

    方法3:用Ado.net 此方法速度较以上两个显得慢了一些,数据量越大越明显
    int Id=0;
    string Name="测试";
    string FileName="d:\\abc.xls";
    System.Data.DataTable dt=new System.Data.DataTable();
    long totalCount=dt.Rows.Count;
    long rowRead=0;
    float percent=0;
    OleDbParameter[] parm=new OleDbParameter[dt.Columns.Count];
    string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName +";Extended Properties=Excel 8.0;";
    OleDbConnection objConn = new OleDbConnection(connString);
    OleDbCommand objCmd = new OleDbCommand();
    objCmd.Connection = objConn;
    objConn.Open();
    //建立表结构
    objCmd.CommandText = @"CREATE TABLE Sheet1(序号 Integer,名称 varchar)";
    objCmd.ExecuteNonQuery();
    //建立插入动作的Command
    objCmd.CommandText = "INSERT INTO Sheet1("+Id+","+Name+")";
    parm[0]=new OleDbParameter("@Id", OleDbType.Integer);
    objCmd.Parameters.Add(parm[0]);
    parm[1]=new OleDbParameter("@Company", OleDbType.VarChar);
    objCmd.Parameters.Add(parm[1]);
    //遍历DataTable将数据插入新建的Excel文件中
    for(int i=0;i<dt.Rows.Count;i++)
    {  
    parm[0].Value=i+1;
    for(int j=1;j<parm.Length;j++)
    {
    parm[j].Value =dt.Rows[i][j];
    }
    objCmd.ExecuteNonQuery();
    rowRead++;
    percent=((float)(100*rowRead))/totalCount;  
    //this.FM.CaptionText.Text = "正在导出数据,已导出[" + percent.ToString("0.00") + "%]...";
    if(i==dt.Rows.Count-1)
    //this.FM.CaptionText.Text = "请稍后......";
    System.Windows.Forms .Application.DoEvents();
    }
    objConn.Close();
    //this.FM.CaptionText.Text = "";

    方法4:此方法调用com组件,速度都慢于以上3个方法
    using Excel;

    System.Data.DataTable dt=new System.Data.DataTable();
    string FileName="d:\\abc.xls";

    long totalCount=dt.Rows.Count;
    long rowRead=0;
    float percent=0;
    Excel.Application xlApp=null;
    xlApp=new Excel.Application();
    Excel.Workbooks workbooks=xlApp.Workbooks;
    Excel.Workbook workbook=workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
    Excel.Worksheet worksheet=(Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
    Excel.Range range;

    //写入字段
    for(int i=0;i<dt.Columns.Count;i++)
    {
    worksheet.Cells[1,i+1]=dt.Columns[i].ColumnName; 
    range=(Excel.Range)worksheet.Cells[1,i+1];
    }
    for(int r=0;r<dt.Rows.Count;r++)
    {
    worksheet.Cells[r+2,1]=r+1;
    for(int i=0;i<dt.Columns.Count;i++)
    {
    //worksheet.Cells[r+2,i+1]=dt.Rows[r][i];
    if(i+1!=dt.Columns.Count)
    worksheet.Cells[r+2,i+2]=dt.Rows[r][i+1];
    }
    rowRead++;
    percent=((float)(100*rowRead))/totalCount;  
    //this.FM.CaptionText.Text = "正在导出数据,已导出[" + percent.ToString("0.00") + "%]...";
    System.Windows.Forms .Application.DoEvents();
    }
    range=worksheet.get_Range(worksheet.Cells[2,1],worksheet.Cells[dt.Rows.Count+2,dt.Columns.Count]);
    workbook.Saved =true;
    workbook.SaveCopyAs(FileName);
    //this.FM.CaptionText.Text = "";

    方法5:利用剪贴板 ,有人说此方法很快,但是我用时,这种方法最慢,请高手指点.
    System.Data.DataTable dt=new System.Data.DataTable();
    string filePath=@"d:\abc.xls";

    object oMissing = System.Reflection.Missing.Value;
    Excel.ApplicationClass xlApp = new Excel.ApplicationClass();
    try
    {
    xlApp.Visible = false;
    xlApp.DisplayAlerts = false;
    Excel.Workbooks oBooks = xlApp.Workbooks;
    Excel._Workbook xlWorkbook = null;
    xlWorkbook = oBooks.Open(filePath,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,
    oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing);

    Excel.Worksheet xlWorksheet;
    // 添加入一个新的Sheet页。
    xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.Add(oMissing,oMissing,1,oMissing);
    // 以TableName作为新加的Sheet页名。
    xlWorksheet.Name ="企业名录";
    // 取出这个DataTable中的所有值,暂存于stringBuffer中。
    string stringBuffer = "";

    for( int j=0; j<dt.Rows.Count; j++ )
    {
    for( int k=0; k<dt.Columns.Count; k++ )
    {
    stringBuffer += dt.Rows[j][k].ToString();
    if( k < dt.Columns.Count - 1 )
    stringBuffer += "\t";
    }
    stringBuffer += "\n";
    }
    // 利用系统剪切板
    System.Windows.Forms.Clipboard.SetDataObject("");
    // 将stringBuffer放入剪切板。
    System.Windows.Forms.Clipboard.SetDataObject(stringBuffer);
    // 选中这个sheet页中的第一个单元格
    ((Excel.Range)xlWorksheet.Cells[1,1]).Select();
    // 粘贴!
    xlWorksheet.Paste(oMissing,oMissing);
    // 清空系统剪切板。
    System.Windows.Forms.Clipboard.SetDataObject("");

    // 保存并关闭这个工作簿。
    xlWorkbook.Close( Excel.XlSaveAction.xlSaveChanges, oMissing, oMissing );
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
    xlWorkbook = null;

    这些方法都没有关闭Excel进程,这种资料很多,在此不多写了,希望这些能对一些人带来方便.

  • 相关阅读:
    MapReduce之Map Join
    MapReduce之Reduce Join
    MapReduce清洗日志数据统计PV量
    Hadoop MapReduce自定义数据类型
    ES6 对象拓展方法
    ES6箭头函数与this指向
    ES6参数默认值,剩余参数及展开数组
    ES6模板字符串及字符串的扩展方法
    浅谈ES6数组及对象的解构
    ECMAScript概述及浅谈const,let与块级作用域
  • 原文地址:https://www.cnblogs.com/hanchan/p/904502.html
Copyright © 2020-2023  润新知