当前位置:编程学习 > C#/ASP.NET >>

我发现非常高效的导出到Excel的办法

我试过12000多条记录导出的Excel文件1.1M大
一闪眼就完成了用不到一秒钟 --------------------编程问答-------------------- 用什么方法啊 --------------------编程问答--------------------
引用 1 楼 sadan2121 的回复:
用什么方法啊
--------------------编程问答-------------------- 你被骗了,不是自己就是别人,~绝对的~ --------------------编程问答-------------------- 补充一下不是通过数据库导出的,是直接从控件列表里取得数据导出的
因为有的时候我们是无法联接到数据源的 --------------------编程问答--------------------
引用 2 楼 harryheart 的回复:
引用 1 楼 sadan2121 的回复:
用什么方法啊
--------------------编程问答-------------------- 直接写EXCEL二进制文件最快 --------------------编程问答-------------------- 楼上的的做法我们是无法实现的,除非这种文档格式是我定  呵呵
我的做法还是要引用到Excel本身
我是通过Windows的剪贴板来实现的
其实多简单 --------------------编程问答-------------------- 网上已经有类似的代码Excel二进制文档格式是BIFF8 --------------------编程问答-------------------- 嗯,了解
我们只要简单保存数据的话可以考虑这样做(直接写二进制)
不过我们要对文档进行排板的话就不好做了
优点是不需要Excel本身 --------------------编程问答-------------------- xuexile --------------------编程问答-------------------- 贴代码 --------------------编程问答--------------------
引用 4 楼 song9999 的回复:
补充一下不是通过数据库导出的,是直接从控件列表里取得数据导出的 
因为有的时候我们是无法联接到数据源的


你意思是不是导出前要先把数据绑定到控件?控件能分页不? --------------------编程问答-------------------- 居然在这里看到KJ

楼主贴代码看看 --------------------编程问答-------------------- 方法说出来啊 --------------------编程问答-------------------- mark
--------------------编程问答-------------------- '导出到 Excel 表
Sub SaveExcelFile(FileName As String)
    Dim MyHeaderText        As CHeaderText          '临时列队象
    Dim MyFields()      As String
    Dim tmpFields()     As String
    Dim TmpStr          As String
    Dim myItem          As CListItem
    Dim MyHeader        As CHeader
    Dim SelectNo()      As String
    Dim MaxCount        As Long
    Dim H               As Long      '命令分类
    Dim I               As Long      '列表内容列数
    Dim X               As Long
    Dim F               As Long
    Dim K               As Long
    Dim Q               As Boolean
    Dim W               As Long
    Dim CountHeader     As Long
    Dim myExcel As Object
    Dim myBook As Object
    Dim mySheet As Object
    On Error GoTo ErrExit
    MyFields = Split(FileName, Chr(9), -1, vbBinaryCompare)
    H = UBound(MyFields)

    If PrintZero Then
        For I = 1 To ListItems.Count
            Set myItem = ListItems(I)
            TmpStr = TmpStr & myItem.GetMyItems(MyFields(1)) & vbCrLf
        Next I
    Else
        For I = 1 To ListItems.Count
            Set myItem = ListItems(I)
            TmpStr = TmpStr & myItem.GetMyItemsNoNull(MyFields(1)) & vbCrLf
        Next I
    End If
    Clipboard.Clear
    Clipboard.SetText TmpStr    '设置剪切板
    
    For Each MyHeaderText In HeaderTexts    '列头占用行数
        If MaxCount < MyHeaderText.EndRow Then MaxCount = MyHeaderText.EndRow
        CountHeader = CountHeader + 1
    Next MyHeaderText
    
    If H > 2 Then X = 1
    If H > 3 Then X = 2

    Set myExcel = CreateObject("excel.Application")
    Set myBook = myExcel.workbooks.Add
    Set mySheet = myExcel.worksheets.Add

    mySheet.Cells.Select     '全选
    myExcel.Selection.NumberFormatLocal = "@"    '设置为文本格式
    myExcel.Selection.Font.Size = 11
    
    For Each MyHeaderText In HeaderTexts
        mySheet.Range(R1C1(MyHeaderText.StartCol) & CStr(MyHeaderText.StartRow + H - 2) & ":" & R1C1(MyHeaderText.EndCol) & CStr(MyHeaderText.EndRow + H - 2)).Select
        myExcel.ActiveCell.FormulaR1C1 = MyHeaderText.Title
        If MyHeaderText.StartCol <> MyHeaderText.EndCol Or MyHeaderText.StartRow <> MyHeaderText.EndRow Then myExcel.Selection.Merge     '选定的单元格合并
        myExcel.Selection.HorizontalAlignment = 3    '文字居中对齐
        myExcel.Selection.Font.Bold = True      '黑体字
    Next MyHeaderText
    
    SelectNo = Split(MyFields(1), ",", -1, vbTextCompare)   '删除未选择的列
    TmpStr = ""
    If UBound(SelectNo) > 0 Then
        For K = 1 To CountHeader
            Q = False
            For F = 0 To UBound(SelectNo) - 1
                If Val(SelectNo(F)) = K Then
                    Q = True
                    W = W + 1
                    Exit For
                End If
            Next F
            If Not Q Then TmpStr = TmpStr & R1C1(K) & ":" & R1C1(K) & ","
        Next K
        If Len(TmpStr) > 1 Then TmpStr = Left(TmpStr, Len(TmpStr) - 1)
        If TmpStr > "" Then mySheet.Range(TmpStr).Delete (-4159)
    End If
    
    If H > 1 Then
        mySheet.Range("A" & CStr(I + X + MaxCount + 1)).Select
        myExcel.ActiveCell.FormulaR1C1 = MyFields(2)
        mySheet.Range("A" & CStr(I + X + MaxCount + 1) & ":" & R1C1(W) & CStr(I + X + MaxCount + 1)).Select
        myExcel.Selection.Merge
        If X >= 1 Then
            mySheet.Range("A1").Select
            myExcel.ActiveCell.FormulaR1C1 = MyFields(3)
            myExcel.Selection.HorizontalAlignment = 3    '文字居中对齐
            myExcel.Selection.Font.Bold = True      '黑体字
            mySheet.Range("A1:" & R1C1(W) & "1").Select
            myExcel.Selection.Merge
        End If
        If X > 1 Then
            mySheet.Range("A2").Select
            myExcel.ActiveCell.FormulaR1C1 = MyFields(4)
            mySheet.Range("A2:" & R1C1(W) & "2").Select
            myExcel.Selection.Merge
        End If
    End If
    
    mySheet.Range("A" & CStr(X + MaxCount + 1)).Select
    myExcel.ActiveSheet.Paste    '粘贴内容
    mySheet.Cells.Select        '选择整个表(全选)
    mySheet.Cells.EntireColumn.AutoFit   '自动列宽
    Clipboard.Clear
    
    myBook.SaveAs (MyFields(0))
ErrExit:
    myBook.Close
    Set myBook = Nothing
    Set mySheet = Nothing
End Sub --------------------编程问答-------------------- 很一般。 --------------------编程问答-------------------- 收回楼上。


很好! --------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- up --------------------编程问答-------------------- 这是我做的一个自定义打印,其实真正实现的代码只有不到10句话话搞定了 --------------------编程问答-------------------- 导出不是打印(可以跟据用户选择需要的列进行导出) --------------------编程问答-------------------- 还需要这一个过程
Function R1C1(mNumber As Long) As String
Dim Rc As String
Dim R As String
Dim C As String
Dim X As Long
Dim tmpRC() As String
On Error GoTo ErrExit
If mNumber <= 256 Then
    Rc = ",A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
    tmpRC() = Split(Rc, ",", -1, vbTextCompare)
    X = Int(mNumber / 26)
    R = tmpRC(IIf(X >= 1 And mNumber Mod 26 = 0, X - 1, X))
    C = tmpRC(Fix(IIf(mNumber - X * 26 = 0, 26, mNumber - X * 26)))
    R1C1 = R & C
Else
    R1C1 = ""
End If
ErrExit:
End Function --------------------编程问答-------------------- 这是VB上的源码,大家可以在其它语言上实现其实也不难的
哈哈 --------------------编程问答-------------------- 很有创意,呵呵,收藏到我的博客里去保存起来。 --------------------编程问答-------------------- Excel慢在哪里??
1、创建
2、保存

而不是中间过程——中间过程慢的,大多数都是进行复杂的表格样式生成,而不是数据设置;
所以个人感觉这个东西,实际价值不大的。

1、第三方控件很多都可以做到这点(如Infragistics NetAdvantage)
一条代码就OK了,表格通用导出,速度都很快——主要原因就在于表格样式的普通。。。
2、微软本身已经提供office系列控件,完全可以融合在程序当中了;非常简单的了。

个人看法,仅供参考——不过楼主创意不错,呵呵


││博客空间:http://blog.csdn.net/lovingkiss
││资源下载:http://download.csdn.net/user/lovingkiss
││Email:loving-kiss@163.com [MSN也是这个]
││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤  --------------------编程问答-------------------- Excel慢在哪里??
1、创建
2、保存

而不是中间过程——中间过程慢的,大多数都是进行复杂的表格样式生成,而不是数据设置;
所以个人感觉这个东西,实际价值不大的。

1、第三方控件很多都可以做到这点(如Infragistics NetAdvantage)
一条代码就OK了,表格通用导出,速度都很快——主要原因就在于表格样式的普通。。。
2、微软本身已经提供office系列控件,完全可以融合在程序当中了;非常简单的了。

个人看法,仅供参考——不过楼主创意不错,呵呵


││博客空间:http://blog.csdn.net/lovingkiss
││资源下载:http://download.csdn.net/user/lovingkiss
││Email:loving-kiss@163.com [MSN也是这个]
││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤  --------------------编程问答-------------------- mark --------------------编程问答-------------------- 27楼说慢在: "1、创建 2、保存 " 在这里我不赞同这个观点,
Excel访问剪贴板也是一个中间过程,不过它取得数据的过程是一次性从剪贴板获取全部数,这些数据的载入过程全部是在自己进程内部进行,
而如果采用 Sheel.Cells(X,Y)="Data" 这种循环的过程来保存会慢很多为什么呢——大家都知道两个进程之间的内存是不能互相访问,而要实现
这个过程就必需有另外一个中间过程来实现,而且每个记录都要经过这个中间过程,这会大大降底程序执行的效率所以循环一条条记录地添加会比用剪贴板来实现慢很多,特别是数据量越大越明显 --------------------编程问答-------------------- 我也想了解,谢谢LZ. --------------------编程问答-------------------- 了解
謝謝分享 --------------------编程问答-------------------- Good! --------------------编程问答-------------------- 也不是很难!

输出XML格式就可以了。速度超快。 --------------------编程问答-------------------- 用ADO.net 的方法生成电子表格也可以。

先一个建立表,再建立字段,然后添加。
补充:.NET技术 ,  非技术区
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,