WebApp匯入資料之From Excel

1、情景
點擊“瀏覽”按鈕,尋找要上傳的Excel。按下上傳按鈕,資料寫入資料庫(database)並且顯示在畫面上。
然後,按下“保存”按鈕,Datagrid上的資料寫入DB。
2、分析
按下上傳按鈕,先將Excel上傳到Server上;再將Excel的內容讀入Datatable中;然後刪除Excel檔;最後檢查Datatable的內容正確性,寫入database。
3、實現
上傳按鈕部分
    Protected Sub btnUpload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUpload.Click

        ' check is has file
        If Not upExcel.HasFile Then
            JavascriptUtility.Alert(Me, "請先上傳檔案")
            Exit Sub
        End If

        Dim filename As String = String.Empty
        Dim savePath As String = String.Empty
        Dim dt As DataTable = Nothing

        Try
            filename = Format(Now, "yyyyMMddHHmmss") & ".xls"

            ' 上傳檔案
            savePath = ModuleExcel.SaveUploadFile(upExcel, filename)

            ' 讀取Excel的內容
            dt = ModuleExcel.ReadExcel(savePath, 1, "I1ElM", 2, New Integer() {1}, 1)

            ' Delete Excel
            System.IO.File.Delete(savePath)

            ' 計算Excel
            'RunExcel(DataTable)
        Catch ex As System.IO.DirectoryNotFoundException
            JavascriptUtility.Alert(Me, ex.Message)
        Catch ex As ModuleExcel.ExcelColumnDifferenceException
            JavascriptUtility.Alert(Me, ex.Message)
        Catch ex As Exception
            JavascriptUtility.Alert(Me, ex.Message)
        End Try
    End Sub
Excel 操作方法部分
Public Class ModuleExcel
    ''' <summary>
    ''' 上傳Excel文件
    ''' </summary>
    ''' <param name="InputFile">上傳控件</param>
    ''' <param name="Filename">文件名稱(主文件名+擴展名)</param>
    Public Shared Function SaveUploadFile(ByRef InputFile As WebControls.FileUpload, ByVal Filename As String) As String
        Dim path As String = System.Configuration.ConfigurationManager.AppSettings("UploadPath")
        path = System.Web.HttpContext.Current.Server.MapPath(path) & "\" & Filename
        InputFile.SaveAs(path)
        Return path
    End Function

    ''' <summary>
    ''' 讀取Excel的內容
    ''' </summary>
    ''' <param name="excelPath">Excel文件物理路徑</param>
    ''' <param name="sheetIndex">Excel文件索引(從1開始)</param>
    ''' <param name="columnName">Excel欄位名稱(大寫),逗號分隔。</param>
    ''' <param name="startRowIndex">Excel數據行索引(從1開始)</param>
    ''' <param name="canNotNullColumn">Excel不可空白欄位索引</param>
    ''' <param name="columnCount">Excel欄位總數</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function ReadExcel(ByVal excelPath As String, ByVal sheetIndex As Integer, ByVal columnName As String, ByVal startRowIndex As Integer, _
        ByVal canNotNullColumn As Integer(), ByVal columnCount As Integer) As DataTable

        Dim excelApp As New Excel.Application
        Dim workSheet As Excel.Worksheet
        Dim workBook As Excel.Workbook

        Dim Range1 As Excel.Range

        Dim x As Integer

        Dim dataTable As New Data.DataTable

        '開啟Excel檔
        workBook = excelApp.Workbooks.Open(excelPath)

        Try
            ' 取Sheet
            workSheet = workBook.Worksheets.Item(sheetIndex) 'workBook.Worksheets.Item(1)

            ' GetExcelcolumnName:取Excel欄位並且用逗號分隔
            If columnName = GetExcelcolumnName(workSheet, dataTable).ToUpper() Then
                For x = startRowIndex To workSheet.Rows.Count ' For x = 2 To workSheet.Rows.Count ' 數據行

                    Dim notNullCount As Integer = 0
                    For i As Integer = 0 To canNotNullColumn.Length - 1
                        Range1 = workSheet.Cells(x, canNotNullColumn(i))  ' Range1 = workSheet.Cells(x, 1)
                        If CType(Range1.Value, String) <> "" Then
                            notNullCount += 1
                        End If
                    Next

                    If notNullCount = canNotNullColumn.Length Then ' 不可空欄位都不是空
                        For j As Integer = 1 To columnCount 'Excel計數從1開始  ‘ 數據列
                            Range1 = workSheet.Cells(x, j)
                            AddDataRow(dataTable, j - 1, Range1.Value)
                        Next
                    Else  ' 空則認為讀完
                        Exit For
                    End If
                Next
            Else
                Throw New ExcelColumnDifferenceException("指定欄位與Excel實際欄位不一致")
            End If
        Catch ex As ExcelColumnDifferenceException
            Throw ex
        Catch ex As Exception
            Throw New Exception("Read excel wrong", ex)
        Finally
            excelApp.Workbooks.Close()
            excelApp.Quit()
            excelApp = Nothing
        End Try
        Return dataTable
    End Function

    ''' <summary>
    ''' 獲取Excel的欄位
    ''' </summary>
    ''' <param name="workSheet">Excel sheet</param>
    ''' <param name="dataTable">存放資料的table</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetExcelcolumnName(ByVal workSheet As Excel.Worksheet, ByRef dataTable As Data.DataTable) As String

        If workSheet Is Nothing Then
            Throw New ArgumentNullException("workSheet", "workSheet為空")
        End If

        If workSheet Is Nothing Then
            Throw New ArgumentNullException("dataTable", "dataTable為空")
        End If

        Dim sCol As String = String.Empty
        For i As Integer = 1 To workSheet.Columns.Count
            Dim Range1 As Excel.Range
            Dim cellV As String = String.Empty
            Range1 = workSheet.Cells(1, i)
            cellV = CType(Range1.Value, String)

            If cellV <> String.Empty Then
                ' Join column
                sCol &= cellV & ","
                ' Create column
                dataTable.Clear()
                dataTable.Columns.Add(cellV)
            Else
                Exit For
            End If
        Next

        If sCol.Length > 0 Then
            Dim _idx As Integer = sCol.LastIndexOf(",")
            If _idx > -1 Then
                sCol = sCol.Substring(0, _idx)
            End If
        End If
        Return sCol
    End Function

    ''' <summary>
    ''' 新增資料行
    ''' </summary>
    ''' <param name="dataTable">資料表</param>
    ''' <param name="columnIndex">列索引</param>
    ''' <param name="rowValue">值</param>
    ''' <remarks></remarks>
    Public Shared Sub AddDataRow(ByRef dataTable As Data.DataTable, ByVal columnIndex As Integer, ByVal rowValue As String)
        If dataTable Is Nothing Then
            Throw New ArgumentNullException("dataTable", "dataTable為空")
        End If

        If columnIndex < 0 Then
            Throw New ArgumentOutOfRangeException("columnIndex", "columnIndex超出Excel欄範圍")
        End If

        Dim dr As Data.DataRow
        dr = dataTable.NewRow
        dr(columnIndex) = rowValue
        dataTable.Rows.Add(dr)

    End Sub

    Public Class ExcelColumnDifferenceException
        Inherits System.ArgumentException
        Public Sub New(ByVal message As [String])
            MyBase.New(message)
        End Sub
        Public Sub New(ByVal message As [String], ByVal innerException As Exception)
            MyBase.New(message, innerException)
        End Sub
    End Class
End Class

注意
使用office Excel元件操作Excel,需要設定DCOM+的權限。
1,“控制臺”-->“系統管理工具”-->“元件服務”,然後找到“DCOM設定”。如下圖

转载于:https://www.cnblogs.com/htht66/archive/2010/10/29/1864442.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263743.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在linux系统中查看组管理信息命令,Linux用户和组管理常用命令

导读这篇文章主要介绍了用户和组管理常见,总结整理了linux用户和组管理相关原理、操作与使用注意事项,需要的朋友可以参考下。1、用户隶属于用户组的2、用户与用户组配置文件1)用户组配置文件/etc/group第一列&#xff1a;用户组的组名第二列&#xff1a;组密码(真正的密码存储…

sql server 函数学习

sql server 创建函数 资料 https://docs.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/create-user-defined-functions-database-engine?viewsql-server-2017 https://www.cnblogs.com/ABblog/p/5660610.html -- SELECT *from wzh_demo1 CREATE FUN…

在linux操作系统也有非常友好的图形界面,一般我们称为,在linux操作系统也有非常友好的图形界面,一般我们称为...

操作不属类型的是梗死于脑。理学完全得益中于物&#xff0c;系统形界香气空气带有的分使得散子在中扩&#xff0c;们的被我鼻子:花大学的芬感知中国芳能。比性会计核算的可原则&#xff0c;也有友好般期间不同会计会计信息向比较的纵以便。户贷记录是&#xff1a;非常在账方的&…

Codechef January Challenge 2018 - Killjee and k-th letter

题意&#xff1a; 给出一个的串 s&#xff0c;将 s 所有子串按照字典序排列好相接起来形成一个新串q次询问&#xff0c;每一次询问问新串中的第 k 个字符是什么&#xff0c;强制在线。 $|s|,q \le 2*10^{5} $ 跟所有子串有关&#xff0c;那肯定要么是后缀自动机&#xff0c;要么…

AppFabric Caching Admin Tool

最近试用了一下MS的AppFabric的分布是缓存&#xff08;Velocity&#xff09;&#xff0c;发现了一个不错的可视化配置工具挺有用&#xff0c;先介绍给大家&#xff0c;后续再详细介绍。 http://mdcadmintool.codeplex.com/ Project Description The AppFabric Caching Admin To…

剑指offer——最小的K个数和数组中第K大的元素

解题思路&#xff1a; 乘着做这个题&#xff0c;顺便复习下堆排序。 先说堆排序是一个什么东西&#xff1a;https://blog.csdn.net/u013384984/article/details/79496052 大顶堆升序&#xff0c;小顶堆降序。 随便定义的一个堆。 第一步&#xff1a; 此时我们从最后一个非叶子结…

GIS二次开发之初探

最近一段时间在学习GIS的二次开发&#xff0c;作为新手&#xff0c;最好的方法就是泡论坛&#xff0c;看原码&#xff0c;当然涉及到地理方面的专业知识&#xff0c;不可能说一两天就可以弄懂&#xff0c;只有在学习编程的过程中慢慢的去体会一些地理专业上面的知识。 就几天的…

linux传奇源码,游戏源码 屠龙传奇H5 鲲乃异兽 全套源码+教程

一、游戏的要求系统要求系统要求liunx6.9系统 因为游戏是java对服务器配置要求比较高如果您的资金够宽裕可以选择直接购买 liunx6.9系统 8核16G 240G/320G硬盘 10兆以上宽带的服务器 这样可以直接保证游戏的稳定性如果不想出那么多钱 可以一步一步来开新区用4核4G 1…

如何量化考核软件开发人员绩效

为什么80%的码农都做不了架构师&#xff1f;>>> 1、首先有技术积累的前提下&#xff0c;能比较正确的估量项目成本和项目组生产率 2、设立项目组短期目标、中期、长期目标&#xff08;这个因项目具体情况而已&#xff0c;有些项目都是很小的&#xff0c;甚至2个星期…

linux创建自定义组件qt,关于QT自定义控件

Linux中I/O设备分为两类&#xff1a;块设备和字符设备。两种设备本身没有严格限制&#xff0c;但是&#xff0c;基于不同的功能进行了分类。用户自定义的控件可以通过继承现有的 Qt 控件实现&#xff0c;也可以直接从 QWidget 继承。QT中的label控件&#xff0c;没有预定义的单…

jQuery三级下拉菜单

演示地址:http://www.corange.cn/demo/3738/index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"&g…

linux gcc march arch,Gcc的spec中arch什么的指定

gcc/gcc.c中的set_collect_gcc_options这里面有COLLECT_GCC_OPTIONS-marcharmv4t -mtunearm920t(gdb) p switches[0]$15 {part1 0x80792b1 "marcharmv4t", args 0x0, live_cond 1,validated 1 \001, ordering 0 \000}(gdb) p switches[1]$16 {part1 0x80792c…

php如何解决中文乱码问题?

为什么会出现中文乱码&#xff1f; 很多新手朋友学习PHP的时候&#xff0c;发现程序中的中文在输出的时候会出现乱码的问题&#xff0c;那么为什么会出现这种乱码的情况呢&#xff1f;一般来说&#xff0c;乱码的出现有2种原因&#xff0c;一种是由于编码(charset) 设置错误&am…

红帽将召开“开放你的世界”在线论坛

国外媒体报道&#xff0c;美国时间5月27日&#xff0c;红帽公司将召开在线开源论坛&#xff0c;主题为“开放你的世界”。时间为美国东部时间8:45-17:30.该论坛讨论的议题包括opensource.com网站所覆盖的健康医疗、教 育、政府、法律等领域。论坛嘉宾包括这些领域的开源思考者及…

Java提取文本文档中的所有网址(小案例介绍正则基础知识)

正则表达式基础以及Java中使用正则查找 定义&#xff1a; 正则表达式是一些用来匹配和处理文本的字符串 正则的基础&#xff08;先大致了解下&#xff09; 1. 正则表达式的作用 查找特定的信息&#xff08;搜索&#xff09;替换一些文本&#xff08;替换&#xff09;2. 正则基础…

Windows与Linux之间海量文件的传输与Linux下大小写敏感问题

Windows与Linux之间海量文件的传输与Linux下大小写敏感问题 mount.cifs 支持通过网络文件系统挂载&#xff0c;不过需要安装cifs-utils&#xff0c;也可通过mount -t cifs挂载&#xff0c;详细的选项可参见man mount.cifs 1. 通过Windows共享文件夹 1.1 设置windows共享1.2 Lin…

c语言如何读取mp3歌曲信息,VC中读取mp3文件信息的方法

标准格式的mp3文件中&#xff0c;都有一些自身描述的信息&#xff0c;比如歌曲名称、歌手、专辑名称等信息。这些信息都记录在mp3文件中&#xff0c;而且格式是固定的。那么&#xff0c;我们就可以用编程的方式来获取这些信息。其实说简单一点&#xff0c;就是VC文件读取的操作…

kvm虚拟机热迁移

1. 迁移介绍 迁移&#xff1a; 系统的迁移是指把源主机上的操作系统和应用程序移动到目的主机&#xff0c;并且能够在目的主机上正常运行。在没有虚拟机的时代&#xff0c;物理机之间的迁移依靠的是系统备份和恢复技术。在源主机上实时备份操作系统和应用程序的状态&#xff0c…

通过图表简化sql语句的表关联

在之前的博文中分享过一个执行了两天的一条sql语句&#xff0c;走了两个大表的扫描&#xff0c;导致执行时间很长&#xff0c;通过简化sql做了不小的改进&#xff0c;今天我们来看看还可以做些什么。 上次简化后的语句如下&#xff1a;with tmp_logical_date as (SELECT logica…

[翻译] BFKit

BFKit BFKit is a collection of useful classes to develop Apps faster. BFKit是一个有用的工具集合&#xff0c;帮助你快速开发。 Installing and Usage Pod Pod安装 Create a Podfile in your project directoryWrite:platform :ios, 7.0xcodeproj Project.xcodeproj pod …