(一).内容
在操作Excel的过程中遇到了一些问题. 比如: 访问Com组件权限,无法读取Excel等
文章描述了怎样双向操作(读取和生成)Excel文件,以及怎样解决遇到的问题!
(二).代码
开始时用了下面两个方法进行生成和读取 Excel:
1.生成Excel文件方法一:
'<summary>
'下载Excel方法1(用流实现)
'</summary>
'<paramname="dt">要转换为Excel文件的表</param>
'<paramname="page">页面Page对象,用法:将me.Page传递过来即可</param>
PublicSubDownLoadExcelToClient1(ByValdtAsDataTable,ByValFileNameAsString)
DimrespAsHttpResponse
resp=Page.Response
resp.ContentEncoding=System.Text.Encoding.Default
'System.Text.Encoding.GetEncoding("GB2312")
resp.AppendHeader("Content-Disposition","attachment;filename="+FileName)
DimcolHeadersAsString="",ls_item=""
DimiAsInt16=0
'取得数据表各列标题,各标题之间以 分割,最后一个列标题后加回车符
Fori=0Todt.Columns.Count-2
colHeaders+=dt.Columns(i).Caption.ToString()&Chr(9)
Next
colHeaders+=dt.Columns(i).Caption.ToString()&Chr(13)
'向HTTP输出流中写入取得的数据信息
resp.Write(colHeaders)
DimrowAsDataRow
'逐行处理数据
ForEachrowIndt.Rows
'在当前行中,逐列获得数据,数据之间以 分割,结束时加回车符
Fori=0Todt.Columns.Count-2
ls_item&=row(i).ToString()&Chr(9)
Nexti
ls_item&=row(i).ToString()&Chr(13)
'当前行数据写入HTTP输出流,并且置空ls_item以便下行数据
resp.Write(ls_item)
ls_item=""
Next
'写缓冲区中的数据到HTTP头文件中
resp.End()
EndSub
2.读取Excel文件
'<summary>
'读取Excel文件
'</summary>
'<paramname="dt">要转换为Excel文件的表</param>
'<paramname="page">页面Page对象,用法:将me.Page传递过来即可</param>
'<return>数据集DataSet</return>
PublicFunctionReadExcelFileToDataSet(ByValstrFileNameAsString)AsDataSet
Try
'建立一个专门存放Excel文件的目录
IfDirectory.Exists(Page.Server.MapPath("ExcelFolder"))=FalseThen
Directory.CreateDirectory(Page.Server.MapPath("ExcelFolder"))
EndIf
DimstrConnAsString
strConn="Provider=Microsoft.Jet.OLEDB.4.0;"&"DataSource="&
Page.Server.MapPath(".")&"ExcelFolder"&strFileName&";"&"Extended
Properties=Excel8.0;"
DimconnAsOleDb.OleDbConnection=NewOleDb.OleDbConnection(strConn)
DimstrExcelAsString="select*from[sheet1$]"
DimdsAsDataSet=NewDataSet
conn.Open()
DimadapterAsOleDbDataAdapter=NewOleDbDataAdapter(strExcel,strConn)
adapter.Fill(ds)
Returnds
CatchexAsException
Throwex
EndTry
EndFunction
生成是成功的,但读取不成功,提示:"数据源格式有误!"
一直是认为:ReadExcelFileToDataSet方法有误,调试了半天,找了N多资料也不能成功!
后来经过"时间的流逝",终久确认第二个方法没有错误,是完全正确的,是第一个方法
生成格式的问题. 于是我将第一个方法换为下面的方法,读取和写入就OK了.
另外还可以读取指定范围内的单元格:
对 Excel 工作簿中表(或范围)的有效引用。
若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如:
select * from [Sheet1$]
若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如:
select * from [Sheet1$A1:B10]
若要引用指定的范围,请使用该范围的名称。例如:
select * from [MyNamedRange]
3.生成Excel文件方法二:
'<summary>
'下载Excel方法2(用office-Excel-Com组件对象实现)
'</summary>
'<paramname="dt">要转换为Excel文件的表</param>
'<paramname="page">页面Page对象,用法:将me.Page传递过来即可</param>
PublicSubDownLoadExcelToClient2(ByValdtAsDataTable)
'生成Excel操作相关对象
DimxlAppAsExcel.Application
DimxlBookAsExcel.Workbook
DimxlSheetAsExcel.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文件中的标题)
DimrowIndexAsInteger=2
DimcolIndexAsInteger=0
DimColAsDataColumn
DimRowAsDataRow
ForEachColIndt.Columns
colIndex=colIndex+1
xlApp.Cells(rowIndex,colIndex)=Col.ColumnName
Next
'将表dt的所有行写入xlApp对象(Excel文件中的内容)
ForEachRowIndt.Rows
rowIndex=rowIndex+1
colIndex=0
ForEachColIndt.Columns
colIndex=colIndex+1
xlApp.Cells(rowIndex,colIndex)=Row(Col.ColumnName)
Next
Next
xlSheet.Application.Visible=True'置为可见
'建立一个专门存放Excel文件的目录
IfDirectory.Exists(Page.Server.MapPath("ExcelFolder"))=FalseThen
Directory.CreateDirectory(Page.Server.MapPath("ExcelFolder"))
EndIf
'删除服务端临时文件:download.xls
IfFile.Exists(Page.Server.MapPath(".")&"ExcelFolderdownload.xls")=TrueThen
File.Delete(Page.Server.MapPath(".")&"ExcelFolderdownload.xls")
EndIf
'在服务端保存download.xls
xlSheet.SaveAs(Page.Server.MapPath(".")&"ExcelFolderdownload.xls")
'杀死Excel进程
DimmyprocAsSystem.Diagnostics.Process=NewSystem.Diagnostics.Process
DimprocAsProcess
Dimprocs()AsProcess=Process.GetProcessesByName("excel")'得到所有打开的进程
Try
ForEachprocInprocs
IfNotproc.CloseMainWindow()Then
proc.Kill()
EndIf
Next
Catch
EndTry
'这里用到个goto语句,是因为:线程是异步执行的,下面的代码要访问download.xls文件,但有
少数情况下上面的线程'未能及时释放download.xls文件的指针,那么下面代码执行语句时会抛出异常,当发生异常时需要等待资源释放后,'再重新访问该文件,保证下载文件能够正确下载
again:Try
'输出到客户端()
IfFile.Exists(Page.Server.MapPath(".")&"ExcelFolderdownload.xls")Then
DimTargetFileAsFileInfo=NewFileInfo(Page.Server.MapPath(".")&
"ExcelFolderdownload.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()
EndIf
Catch
Thread.Sleep(10)
GoToagain
EndTry
EndSub
这说明:
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 2002WinXP(简体) Vs.net 2003
Win2003 VS.net 2003 测试能够正确运行!
相关文章:
http://blog.joycode.com/ghj/archive/2005/01/12/42861.aspx
http://cnbie.net/print_146048m63657.html
http://blog.csdn.net/net_lover/archive/2004/06/08/6963.aspx
http://dotnet.aspx.cc/ShowDetail.aspx?id=4EB79F05-B9A4-4E8A-836F-864393F40405
http://dotnet.aspx.cc/ShowDetail.aspx?id=6AFBF00B-459D-4642-AD14-8A4765FFAFCC
http://dotnet.aspx.cc/ShowDetail.aspx?id=8A4CBF47-B888-4832-3389-ED3A3A3C8AAB
http://support.microsoft.com/kb/317881/EN-US/
http://study.99net.net/study/program/vb/1049955696.html
分享到:
相关推荐
1、java解析读取excel文件中的数据,并写入数据库。 2、java读取数据库数据,并导出为excel文件。 3、README.md中有详细的操作步骤示例。 使用说明: 1. 先使用postman导入:other/excel相关.postman_collection....
Excel读取数据库生成Excel并下载完整源代码 数据库为Mysql 可自行更改
前端js解析/读取excel文件,完整解析,简单操作,官网地址 http://oss.sheetjs.com/js-xlsx/
定时读取excel更新到数据库,用2003的excel
LabWindows/CVI调用自带Excel库,路径在LabWindows/CVI的安装路径下National Instruments\CVI2013\toolslib\activex\excel 注意:在打开前,一定记得在Instrument中LoadInstrument,然后将两个库excel2000.fp和...
java读取excel数据导入数据库源码 java读取excel数据导入数据库源码
C# 读取加密的Excel 文件; 有源码,VS2010开发。 采用的是微软的Microsoft.Office.Interop.Excel, V14.0,来读取加密后的Excle文件。 不是采用第三方控件NPOI读取加密的Excel文件。 开始研究NPOI读取加密的Excel文件...
这个项目实现的功能是读取excel文件中的数据,解析并写入数据库。 读取的excel文件位于项目目录下的 excel\0805.xlsx 使用IntelliJ IDEA开发此项目 使用MYSQL查看数据库 在MYSQL中运行项目db目录下的sql文件,创建...
读取Excel文件示例,只支持字符串和数字,参见 http://hi.baidu.com/皇家救星1985/blog/item/01758355fec15cc0b645ae46.html 环境:VC6.0,Office XP
C# 生成和读取EXCEL文件,本人实际测试能用,欢迎各位下载使用
excel读取生成xml文件
读取Doc,Excel,PDF,html,生成Txt文件,读取Txt生成Excel文件 jar 所需用的jar文件: fontbox-0.1.0.jar PDFBox-0.7.3.jar poi-3.0.1.jar tm-extractors-0.4.jar
通过以上步骤在程序中引入了可以读取Excle文件的CExport2Excel类; 5、打开excel文件 通过按钮点击打开 void CExcelTestDlg::OnBnClickedButtonOpenExcel() { //获取文件路径 CFileDialog* lpszOpenFile; ...
几种从数据库读取数据生成excel文件的比较
远程数据库读取保存示例-精品源代码 远程数据库读取保存示例-精品源代码
QT 快速读取Excel文件,QT 快速读取Excel文件,QT 快速读取Excel文件。
功能:通过批量读取多个excel文件,将每个excel文件创建为sqlite数据库文件中的一个表格,最终形成包含这些excel文件内容的.db数据库文件。 用法:将压缩包内的.exe/.dll文件放在同一文件夹内,双击运行文件内的...
//C# 读取Excel文件、C#读取xls文件、C#读取xlsx文件、C#读取csv文件 //C# 将xls文件转换为DataTable、C#将xlsx文件转换为DataTable //C#将csv文件转换为DataTable //C#将txt文件转换为DataTable(列与列之间空格隔...
主要介绍了Pandas读取并修改excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java实现mysql数据库的表导出到excel文件,已经基本的demo包含jar包,可以导入的eclipse里面。比较好用吧