没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-12-07 13:15:00.000|阅读 2074 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
(一).内容
在操作Excel的过程中遇到了一些问题. 比如: 访问Com组件权限,无法读取Excel等
文章描述了怎样双向操作(读取和生成)Excel文件,以及怎样解决遇到的问题!
(二).代码
开始时用了下面两个方法进行生成和读取 Excel:
1.生成Excel文件方法一:
' <summary>
' 下载Excel方法1(用流实现)
' </summary>
' <param name="dt">要转换为Excel文件的表</param>
' <param name="page">页面Page对象,用法: 将me.Page传递过来即可</param>
Public Sub DownLoadExcelToClient1(ByVal dt As DataTable, ByVal
FileName As String)
Dim resp As HttpResponse
resp = Page.Response
resp.ContentEncoding =
System.Text.Encoding.Default
'System.Text.Encoding.GetEncoding("GB2312")
resp.AppendHeader("Content-Disposition", "attachment;filename=" +
FileName)
Dim colHeaders As String = "", ls_item = ""
Dim i As Int16 = 0
'取得数据表各列标题,各标题之间以\t分割,最后一个列标题后加回车符
For i = 0 To dt.Columns.Count - 2
colHeaders += dt.Columns(i).Caption.ToString() & Chr(9)
Next
colHeaders += dt.Columns(i).Caption.ToString() & Chr(13)
'向HTTP输出流中写入取得的数据信息
resp.Write(colHeaders)
Dim row As DataRow
'逐行处理数据
For Each row In dt.Rows
'在当前行中,逐列获得数据,数据之间以\t分割,结束时加回车符\n
For i = 0 To dt.Columns.Count - 2
ls_item &= row(i).ToString() & Chr(9)
Next i
ls_item &= row(i).ToString() & Chr(13)
'当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
resp.Write(ls_item)
ls_item = ""
Next
'写缓冲区中的数据到HTTP头文件中
resp.End()
End Sub
2.读取Excel文件
' <summary>
' 读取Excel文件
' </summary>
' <param name="dt">要转换为Excel文件的表</param>
' <param name="page">页面Page对象,用法: 将me.Page传递过来即可</param>
' <return>数据集DataSet</return>
Public Function ReadExcelFileToDataSet(ByVal strFileName As String)
As DataSetTry
'建立一个专门存放Excel文件的目录
If Directory.Exists(Page.Server.MapPath("ExcelFolder")) = False
Then
Directory.CreateDirectory(Page.Server.MapPath("ExcelFolder"))
End If
Dim strConn As String
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" &
Page.Server.MapPath(".") & "\ExcelFolder\" & strFileName & ";" &
"Extended
Properties=Excel 8.0;"
Dim conn As OleDb.OleDbConnection = New
OleDb.OleDbConnection(strConn)
Dim strExcel As String = "select * from [sheet1$]"
Dim ds As DataSet = New DataSet conn.Open()
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(strExcel,
strConn) adapter.Fill(ds)
Return ds
Catch ex As Exception
Throw ex
End Try
End Function
生成是成功的,但读取不成功,提示:"数据源格式有误!" 一直是认为:ReadExcelFileToDataSet方法有误,调试了半天,找了N多资料也不能成功!后来经过"时间的流逝",终久确认第二个方法没有错误,是完全正确的,是第一个方法生成格式的问题.
于是我将第一个方法换为下面的方法,读取和写入就OK了.
3.生成Excel文件方法二:
' <summary>
' 下载Excel方法2(用office-Excel-Com组件对象实现)
' </summary>
' <param name="dt">要转换为Excel文件的表</param>
' <param name="page">页面Page对象,用法: 将me.Page传递过来即可</param>
Public Sub DownLoadExcelToClient2(ByVal dt As DataTable)
'生成Excel操作相关对象
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
xlApp =
CType(CreateObject("Excel.Application"), Excel.Application)
xlBook = CType(xlApp.Workbooks.Add,
Excel.Workbook)
xlSheet = CType(xlBook.Worksheets(1),
Excel.Worksheet)
'xlSheet.Range("A1:B1").Merge(0)
'合并单元格
'xlSheet.Cells(1, 1) = "员工资料信息:"
'赋标题(Excel文件中的标题)
Dim rowIndex As Integer = 2
Dim colIndex As Integer = 0
Dim Col As DataColumn
Dim Row As DataRow
For Each Col In dt.Columns
colIndex = colIndex + 1
xlApp.Cells(rowIndex, colIndex) = Col.ColumnName
Next
'将表dt的所有行写入xlApp对象(Excel文件中的内容)
For Each Row In dt.Rows
rowIndex = rowIndex + 1
colIndex = 0
For Each Col In dt.Columns
colIndex = colIndex + 1
xlApp.Cells(rowIndex, colIndex) =
Row(Col.ColumnName)
Next
Next
xlSheet.Application.Visible = True '置为可见
'建立一个专门存放Excel文件的目录
If Directory.Exists(Page.Server.MapPath("ExcelFolder")) =
False Then
Directory.CreateDirectory(Page.Server.MapPath("ExcelFolder"))
End If
'删除服务端临时文件:
download.xls
If File.Exists(Page.Server.MapPath(".") & "\ExcelFolder\download.xls") = True
Then
File.Delete(Page.Server.MapPath(".") & "\ExcelFolder\download.xls")
End If
'在服务端保存
download.xls
xlSheet.SaveAs(Page.Server.MapPath(".") & "\ExcelFolder\download.xls")
'杀死Excel进程
Dim myproc As System.Diagnostics.Process = New System.Diagnostics.Process
Dim proc As Process
Dim procs() As Process = Process.GetProcessesByName("excel") '得到所有打开的进程
Try
For Each proc In procs
If Not proc.CloseMainWindow() Then
proc.Kill()
End If
Next
Catch
End Try
'这里用到个goto语句,是因为: 线程是异步执行的,下面的代码要访问download.xls文件,但有
少数情况下上面的线程
'未能及时释放download.xls文件的指针,那么下面代码执行语句时会抛出异常, 当发生异常时
需要等待资源释放后,
'再重新访问该文件, 保证下载文件能够正确下载
again: Try
'输出到客户端()
If File.Exists(Page.Server.MapPath(".") & "\ExcelFolder\download.xls") Then
Dim TargetFile As FileInfo = New FileInfo(Page.Server.MapPath(".") &
"\ExcelFolder\download.xls")
'清除缓冲区流中的所有内容输出.
Page.Response.Clear()
'向输出流添加HTTP头 [指定下载/保存 对话框的文件名]
Page.Response.AppendHeader("Content-Disposition", "attachment; filename="
+ Page.Server.UrlEncode(TargetFile.Name))
'向输出流添加HTTP头 [指定文件的长度,这样下载文件就会显示正确的进度
Page.Response.AppendHeader("Content-Length", TargetFile.Length.ToString())
'表明输出的HTTP为流[stream],因此客户端只能下载.
Page.Response.ContentType = "application/octet-stream"
'发送文件流到客户端.
Page.Response.WriteFile(TargetFile.FullName)
'停止执行当前页
Page.Response.End()
End If
Catch
Thread.Sleep(10)
GoTo again
End Try
End Sub
这说明:
a. 生成Excel文件后,用户经过修改,还要反向读取此Excel文件(比如:反向更新到数据库中)
就只能用: 3 和 2方法结合使用.
b. 如果只是单向输出Excel文件,用1和2方法都可以. 不过用2的话还要安装Office-Excel,
一般还要设置一下Com组件访问权限,添加对Com组件的引用: 添加: 引用->com->Microsoft Excel 11.0 object Library
(三).不能读取的原因 以及 权限问题解决
a. 原因是: 方法 1 是用流的格式实现的,简单的说它不是真正的Excel格式,而 3 是调用的
Excel Com组件,生成的是真正的Excel文档,所以能读取(1也可以读取,但也要用Stream类读取,
如果数据有些复杂的话,会很麻烦). 用1和3方法生成的文件及文件图标一模一样,并且用Excel
应用程序打开后显示效果也是一样的. 但当用记事本分别打开1和3生成的*.xls文件时,就明
显看到它们的不同了.(您可以下载一下本示例代码程序,分别生成两个文件,对比一下)
b.在使用Excel com组件时除了装Office-Excel以外,一般还要设置一下Com的访问权限,步骤如下:
I.如果是Window2003 ->控制面版 -> 管理工具 -> 组件服务 ->
打开树级目录找到子目录DCOM配置 -> Microsoft Excel 应用程序
-> 右击选“属性” -> 在弹出对话窗口中选“安全”选项卡->
-> 将启动和激活权限设为自定义->点击编辑按钮->
->在新窗口中将Everyone用户加入,选中复选框"启动权限",给予启动权限
II.如果是WindowXP ->控制面版 -> 管理工具 -> 组件服务(繁体为"元件服务") ->
打开树级目录找到子目录DCOM配置 -> Microsoft Excel 应用程序
-> 右击选“属性” -> 在弹出对话窗口中选“安全”选项卡->
-> 将启动和激活权限设为自定义->点击编辑按钮->
->在新窗口中将Everyone用户加入,选中复选框"远程启动",给予远程启动权限
(四).使用Excel模板
虽然Com组件功能已经比较全面,可以对任意一个单元格设置和赋值.但是如果数据集DataSet比
较复杂的话,全部用Com提供的方法实现就很麻烦了. 尤其是文档头和尾最难处理.这时可以这样处理:
a.先用Excel应用程序建立一个Excel文件,设置好头/尾样式和以及所有单元格的布局和格式(这里就是作用office 家簇的
excel进行表格布局,可以任意操作)
b.将此文件保存到工程的一个文夹下面即可.
用法:
只需将2中的:
xlBook = CType(xlApp.Workbooks.Add, Excel.Workbook)
改为:
xlBook = xlApp.Workbooks.Add(page.MapPath(".") + "ExcelTemplate.xls")'使用現有模板
即可。 这样xlBook实际上是基于自己创建的模板的.
这样操作,一般表头和标题列,表尾列一般不用设置,只显示DataSet中的主要数据(甚至也不用显示DataSet列名)
最近给客户做一些Excel报表,我们是这样做的,直接把客户给的Excel需求文件作为了模板.非常简便,更爽的是这样做报表跟客户要求的完全相同。
(五).代码示例下载
http://www.cnblogs.com/Files/ChengKing/OPExcel.rar
此示例在配置环境: WinXP(繁体) VS.net 2002 WinXP(简体) Vs.net 2003
Win2003 VS.net 2003 测试能够正确运行!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号