最近有些项目在做集成,和Excel之类的。所遇到的问题如下:
Win下如何操作
如何处理Excel进程
如何制作AddIn
如何在Web中应用
其他..
//
Win下的应用
Excel.Application _excelApp = new Excel.Application();
Excel._Workbook reportWB = null;
Excel._Worksheet reportWS = null;
try
{
reportWB = (Excel._Workbook)Schedule.ExcelApp.Workbooks._Open(fileReport, 0, false, 5, "", "", true, Excel.XlPlatform.xlWindows, ""t", false, false, 0, true);
reportWS = (Excel._Worksheet)reportWB.Worksheets["Sheet1"];
…………
………
………
reportWB.Save();
}
Marshal.ReleaseComObject(reportWB);
Marshal.ReleaseComObject(reportWS);
reportWB = null;
reportWS = null;
ExcelApp.Workbooks.Close();
ExcelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
GC.Collect();
只是这个Excel进程关闭起来比较麻烦,另作论述。
关于简单的操作
赋值:
reportWS.get_Range("D3" , "D3" ).Value2 =”xxx”;
插入行列:
(reportWS.Rows[beginRow, Missing.Value] as Excel.Range).Insert(Excel.XlDirection.xlDown, Missing.Value);
复制行列
reportWS.get_Range("A3", "I4").Copy(Missing.Value);
粘贴行列:
reportWS.get_Range("A4" "I5").PasteSpecial(Excel.XlPasteType.xlPasteAll, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, Missing.Value, Missing.Value);
公式:
reportWS.get_Range("D3" , "D3" ).Value2 =”=sum(D1:D2)”;
也有其他高手提供的操作Excel的类库,但是有时候需要自己做比较精细的控制,所以一般都是自己去做这些操作。
注意:
1:复制的时候可以附带上单元格的格式
2:公式的循环引用设置。不然的话就会有很烦人的提示。
关于安装:
1:需要安装一个XP下的接口oxpPIA。可到微软网站下载
2:解压缩oxpPIA,注册时,需要一个程序gacutil.exe
关于关闭Excel进程的问题
在Win/Web下,都可以生成一个Excel的Application对象。但是这个对象在关闭时可能会遇到问题。主要是,即使执行了释放对象的操作,也很难把这个实例关掉。每次去TaskMan里面看看,还都在内存里面。
解决方法
1:只用一个全局的Application对象。关不掉,就不关了。所有的地方都用这个App来打开新的Worbook,这样,只要最后关掉这些Workbook,Worksheet就可以了。只有一个实例也不会占用很多的资源。
2:彻底关掉这个进程
Process[] excelPro;
excelPro = Process.GetProcessesByName("Excel");
foreach (Process myProcess in excelPro)
{
//仅当进程有图形界面时,该进程才具有与其关联的主窗口。如果关联进程没有主窗口(因而 MainWindowHandle 为零),免得误伤
if(PK.MainWindowTitle.Length==0)
myProcess.Kill();
}
有点暴力,但是管用。
制作Add-In
建立项目:
在vs.studio里面有模版,建立一个AddIn比较简单。
刚开始的时候,我用的Express版,就只能手工写这些代码了。这个Connector也就是继承自Extensibility.IDTExtensibility2的一个实现而已。
其实关键就在那一个Connector上。还有就是如何注册这个控件。原来在VB里面开发完之后,Excel还识别他是一个Dcom,但是后来用C#开发的居然无法识别。其怪也哉。最后直接通过写注册表实现。
调试:
调试在vs.studio里面也不是问题,只要设置项目debug启动参数就可以:项目/属性/Debug/Start Action/Start external program/ 选择Excel.exe的位置就可以
Web下的应用
Web下边写Excel,除去了用上述Win下的操作之外,也还有其他方式来实现,那就是直接写Response输出,进而演化出来写Html格式的Excel数据。
1:直接输出到Response。 这个方法,就是直接生成一个Html页面,然后把该页面的type修改一下,变成application/ms-excel,这样,客户端的IE会把这个html页面在Excel中打开。具体可以看 http://www.cnblogs.com/caizinet/
用这个方法输出的话,可以直接把页面上所有内容都输出到Excel。包括各类格式和数据。
但是,也有点小问题:有时候会把界面上所有的东西都在Excel中里面显示。
2:直接输出到.xls文件,让客户下在这个文件。
这次输出的.xls文件,也是用html来实现,那就是直接把html格式的数据保存成xls文件,这样的话,用户就可以直接下在这个文件了。
输出的数据可以直接是<Table>:
a:) strData=”<Table>………….. “
b:) string file , File.Write(strData)
c:) Response.Redirect(file);
这个实现还有个有意思的地方,那就是可以直接使用公式。<table><td>=Sum(A1:A3)</td></table>
更多:使用宏,而不是IE来做客户端
有朋友正在开发一套程序,就是因为所处理的数据过大,导致IE加载后占用内存近500M的情况。后来他使用了宏处理,直接使用Excel来做客户端。这也是个很不错的方法。