通过调用Excell.dll的类和方法来实现。添加引用的方式跟OWC一样,引用-〉添加-〉com,找到Microsoft Excel9.0(或者10.0,11.0随你安装的office版本不同而不同)Object Library。这样就会在引用里面添加Excel一项.

然后按照如下示例代码即可实现将数据写入Excel中

将查询结果导出到客户端的EXCEL中(三)public void Excel导出(string 查询语句,params string[]  标题)
{
将查询结果导出到客户端的EXCEL中(三)                
object missing = System.Reflection.Missing.Value;    //默认参数
将查询结果导出到客户端的EXCEL中(三)
    
将查询结果导出到客户端的EXCEL中(三)                Excel.Application excel;
将查询结果导出到客户端的EXCEL中(三)                Excel._Workbook xBk;                
//工作薄
将查询结果导出到客户端的EXCEL中(三)
                Excel._Worksheet xSt;                //工作Sheet
将查询结果导出到客户端的EXCEL中(三)

将查询结果导出到客户端的EXCEL中(三)                Excel._QueryTable xQt;                
//查询表
将查询结果导出到客户端的EXCEL中(三)

将查询结果导出到客户端的EXCEL中(三)                
string Conn = "ODBC;DRIVER=SQL Server;"
将查询结果导出到客户端的EXCEL中(三)                    
+"SERVER=.;UID=sa;PWD=sa;DATABASE=DCM_Sony";    //SQL Server连接字符串
将查询结果导出到客户端的EXCEL中(三)
                string Select = 查询语句;    //查询语句
将查询结果导出到客户端的EXCEL中(三)

将查询结果导出到客户端的EXCEL中(三)        
将查询结果导出到客户端的EXCEL中(三)                excel 
= new Excel.ApplicationClass();
将查询结果导出到客户端的EXCEL中(三)                xBk 
= excel.Workbooks.Add(true);
将查询结果导出到客户端的EXCEL中(三)                xSt 
= (Excel._Worksheet)xBk.ActiveSheet;
将查询结果导出到客户端的EXCEL中(三)        
将查询结果导出到客户端的EXCEL中(三)                excel.Cells[
2,2= 标题[0];            //设置标题
将查询结果导出到客户端的EXCEL中(三)
                xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
将查询结果导出到客户端的EXCEL中(三)                xSt.get_Range(excel.Cells[
2,2],excel.Cells[2,2]).Font.Name = "宋体";
将查询结果导出到客户端的EXCEL中(三)                xSt.get_Range(excel.Cells[
2,2],excel.Cells[2,2]).Font.Size = 18;
将查询结果导出到客户端的EXCEL中(三)
将查询结果导出到客户端的EXCEL中(三)                excel.Cells[
3,9]="创建日期"+DateTime.Today;
将查询结果导出到客户端的EXCEL中(三)
将查询结果导出到客户端的EXCEL中(三)                
for(int i=1;i<=标题.Length-1;i++)
{
将查询结果导出到客户端的EXCEL中(三)                    excel.Cells[
4,i+1]=标题[i];
将查询结果导出到客户端的EXCEL中(三)                    xSt.get_Range(excel.Cells[
4,i+1],excel.Cells[4,i+1]).Font.Bold=false;
将查询结果导出到客户端的EXCEL中(三)                    xSt.get_Range(excel.Cells[
4,i+1],excel.Cells[4,i+1]).Font.Name="黑体";
将查询结果导出到客户端的EXCEL中(三)                    xSt.get_Range(excel.Cells[
4,i+1],excel.Cells[4,i+1]).Font.Size=12;
将查询结果导出到客户端的EXCEL中(三)
将查询结果导出到客户端的EXCEL中(三)                }

将查询结果导出到客户端的EXCEL中(三)                
将查询结果导出到客户端的EXCEL中(三)                
//传入连接和查询语句,就可以实现查询并可以将结果写入到Excel中
将查询结果导出到客户端的EXCEL中(三)
                xQt = xSt.QueryTables.Add(Conn,xSt.get_Range(excel.Cells[5,2],
将查询结果导出到客户端的EXCEL中(三)                    excel.Cells[
5,2]),Select);
将查询结果导出到客户端的EXCEL中(三)                xQt.Name 
= "导出示例";
将查询结果导出到客户端的EXCEL中(三)                xQt.FieldNames 
= false;
将查询结果导出到客户端的EXCEL中(三)                xQt.RowNumbers 
= false;
将查询结果导出到客户端的EXCEL中(三)                xQt.FillAdjacentFormulas 
= false;
将查询结果导出到客户端的EXCEL中(三)                xQt.PreserveFormatting 
= false;
将查询结果导出到客户端的EXCEL中(三)                xQt.BackgroundQuery 
= true;
将查询结果导出到客户端的EXCEL中(三)                xQt.RefreshStyle 
= Excel.XlCellInsertionMode.xlInsertDeleteCells;
将查询结果导出到客户端的EXCEL中(三)                xQt.AdjustColumnWidth 
= true;
将查询结果导出到客户端的EXCEL中(三)                xQt.RefreshPeriod 
= 0;
将查询结果导出到客户端的EXCEL中(三)                xQt.PreserveColumnInfo 
= false;
将查询结果导出到客户端的EXCEL中(三)                xQt.Refresh(xQt.BackgroundQuery);
将查询结果导出到客户端的EXCEL中(三)                
try
{
将查询结果导出到客户端的EXCEL中(三)                    
string OID=Guid.NewGuid().ToString();
将查询结果导出到客户端的EXCEL中(三)                    xBk.SaveAs(
@"C:\"+OID+".xls",missing,missing,
将查询结果导出到客户端的EXCEL中(三)                        missing,missing,missing,Excel.XlSaveAsAccessMode.xlShared,
将查询结果导出到客户端的EXCEL中(三)                        missing,missing,missing,missing,missing);
将查询结果导出到客户端的EXCEL中(三)                    excel.Visible 
= true;
将查询结果导出到客户端的EXCEL中(三)                }

将查询结果导出到客户端的EXCEL中(三)                
finally
{
将查询结果导出到客户端的EXCEL中(三)                    excel.DisplayAlerts
=false;
将查询结果导出到客户端的EXCEL中(三)                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
将查询结果导出到客户端的EXCEL中(三)                    xSt 
= null;
将查询结果导出到客户端的EXCEL中(三)                    xBk.Close(
false,missing,missing);
将查询结果导出到客户端的EXCEL中(三)                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
将查询结果导出到客户端的EXCEL中(三)                    xBk 
= null;
将查询结果导出到客户端的EXCEL中(三)                    excel.Quit();
将查询结果导出到客户端的EXCEL中(三)                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
将查询结果导出到客户端的EXCEL中(三)                    excel 
= null;
将查询结果导出到客户端的EXCEL中(三)                    GC.Collect();
将查询结果导出到客户端的EXCEL中(三)                }

将查询结果导出到客户端的EXCEL中(三)                        
将查询结果导出到客户端的EXCEL中(三)            }

这样可以实现高效的将数据导出,速度非常快,可是唯一一个问题就是每个用户在执行下载动作的时候都会开启一个Excel.exe进程,如果并发用户多了,服务器可能跑不起来。

而最终让我放弃这个做法的是另一个原因。我没找到关掉推出该类后关掉Excel.exe进程的办法,可以看到我在finally中关掉了所有的Excel组件,并且调用了GC.Collect()可是还是没有杀掉该进程,最后实在没办法了,就放弃这个做法了。

这个做法最好的方面是创建了真正的Excel文件,并且可是实现Excel格式的完美控制,这是其他方式所无法实现的。

相关文章: