ASP.NET 导出模板格式的EXCEL

10 篇文章 0 订阅
1 篇文章 0 订阅


Imports Interop
Imports System.IO
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 clsCommonExcelTemplate
    Inherits System.Web.UI.Page

    Public Sub createAndDowloadExcel(ByVal dt As DataTable, _
                                     ByVal strTemplateFile As String, _
                                     ByVal strExportFile As String, _
                                     ByVal strSheetName As String, _
                                     ByVal txtFormat As String, _
                                     ByVal intPerSheet As Integer)
        createExcelFile(dt, strTemplateFile, strExportFile, intPerSheet, txtFormat, strSheetName)
        '回收进程
        GC.Collect()
    End Sub

    Protected Sub createExcelFile(ByVal dt As DataTable, _
                                  ByVal strTemplateFile As String, _
                                  ByVal strExportFile As String, _
                                  ByVal intPerSheet As Integer, _
                                  ByVal txtFormat As String, _
                                  Optional ByVal strSheetName As String = "")

        '获取完整的模板文件路径
        Dim strTemplateFilePath As String = Server.MapPath("../../TmplateFile/") + strTemplateFile
        '获取完整的到处文件路径
        Dim strExportFilePath As String = Server.MapPath("../../DownLoadFile/") + strExportFile

        Dim intSheetNum As Integer = 0 'sheet数

        '计算sheet数
        If dt.Rows.Count Mod intPerSheet = 0 Then
            intSheetNum = dt.Rows.Count / intPerSheet
        Else
            intSheetNum = Int(dt.Rows.Count / intPerSheet) + 1
        End If

        'sheet名
        If String.IsNullOrEmpty(strSheetName) Then
            strSheetName = "Sheet"
        End If

        '创建一个Application对象并使其可见
        Dim app As New Excel.Application
        app.Visible = False
        '保存Excel的时候,不弹出是否保存的窗口直接进行保存
        app.DisplayAlerts = False
        '打开模板文件,得到WorkBook对象
        Dim workbook As Excel.Workbook = app.Workbooks.Open(strTemplateFilePath, False)

        '得到WorkSheet对象
        Dim worksheet As Excel.Worksheet = workbook.Sheets(1)

        Dim arr(,) As Object
        Dim intArrRow As Integer = 0
        '取得数据插入起始行
        Dim intStartRow As Integer = 0

        '处理worksheet
        Select Case strTemplateFile.ToString
            Case "账票1.xls"

                worksheet.Range("A2").Value = dt.Rows(0).Item("YEAR").ToString + "年"
                worksheet.Range("N2").Value = Now.Date.ToString("yyyy年MM月dd日")
                dt.Columns.Remove("YEAR")
                intStartRow = 4

            Case Else

        End Select

        '复制Sheet
        If intSheetNum >= 2 Then

            For i As Integer = 2 To intSheetNum
                worksheet.Copy(After:=workbook.Sheets(workbook.Sheets.Count))
            Next
        End If

        Dim intRowCount As Integer = dt.Rows.Count '源DataTable行数
        Dim intColCount As Integer = dt.Columns.Count '源DataTable列数
        Dim intEndRow As Integer
        Dim range As Excel.Range

        '将数据写入到EXCEL
        For intSheetNo As Integer = 1 To intSheetNum

            ReDim arr(intPerSheet, dt.Columns.Count - 1)
            worksheet = workbook.Sheets(intSheetNo)
            worksheet.Name = strSheetName + "_" + intSheetNo.ToString
            intArrRow = 0
            If intSheetNo = intSheetNum Then
                intEndRow = dt.Rows.Count Mod intPerSheet + intStartRow - 1
            Else
                intEndRow = intPerSheet + intStartRow - 1
            End If

            For intCurrentRow As Integer = (intSheetNo - 1) * intPerSheet To intSheetNo * intPerSheet - 1
                If intCurrentRow < dt.Rows.Count Then
                    For intColumn As Integer = 0 To dt.Columns.Count - 1
                        If IsDBNull(dt.Rows(intCurrentRow).Item(intColumn)) Then
                            arr(intArrRow, intColumn) = ""
                        Else
                            arr(intArrRow, intColumn) = dt.Rows(intCurrentRow).Item(intColumn)
                        End If
                    Next
                    intArrRow = intArrRow + 1
                End If
            Next

            worksheet.Activate()

            '设置文本格式
            If String.IsNullOrEmpty(txtFormat) = False Then
                Dim arrInx() As String = txtFormat.Split(",")
                For i As Integer = 0 To arrInx.Length - 1

                    worksheet.Columns(num2letter(worksheet, CInt(arrInx(i))) + ":" + num2letter(worksheet, CInt(arrInx(i)))).Select()

                    app.Selection.NumberFormatLocal = "@"
                Next
            End If
            '赋值
            worksheet.Range("A" + intStartRow.ToString).Resize(intPerSheet + 1, dt.Columns.Count).Value = arr

            '账票1中将值不等于0的数据的背景色设置为黄色,字体为红色
            If strTemplateFile = "账票1.xls" Then
                For i As Integer = intStartRow To intEndRow
                    If worksheet.Range("F" + i.ToString).Value <> 0 Then
                        worksheet.Range("F" + i.ToString).Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red)
                        worksheet.Range("F" + i.ToString).Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Yellow)
                    End If
                Next
            End If

            '设置cell的线条
            range = worksheet.Range("A" + intStartRow.ToString + ":" + num2letter(worksheet, intColCount) + intEndRow.ToString)
            range.Cells.Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            '设置选中的单元格
            worksheet.Range("A" + intStartRow.ToString).Select()
        Next

        workbook.Sheets(1).Select()
        Try
            '输出Excel文件并退出
            workbook.SaveAs(strExportFilePath)
            workbook.Close()
            '保存Excel的时候,不弹出是否保存的窗口直接进行保存
            app.DisplayAlerts = False
            app.Workbooks.Close()
            app.Application.Quit()
            app.Quit()

            worksheet = Nothing
            workbook = Nothing
            app = Nothing
        Catch ex As Exception
            Throw ex
        Finally

        End Try

    End Sub

    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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值