web程序生成excel

一、生成EXCEL的DLL文件

        1、先决条件:计算机有安装office。

        2、生成excel2003的Dll文件:将【C:\Program Files\Microsoft Office\OFFICE11\】目录下的EXCEL.EXE文件拷贝到【C:\Visual Studio.Net\SDK\v1.1\Bin\】目录下。

        3、打开Visual Studio 的.net命令提示,运行TlbImp EXCEL.EXE Excel.dll,则在【C:\Visual Studio.Net\SDK\v1.1\Bin\】目录下生成excel.dll文件。

        4、程序中添加对excel.dll文件的引用。

二、服务器端的设置

        1、在服务器上安装office的Excel软件。

        2、在【开始】->【运行】中输入dcomcnfg.exe启动【组件服务】。

        3、依次双击【组件服务】->【计算机】->【我的电脑】->【DCOM配置】。

        4、在【DCOM配置】中找到【Microsoft Excel 应用程序"】,在它上面点击右键,然后点击【属性】,弹出【Microsoft Excel 应用程序属性】对话框。

        5、点击【标识】标签,选择【交互式用户】。

        6、点击【安全】标签,在【启动和激活权限】上点击【自定义】,然后点击对应的【编辑】按钮,在弹出的【安全性】对话框中填加一个【NETWORK SERVICE】用户(注意要选择本计算机名),并给它赋予【本地启动】和【本地激活】权限。

        7、依然是【安全】标签,在【访问权限】上点击【自定义】,然后点击【编辑】,在弹出的【安全性】对话框中也填加一个【NETWORK SERVICE】用户,然后赋予【本地访问】权限。

        注意:关于用户,winxp系统下是ASPNET,win2003系统下是NETWORK SERVICE (有域的情况下位置选本机)

三、相关代码      

Imports Interop
Imports System.Web.HttpServerUtility
Imports Interop.Excel.Constants
Imports Interop.Excel.XlPasteType
Imports Interop.Excel.XlBordersIndex
Imports Interop.Excel.XlLineStyle
Imports Interop.Excel.XlBorderWeight
Imports Interop.Excel.XlUnderlineStyle

Public Class clsCommonExcel2
    Inherits System.Web.UI.Page

    ''' <summary>
    ''' 生成EXCEL文件
    ''' </summary>
    ''' <param name="table">需要导出的datatable</param>
    ''' <param name="sheetName">excel的sheet名</param>
    ''' <param name="newFileName">新文件名</param>
    ''' <param name="txtFormat">需要甚至为文本格式的列</param>
    ''' <param name="cntPerSheet">每个sheet显示数据条数</param>
    ''' <remarks></remarks>
    Public Sub createAndDowloadExcel(ByVal table As DataTable, ByVal sheetName As String, _
                                     ByVal newFileName As String, ByVal txtFormat As String, _
                                     ByVal cntPerSheet As Integer)
        createExcelFile(table, sheetName, newFileName, txtFormat, cntPerSheet)
        '回收进程
        GC.Collect()
    End Sub
    ''' <summary>
    ''' 生成EXCEL文件过程
    ''' </summary>
    ''' <param name="table">需要导出的datatable</param>
    ''' <param name="sheetName">excel的sheet名</param>
    ''' <param name="newFileName">新文件名</param>
    ''' <param name="txtFormat">需要甚至为文本格式的列</param>
    ''' <param name="cntPerSheet">每个sheet显示数据条数</param>
    ''' <remarks></remarks>
    Protected Sub createExcelFile(ByVal table As DataTable, ByVal sheetName As String, _
                                  ByVal newFileName As String, ByVal txtFormat As String, _
                                  ByVal cntPerSheet As Integer)
        Dim app As Excel.Application
        Dim workbook As Excel.Workbook
        Dim worksheet As Excel.Worksheet
        Dim arr(,) As Object
        Dim cntSheet As Integer
        Dim m As Integer

        '删除既存文件
        System.IO.File.Delete(Server.MapPath("../../DownLoadFile/" + newFileName))

        '引用Excel对象
        app = New Excel.Application
        app.Visible = False
        workbook = app.Workbooks.Add(1)

        app.DisplayAlerts = False
        workbook.SaveAs(Server.MapPath("../../DownLoadFile/" + newFileName))

        '计算sheet数
        If table.Rows.Count Mod cntPerSheet = 0 Then
            cntSheet = table.Rows.Count / cntPerSheet
        Else
            cntSheet = Int(table.Rows.Count / cntPerSheet) + 1
        End If
        '为每个sheet添加值
        For k = 0 To cntSheet - 1

            '设置excel的sheet的列名
            ReDim arr(cntPerSheet, table.Columns.Count - 1)
            For j As Integer = 0 To table.Columns.Count - 1
                arr(0, j) = table.Columns(j).ColumnName
            Next

            '定位到当前sheet
            workbook.Sheets(workbook.Sheets.Count).Select()
            '添加新的sheet
            worksheet = workbook.Sheets.Add()
            '设置sheet的名称
            worksheet.Name = sheetName + "_" + (k + 1).ToString

            '给每个sheet填充值
            m = 1
            For i As Integer = k * cntPerSheet To (k + 1) * cntPerSheet - 1
                If i < table.Rows.Count Then
                    For j As Integer = 0 To table.Columns.Count - 1
                        'arr(m, j) = table.Rows(i).Item(j)
                        If Not IsNumeric(table.Rows(i).Item(j)) AndAlso table.Rows(i).Item(j).ToString.Length > 1 AndAlso (Left(table.Rows(i).Item(j).ToString, 1).Equals("-") OrElse Left(table.Rows(i).Item(j).ToString, 1).Equals("=")) Then
                            arr(m, j) = "'" + table.Rows(i).Item(j)
                        Else
                            arr(m, j) = table.Rows(i).Item(j)
                        End If

                    Next
                    m = m + 1
                End If
            Next

            '设置sheet格式
            With worksheet
                .Cells.Select()
                With app.Selection.Font
                    .Name = "宋体"
                    .Size = 11
                    .Strikethrough = False
                    .Superscript = False
                    .Subscript = False
                    .OutlineFont = False
                    .Shadow = False
                    .Underline = xlUnderlineStyleNone
                    .ColorIndex = xlAutomatic
                End With

                .Range("A1:" + num2letter(worksheet, table.Columns.Count) + "1").Select()
                With app.Selection.Interior
                    .ColorIndex = 6
                    .Pattern = xlSolid
                End With
                app.Selection.Font.Bold = True
                With app.Selection
                    .HorizontalAlignment = xlCenter
                    .VerticalAlignment = xlCenter
                    .WrapText = False
                    .Orientation = 0
                    .AddIndent = False
                    .IndentLevel = 0
                    .ShrinkToFit = False
                    .ReadingOrder = xlContext
                    .MergeCells = False
                End With

                '设置文本列
                Dim arrInx() As String = txtFormat.Split(",")
                For i As Integer = 0 To arrInx.Length - 1
                    '设置文本格式
                    .Columns(num2letter(worksheet, CInt(arrInx(i))) + ":" + num2letter(worksheet, CInt(arrInx(i)))).Select()
                    app.Selection.NumberFormatLocal = "@"
                Next

                worksheet.Range("A1").Resize(cntPerSheet + 1, table.Columns.Count).Value = arr

                .Columns("A:" + num2letter(worksheet, table.Columns.Count)).Select()
                .Columns("A:" + num2letter(worksheet, table.Columns.Count)).EntireColumn.AutoFit()

            End With
            worksheet.Range("A1").Select()
        Next
        workbook.Sheets(workbook.Sheets.Count).Select()
        app.ActiveWindow.SelectedSheets.Delete()
        workbook.Sheets(1).Select()

        app.DisplayAlerts = False
        workbook.Save()
        workbook.Close()  'add 2011.11.1
        app.Quit()
        app = Nothing

    End Sub

    ''' <summary>
    ''' 设置文本列
    ''' </summary>
    ''' <param name="worksheet">excel的sheet名</param>
    ''' <param name="n">n必须是介于1到256之间的有效列号</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function num2letter(ByVal worksheet As Excel.Worksheet, ByVal n As Integer) As String
        If n >= 1 And n <= 256 Then
            num2letter = IIf(n <= 26, Mid(worksheet.Cells(1, n).Address, 2, 1), Mid(worksheet.Cells(1, n).Address, 2, 2))
        Else
            num2letter = ""
        End If
    End Function
End Class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值