C#方法将数据导入Excel

C# 操作 Excel
在服务器端导数据 , Excel 当做 OLE DB 数据库 :  
  /// <summary>
  ///
OLEDB 的方法将 DataTable 的内容写入指定的 EXCEL 文件 .
  /// </summary>
  /// <param name="dtSource">
要写入 EXCEL 文件的 DataTable.</param>
  /// <param name="strPath">
被写入的 EXCEL 文件的绝对路径 </param>
  /// <param name="strSheetName">
被写入的 EXCEL 文件的 Sheet 的名称 </param>
  public static void WriteExcel(DataTable dtSource,string strPath,string strSheetName)
  {
 
   System.Data.OleDb.OleDbConnection OleDb_Conn = new OleDbConnection();
   OleDb_Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=No';"+"Data Source=/""+strPath+"/"";
  
   try
   {
    OleDb_Conn.Open();
    OleDbCommand OleDb_Comm = new OleDbCommand();
    OleDb_Comm.Connection = OleDb_Conn;
 
    string strCmd;
    try
    {
     strCmd = "drop table ["+strSheetName+"]";
     OleDb_Comm.CommandText = strCmd;
     OleDb_Comm.ExecuteNonQuery();
    }
    catch
    {
    }
 
    strCmd = "create Table ["+strSheetName+"](";
    foreach ( DataColumn dc in dtSource.Columns )
    {
     strCmd += "["+dc.ColumnName+"] nvarchar(20),";
    }
    strCmd = strCmd.Trim().Substring(0,strCmd.Length - 1);
    strCmd +=")";
    OleDb_Comm.CommandText = strCmd ;
 
    OleDb_Comm.ExecuteNonQuery();
 
    foreach ( DataRow dr in dtSource.Rows )
    { 
     if ( dr.RowState != System.Data.DataRowState.Deleted )
     {
      strCmd = "insert into ["+strSheetName+"] values(";
      foreach ( DataColumn dc in dtSource.Columns )
      {
       strCmd += "'"+dr[dc.ColumnName].ToString()+"',";
      }
          
      strCmd = strCmd.Substring(0,strCmd.Length - 1);
      strCmd +=")";
 
      OleDb_Comm.CommandText = strCmd;
      OleDb_Comm.ExecuteNonQuery();
   
     }
    }
    OleDb_Conn.Close();
   }
   catch ( Exception ex )
   {
    throw ex;
   }
   finally
   {
    OleDb_Conn.Close();
   }
  }
客户端用 VBScript 导资料 :
以下脚本用于将Excel文件保存在客户端.
<SCRIPT ID="clientEventHandlersVBS" LANGUAGE="vbscript">
<!--
Dim fso
Dim msg
Sub window_onload
 if DriveExists("C:") then
  if FolderExists("C:/TEMP") then
   if FileExists("C:/TEMP/"&Report.value) then
    DeleteFile("C:/TEMP/"&Report.value)
   end if
  else
   CreateFolder("C:/TEMP")
  end if
  CreateExcel
  window.navigate ("C:/TEMP/"&Report.value)
 else
  alert "Drive C: doesn't exists.Window will close"
  Window.close
 end if
End Sub
Function DriveExists(drv)
 Set fso = CreateObject("Scripting.FileSystemObject")
 If fso.DriveExists(drv) Then
  msg = true
 Else
  msg = false
 End If
 DriveExists = msg
End Function
Function FolderExists(fldr)
 Set fso = CreateObject("Scripting.FileSystemObject")
 If fso.FolderExists(fldr) Then
  msg = true
 Else
  msg = false
 End If
 FolderExists = msg
End Function
Sub CreateFolder(fldr)
 Set fso = CreateObject("Scripting.FileSystemObject")
 fso.CreateFolder(fldr)
End Sub
Function FileExists(parFileName)
 Set fso = CreateObject("Scripting.FileSystemObject")
 If (fso.FileExists(ParFileName)) Then
     msg = true
 Else
     msg = false
 End If
 FileExists = msg
End Function
Sub DeleteFile(parFileName)
 Set fso = CreateObject("Scripting.FileSystemObject")
 fso.DeleteFile(parFileName)
End Sub
-->
</SCRIPT>
 
以下函数用于在服务器端生成客户端操作数据的脚本 ,
private void WriteExcel(DataTable dtSource, string strPath)
  {
   System.Text.StringBuilder sb = new System.Text.StringBuilder();
   sb.Append("<script language='VBSCript'>/r/n");
   sb.Append("<!--/r/n");
   sb.Append("Sub CreateExcel /r/n");
   sb.Append("Dim xls /r/n");
   sb.Append("Set xls = CreateObject(/"Excel.Application/")/r/n");
   sb.Append("xls.WorkBooks.Open(/""+strPath+"/")/r/n");
   sb.Append("xls.Application.Visible = false/r/n");
   for (int r = 1;r < dtSource.DefaultView.Count+2; r++ )
   {
    for ( int c = 1; c < dtSource.Columns.Count+1; c++ )
    {
     if ( r == 1 )
     {
      sb.Append("xls.Sheets(1).Cells("+r+","+c+") = /""+dtSource.Columns[c-1].ColumnName.Trim()+"/"/r/n");
     }
     else
     {
      if ( c == 6 && dtSource.DefaultView[r-2][c-1].ToString().Trim().Equals("10000") )
      {
       sb.Append("xls.Sheets(1).Cells("+r+","+c+") = /"/"/r/n");
      }
      else
      {
       sb.Append("xls.Sheets(1).Cells("+r+","+c+") = /""+dtSource.DefaultView[r-2][c-1].ToString().Trim()+"/"/r/n");
      }
     }
    }
   }
   sb.Append("xls.Sheets(1).Cells(1,5) = /"Table/"/r/n");
   sb.Append("xls.Sheets(1).Cells(1,4) = /"Spouse/"/r/n");
   sb.Append ("xls.ActiveWorkbook.SaveAs(/"C:/Temp/"+System.IO.Path.GetFileName(strPath)+"/")/r/n");
   sb.Append ("xls.ActiveWorkbook.Saved=true/n");
   sb.Append ("xls.Quit/r/n");
   sb.Append("Set xls = Nothing /r/n");
   sb.Append("End Sub /r/n");
   sb.Append("-->/r/n");
   sb.Append("</script>");
   Page.RegisterClientScriptBlock("",sb.ToString()); 
  }
关于 VBA 方面的知识 , 参考 VBA 编程 .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值