★(ChengKing)【迎接光辉岁月|说声真的爱你|踏着灰色轨迹|遥望大地情人】★

[首页♂] 【夜战鹰的博客】【专注于DotNet技术】【ChengKing(ZhengJian)】

郑健ID:ChengKing
498136次访问,排名78好友67人,关注者146
2006~2009 MS-MVP, MSDN中文技术论坛版主
【夜战鹰】【ChengKing(ZhengJian)】
ChengKing的文章
原创 169 篇
翻译 0 篇
转载 0 篇
评论 855 篇
【郑健(ChengKing)】的公告
【在这里放广告】
【夜战鹰的博客】
【专注于.Net技术】【.Net控件开发】
【MSN:King.Zheng@hotmail.com】

【下面是快速分类链接, 若想查看本Blog所有文章可以点击下面[文章]区域块的按技术分类的各个链接】


(1). Net 教程系列(Asp.net/
Ajax/JQuery/SilverLight/控件开发等)


(2). NET系列丛书

(3). C# GAME

(4). 网站(学习/源代码资源下载)

(5). 用友软件园工作环境

(2006~2009 MS-MVP)


相关文章,我尽量提供了图片示例和代码下载链接!
[如果遇到问题请给我发信息]
您可以直接点击相应链接进行下载 :)

如果文章对您有所帮助,请支持一下!
如果文章有不正确的地方,敬请指点!
多谢!!!!!

请选择下面链接,可以分类别的阅读文章:

最近评论
l.kl.kj:等离子电视
等离子
液晶显示器
翻译公司
北京翻译公司
代孕妈妈
北京驾校
rew:代孕妈妈
英国留学
留学美国
fftaks:Wow gold
北京seo:北京seo
文章分类
收藏
    相册
    技术活动
    九峰山留念
    在 OWIWP 日子
    在用友软件日子
    Good Blogs
    BennyMavis(水晶报表)(RSS)
    Bruce Zhang(RSS)
    cityhunter172(RSS)
    Clingingboy(RSS)
    dudu(RSS)
    goody9807(RSS)
    huangkw007(RSS)
    LoveCherry(RSS)
    mapserver(RSS)
    Rickie Lee(RSS)
    saucer(RSS)
    Scott Guthrie 博客中文版[CSDN,译者思归](RSS)
    Scott Guthrie 博客中文版[博客堂](RSS)
    Silverlight上海团队(RSS)
    singlepine(RSS)
    TerryLee(RSS)
    zjcxc(RSS)
    中国龙(RSS)
    叶帆(刘洪峰)(RSS)
    吕震宇(RSS)
    孟子E章(.net)(RSS)
    孟宪会(RSS)
    孟岩(RSS)
    寒羽枫(RSS)
    张友邦[架构专家](RSS)
    推荐系列(自TerryLee)(RSS)
    曾登高(RSS)
    朱春雷[软件工程](RSS)
    李宁(RSS)
    李维(RSS)
    清清月儿[黄鸣](RSS)
    王洪伟(SOA专家)(RSS)
    王磊(webabcd)(RSS)
    白慧冬(青润)[软件工程](RSS)
    胡百敬(RSS)
    蝈蝈俊.net(RSS)
    袁峰(RSS)
    谭振林(RSS)
    赵劼(RSS)
    速马(RSS)
    郑昀(RSS)
    陈黎夫(RSS)
    陕北吴旗娃(RSS)
    青润意愿(RSS)
    飞驰之剑(RSS)
    马宁(RSS)
    Good Sites
    4guysfromrolla.com(RSS)
    asp.net(RSS)
    aspalliance.com(RSS)
    beansoftware.com(RSS)
    codeplex.com(RSS)
    codeproject.com(RSS)
    c-sharpcorner.com(RSS)
    dotnetbips.com(RSS)
    dotnetslackers.com(RSS)
    hookedonlinq.com(RSS)
    MSDN Code Gallery(RSS)
    msdn en(RSS)
    Nikhil Kothari(RSS)
    Scott Guthrie(RSS)
    sourceforge.net(RSS)
    其它链接
    2006年100首好歌(RSS)
    2006年十二星座运程目录(RSS)
    2006年十二生肖运程运势(RSS)
    地图(RSS)
    社区/官方文档
    CSDN社区(RSS)
    MSDN网站(RSS)
    博客堂(RSS)
    微软Asp.net 2.0官方网站(RSS)
    微软Visual Studio 专区(RSS)
    微软中国社区(RSS)
    微软中文技术社区(RSS)
    文章链接
    C# Excel报表(RSS)
    CSDN新版图形验证码初级识别 (RSS)
    JavaScript技巧(一)(RSS)
    JavaScript技巧(二)(RSS)
    MINE类型(RSS)
    Share Point(RSS)
    多级下拉菜单(singlepine)(RSS)
    星月同辉 e路随行(文件下载)(RSS)
    我的其它Blog
    My IT博客网 Blog(RSS)
    My 博客园 Blog(RSS)
    My 博客园 blog(RSS)
    学习站点
    ASP.NET架构师[群组](RSS)
    Asp.net频道专家圈(RSS)
    King's CSDN下载资源(RSS)
    Microsoft XNA游戏开发网(RSS)
    象棋研究(RSS)
    优秀团队列表
    .Net 商业智能(RSS)
    .NetFramework3.0&WinFX团队(RSS)
    .NET控件与组件开发(RSS)
    ASP.NET AJAX学习(RSS)
    Asp.net(C#)四层架构自助建站系统(RSS)
    Design&Pattern团队(RSS)
    Dot Net Web服务和Windows服务开发(RSS)
    DotNet频道→ASP.NET(RSS)
    Enterprise Library(RSS)
    O/R Mapping团队(RSS)
    SharePoint团队(RSS)
    Skin设计小组(RSS)
    SOA研究室(RSS)
    Windows Mobile 应用开发(RSS)
    博客园培训团队(RSS)
    开源项目团队(RSS)
    自动识别与数据采集(RSS)
    计算机图形学(RSS)
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 生成/读取(反向更新数据库) Excel文件(示例代码下载) 收藏

    新一篇: (一)线程--简述线程概述及原理

    (一).内容

       在操作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

            
    '取得数据表各列标题,各标题之间以 分割,最后一个列标题后加回车符 
            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
                
    '在当前行中,逐列获得数据,数据之间以 分割,结束时加回车符  
                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 DataSet
            Try

                
    '建立一个专门存放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了.

        另外还可以读取指定范围内的单元格:
          对 Excel 工作簿中表(或范围)的有效引用。
          若要引用完全使用的工作表的范围,请指定后面跟有美元符号的工作表名称。例如:
          select * from [Sheet1$]
          若要引用工作表上的特定地址范围,请指定后面跟有美元符号和该范围的工作表名称。例如: 
          select * from [Sheet1$A1:B10]
          若要引用指定的范围,请使用该范围的名称。例如:
          select * from [MyNamedRange]

     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(
    "."& "ExcelFolderdownload.xls"= True Then
                File.Delete(Page.Server.MapPath(
    "."& "ExcelFolderdownload.xls")
            End If

            
    '在服务端保存download.xls
            xlSheet.SaveAs(Page.Server.MapPath(
    "."& "ExcelFolderdownload.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(
    "."& "ExcelFolderdownload.xls") Then
                    Dim TargetFile As FileInfo 
    = New FileInfo(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()
                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  测试能够正确运行!

     

    相关文章:

    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


          

    发表于 @ 2005年11月29日 20:05:00|评论(loading...)|编辑

    旧一篇: Control Study -> 主表和子表数据同时在绑定控件显示(示例代码下载)

    评论

    #得峰 发表于2006-07-26 22:25:00  IP: 211.100.21.*
    TrackBack来自《 生成/读取(反向更新数据库) Excel文件(示例代码下载) 》

    生成/读取(反向更新数据库) Excel文件(示例代码下载)
    #mooddecode 发表于2005-12-12 17:05:00  IP: 211.142.26.*
    经验是一点一点积累而来!



    写作水平也是 "惭惭" 提高的????
    #ChengKing 发表于2005-12-12 17:50:00  IP: 202.101.188.*
    多谢!!!
    应该是 "渐渐"
    #小北 发表于2006-05-11 17:25:00  IP: 211.155.184.*
    我用的是C#,不知道为什么总是在SaveAs的时候报错~!

    请教高手能不能帮忙想想办法啊........

    我对COM组件不熟悉.可以说这是第一次在ASP.NET里面调用.

    所以不知道怎么解决啊.......

    权限方面我已经全部都配置了.

    如果有时间您可以去我的BLOG里看一下,里面有一段代码.

    劳驾啦~~~~~谢谢啊~~~~~
    #小北 发表于2006-05-11 17:27:00  IP: 211.155.184.*
    晕~~~幸亏试了一下.把我的BLOG地址写错了.

    这个才是正确的.......

    #ChengKing 发表于2006-05-11 19:34:00  IP: 218.30.165.*
    SaveAs()方法出错可能是没有文件夹写Excel文件权限.
    可以右击要保存*.xls的文件夹,选: "属性" ->"安全" -> "添加"
    -> 找到everyone用户,将它添加进来,并设置写权限.
    最后点击确定,应该就OK了.
    #lumen 发表于2006-07-29 12:49:00  IP: 210.233.113.*
    文章中的存在几个问题,小弟斗胆指出,大哥勿怪^_^

    1,安全权限不需要用everyone,太大了,IUSER即可

    2,杀进程的方法恐怕不妥,在服务器端对每个会话都创建了一个excel进程,文中那种杀法会把其他会话用户的进程也给干掉的吧。当然,我没这样试过,不敢十分肯定。

    3,填充数据的时候不应该一个一个cell的写值,那样效率极低,比较好的方法是把数据先存到object[][]里,再一次写入

    小弟也写过一篇excel的文章,只是后来没时间了,关于执行效率的部分还没写,请指点
    http://blog.csdn.net/mmqingfeng/archive/2006/03/13/623394.aspx
    #kellybs 发表于2006-08-01 16:28:00  IP: 211.157.16.*
    有没有C#版本!
    #ChengKing 发表于2006-08-01 20:54:00  IP: 218.30.165.*
    To lumen:
    Thanks!
    #ChengKing 发表于2006-08-01 19:05:00  IP: 218.30.165.*
    To kellybs:
    都差不多的. VB.net语法与C#是一一对应的, 每句每句的转换
    即可!
    #lypthen 发表于2007-03-12 21:04:43  IP:
    非常好
    CSDN真的是高手众多呀
    我学的大多数东西都是从CSDN学的
    在学校,老师也教不了什么给我们
    #xuehaolong 发表于2007-04-27 10:28:38  IP: 221.223.21.*
    很好很好,所以向请教一个问题。我在EXCEL模板里插入了一堆CHECKBOX组件,但是我如何通过程序控制这些组件的状态呢?
    如果您知道的话,能加我的MSN吗 ? nx_xhl@hotmail.com谢谢
    #ChengKing 发表于2007-04-27 14:50:55  IP: unknown, 202.*
    To xuehaolong :
    Excel部分,我没有研究这么深.
    #xcrow713 发表于2007-04-29 10:28:20  IP: 218.4.149.*
    请教高手,我这里有这样一个需求: 我要在IE里显示一个Excel 表格,这个表格是一个工具,让用户输入一些数后自动计算,这个Excel有密码保护,用户只能对某几个单元格操作,我现在的做法是把这个Excel文件另存为*.htm,然后在页面里用<OBJECT>引用这个html,但是这样就不能用密码保护了,哪位高手有好办法,谢谢
    #To xuehaolong: 发表于2007-04-29 17:06:16  IP: unknown, 202.*
    To xuehaolong:
    你已经在我的MSN列表中了.

    To xcrow713:
    没研究过这么复杂的.
    #To xuehaolong: 发表于2007-04-29 17:06:57  IP: unknown, 202.*
    To xuehaolong:
    你已经在我的MSN列表中了.

    To xcrow713:
    没研究过这么复杂的.
    #foshan 发表于2008-01-30 11:14:01  IP: 218.13.85.*
    老大,在单元格内进行循环赋值的速度远不如先将DataTable转换成二维数组然后将二组数组赋值给单元格来得快吧???
    #myvip 发表于2008-05-15 22:08:25  IP: 125.106.34.*
    又是asp.net的.不知道asp中有没有办法操作word
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 【郑健(ChengKing)】