新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → C#数据导出到Excel 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5783 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: C#数据导出到Excel 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 C#数据导出到Excel

    1.首先声明,这些方法也都是本人搜集的资料,然后为已所用,程序中不足之处,还请高手指点. 这些方法都没有关闭Excel进程。
    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,Acce      ss.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.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[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[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.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];
    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;

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/8 8:27:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/12/27 2:49:08

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    56.641ms