将查询结果导出到客户端的EXCEL中(三)
通过调用Excell.dll的类和方法来实现。添加引用的方式跟OWC一样,引用-〉添加-〉com,找到Microsoft Excel9.0(或者10.0,11.0随你安装的office版本不同而不同)Object Library。这样就会在引用里面添加Excel一项.
然后按照如下示例代码即可实现将数据写入Excel中
这样可以实现高效的将数据导出,速度非常快,可是唯一一个问题就是每个用户在执行下载动作的时候都会开启一个Excel.exe进程,如果并发用户多了,服务器可能跑不起来。
而最终让我放弃这个做法的是另一个原因。我没找到关掉推出该类后关掉Excel.exe进程的办法,可以看到我在finally中关掉了所有的Excel组件,并且调用了GC.Collect()可是还是没有杀掉该进程,最后实在没办法了,就放弃这个做法了。
这个做法最好的方面是创建了真正的Excel文件,并且可是实现Excel格式的完美控制,这是其他方式所无法实现的。
然后按照如下示例代码即可实现将数据写入Excel中
public void Excel导出(string 查询语句,params string[] 标题)
{
object missing = System.Reflection.Missing.Value; //默认参数
Excel.Application excel;
Excel._Workbook xBk; //工作薄
Excel._Worksheet xSt; //工作Sheet
Excel._QueryTable xQt; //查询表
string Conn = "ODBC;DRIVER=SQL Server;"
+"SERVER=.;UID=sa;PWD=sa;DATABASE=DCM_Sony"; //SQL Server连接字符串
string Select = 查询语句; //查询语句
excel = new Excel.ApplicationClass();
xBk = excel.Workbooks.Add(true);
xSt = (Excel._Worksheet)xBk.ActiveSheet;
excel.Cells[2,2] = 标题[0]; //设置标题
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Name = "宋体";
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 18;
excel.Cells[3,9]="创建日期"+DateTime.Today;
for(int i=1;i<=标题.Length-1;i++)
{
excel.Cells[4,i+1]=标题[i];
xSt.get_Range(excel.Cells[4,i+1],excel.Cells[4,i+1]).Font.Bold=false;
xSt.get_Range(excel.Cells[4,i+1],excel.Cells[4,i+1]).Font.Name="黑体";
xSt.get_Range(excel.Cells[4,i+1],excel.Cells[4,i+1]).Font.Size=12;
}
//传入连接和查询语句,就可以实现查询并可以将结果写入到Excel中
xQt = xSt.QueryTables.Add(Conn,xSt.get_Range(excel.Cells[5,2],
excel.Cells[5,2]),Select);
xQt.Name = "导出示例";
xQt.FieldNames = false;
xQt.RowNumbers = false;
xQt.FillAdjacentFormulas = false;
xQt.PreserveFormatting = false;
xQt.BackgroundQuery = true;
xQt.RefreshStyle = Excel.XlCellInsertionMode.xlInsertDeleteCells;
xQt.AdjustColumnWidth = true;
xQt.RefreshPeriod = 0;
xQt.PreserveColumnInfo = false;
xQt.Refresh(xQt.BackgroundQuery);
try
{
string OID=Guid.NewGuid().ToString();
xBk.SaveAs(@"C:\"+OID+".xls",missing,missing,
missing,missing,missing,Excel.XlSaveAsAccessMode.xlShared,
missing,missing,missing,missing,missing);
excel.Visible = true;
}
finally
{
excel.DisplayAlerts=false;
System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
xSt = null;
xBk.Close(false,missing,missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
xBk = null;
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
excel = null;
GC.Collect();
}
}
{
object missing = System.Reflection.Missing.Value; //默认参数
Excel.Application excel;
Excel._Workbook xBk; //工作薄
Excel._Worksheet xSt; //工作Sheet
Excel._QueryTable xQt; //查询表
string Conn = "ODBC;DRIVER=SQL Server;"
+"SERVER=.;UID=sa;PWD=sa;DATABASE=DCM_Sony"; //SQL Server连接字符串
string Select = 查询语句; //查询语句
excel = new Excel.ApplicationClass();
xBk = excel.Workbooks.Add(true);
xSt = (Excel._Worksheet)xBk.ActiveSheet;
excel.Cells[2,2] = 标题[0]; //设置标题
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Name = "宋体";
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 18;
excel.Cells[3,9]="创建日期"+DateTime.Today;
for(int i=1;i<=标题.Length-1;i++)
{
excel.Cells[4,i+1]=标题[i];
xSt.get_Range(excel.Cells[4,i+1],excel.Cells[4,i+1]).Font.Bold=false;
xSt.get_Range(excel.Cells[4,i+1],excel.Cells[4,i+1]).Font.Name="黑体";
xSt.get_Range(excel.Cells[4,i+1],excel.Cells[4,i+1]).Font.Size=12;
}
//传入连接和查询语句,就可以实现查询并可以将结果写入到Excel中
xQt = xSt.QueryTables.Add(Conn,xSt.get_Range(excel.Cells[5,2],
excel.Cells[5,2]),Select);
xQt.Name = "导出示例";
xQt.FieldNames = false;
xQt.RowNumbers = false;
xQt.FillAdjacentFormulas = false;
xQt.PreserveFormatting = false;
xQt.BackgroundQuery = true;
xQt.RefreshStyle = Excel.XlCellInsertionMode.xlInsertDeleteCells;
xQt.AdjustColumnWidth = true;
xQt.RefreshPeriod = 0;
xQt.PreserveColumnInfo = false;
xQt.Refresh(xQt.BackgroundQuery);
try
{
string OID=Guid.NewGuid().ToString();
xBk.SaveAs(@"C:\"+OID+".xls",missing,missing,
missing,missing,missing,Excel.XlSaveAsAccessMode.xlShared,
missing,missing,missing,missing,missing);
excel.Visible = true;
}
finally
{
excel.DisplayAlerts=false;
System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);
xSt = null;
xBk.Close(false,missing,missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
xBk = null;
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
excel = null;
GC.Collect();
}
}
这样可以实现高效的将数据导出,速度非常快,可是唯一一个问题就是每个用户在执行下载动作的时候都会开启一个Excel.exe进程,如果并发用户多了,服务器可能跑不起来。
而最终让我放弃这个做法的是另一个原因。我没找到关掉推出该类后关掉Excel.exe进程的办法,可以看到我在finally中关掉了所有的Excel组件,并且调用了GC.Collect()可是还是没有杀掉该进程,最后实在没办法了,就放弃这个做法了。
这个做法最好的方面是创建了真正的Excel文件,并且可是实现Excel格式的完美控制,这是其他方式所无法实现的。