最近有个需要实现将数据库中数据导出Excel文件的功能,其中Excel文件内容并不是简单的二维表,而是需要根据不同情况将数据分类,中间还要插入描述文字和统计数据等。
决定使用微软自带的控件 ,开发机器安装的是office2003,所以引用的是 Excel 11.0 objcet liberay
因为是winform程序,所以这个组件的要求是执行程序的机器必须安装相应版本的office2003.
以下是建立一个新的工作表类代码:
Dim ac As Microsoft.Office.Interop.Excel.Application = New Excel.Application()
If ac Is System.DBNull.Value Then
MessageBox.Show("没有安装office,或版本不正确")
Return
End If
ac.Visible = False
ac.DisplayAlerts = False
ac.ScreenUpdating = False
Dim wkbook As Excel.Workbook = ac.Workbooks.Add(True)
Dim wksheet As Excel.Worksheet = wkbook.ActiveSheet
后边就可以以这个wksheet为基础进行各种写操作了。
这个微软的控件的最大好处就是功能非常强大,而且使用起来感觉比较合理。(后边会有比较)
以下是设置表格样式功能,可以像下边这样直接定义一个指定区域的样式,也可以定义单个cell的样式。
'''''设置表头
wksheet.Cells(3, 1) = "测试表头"
Dim toprange As Excel.Range = wksheet.Range(wksheet.Cells(3, 1), wksheet.Cells(3, 7))
toprange.MergeCells = True
toprange.RowHeight = 30
toprange.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter
toprange.HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter
toprange.Font.Size = 16
toprange.Font.Bold = True
最后可以将文件保存
ac.SaveAs("filenam")
这里要说明的是使用ac.save会弹出一个让你选择保存路径的窗口,使用wksheet.save("filename"),就只能保存在预先定义好的位置,不能让用户来选择。
但实际使用中有个问题,ac.savesa()虽然能弹出一个另存文件的窗口,但是这个窗口总是出现在winform程序主form的后边,也就是说,你不最小化主form是看不到这个弹出窗口的,测试了很多次都这样,估计web程序可能不会有问题,没试过,不过winform肯定是有问题的。
解决方法是 自行添加一个SaveFileDialog控件。
然后
SaveFileDialog1.DefaultExt = "xls"
SaveFileDialog1.Filter = "Excel文件|*.xls"
SaveFileDialog1.FileName = "Shee1.xls"
If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
wkbook.SaveCopyAs(SaveFileDialog1.FileName)
End If
这样可以就可以了。
还有一个问题就是,使用这个方法导出完Excel文件,有时(其实是绝大多数情况)会出现倒出来的Excel文件打不开,后来从任务管理器中发现,有残余的Excel进程(EXCEL.EXE),这个问题比较苦恼,最后使用了个简单的办法(但是这种办法由问题,可能误杀别的excel进程,也就是说如果你还开着别的Excel文件,可能一并关闭掉了)
Dim ps() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcesses()
For i As Int16 = 0 To ps.Length - 1
If (ps(i).ProcessName.ToUpper() = "EXCEL") Then
ps(i).Kill()
End If
Next
不过这个方法确实解决了当前问题。
最后一个问题就是微软这个组件功能强大,但是导出速度相当的慢,因为很多地方都要控制样式。