在前一篇文章
中,介绍了DataSet导出到Excel时客户端生成文件的几种思路,接着往下说,服务器端生成文件,用户直接下载,应该格式是可以保证的!
于是直接调用Excel的API生成。代码如下:
说明下,其中的
xlsApp.Application.DisplayAlerts = false; 的作用是
不显示确认对话框
也可以逐Cell读取,那样可能会慢。本方法速度还过得去。
生成Winform代码测试没错,部署时,以为只要引用两个dll就可以了
Microsoft.Office.Interop.Excel.dll
Office.dll
那成想,问题接着来了,当在WebForm下调用时, 提示
“检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 8000401a
”
晕! Google下,解决方案是在服务器上安装Office,并配置DCOM权限。步骤如下:
折腾了一番,总算可以用了!·只是服务器上装Office总感觉不爽,于是再尝试下别的方法:
Reading and Writing Excel using OLEDB
主要的类文件如下:
思路:通过读出Excel模板文件到DataTale,再把数据填充到DataTable,文件另存下就OK了!
调用代码如下:
#endregion
exr.Close();
exr.Dispose();
exr = null;
}
private DataSet Get_AllPrices()
{
try
{
// Get the employee details
string strSql = "SELECT [CustomID] as 编号,[C_Name] as 品名,0 as 最高价格,0 as 最低价格,0 as 平均价格,'元/公斤' as 计量单位,'' as 备注 FROM [PriceCategory] WHERE ( 1=1 AND ([Puser] = 'tuser') )";
SqlConnection objConn = new SqlConnection(@"Data Source=AP6;Initial Catalog=testdb2009 ;Persist Security Info=True;User ID=sa;Password=sa");
SqlDataAdapter daEmp = new SqlDataAdapter(strSql, objConn);
daEmp.Fill(dsPrice, "price");
return dsPrice;
}
catch (Exception Ex)
{
throw Ex;
}
}
DataSet dsPrice = new DataSet();
protected void btnGetData_Click(object sender, EventArgs e)
{
DataSetToLocalExcel(Get_AllPrices(), PreFilePath + path, PreFilePath + path2, true);
}
这里有点强调下:OleDbConnection特别要注意, 刚开始用http://www.connectionstrings.com/excel
提供的标准串:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:"MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";
结果提示:“操作必须使用一个可更新的查询”。因为读取结果正常,以为是excel没有写权限所致,增加了相应权限后,结果依然如故。这下火了! Google下, 有解决方案
http://www.cnblogs.com/richinger/archive/2008/09/28/1301170.html
A: HDR ( HeaDer Row )设置
若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称
若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称
B:IMEX ( IMport EXport mode )设置
IMEX 有三种模式,各自引起的读写行为也不同,容後再述:
0 is Export mode
1 is Import mode
2 is Linked mode (full update capabilities)
于是修改为:
附上代码中用到的两个方法: