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;组密码(真正的密码存储…

Node.js有了新的管理者

一段时间以来&#xff0c;围绕Node.js发展方向的争论一直不断。去年10月&#xff0c;Joyent宣布成立Node.js咨询委员会&#xff0c;探索一种开放式的治理模式&#xff0c;但还是没能避免io.js分支的出现。而不久前&#xff0c;Node.js和io.js似乎出现了合二为一的希望。近日&am…

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;非常在账方的&…

Trust is the most important thing to the team!

Trust is the most important thing to the team!转载于:https://www.cnblogs.com/7hihi/archive/2010/11/23/2564240.html

MATLAB中导入数据:importdata函数

用load函数导入mat文件大家都会。可是今天我拿到一个数据&#xff0c;文件后缀名竟然是‘.data’。该怎么读呢&#xff1f; 我仅仅好用matlab界面Workspace区域的“import data”button手工导入该文件。恩&#xff0c;还好&#xff0c;竟然成功了。顺便提一下&#xff0c;这个“…

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;要么…

linux如何过滤字符串,在linux系统如何grep过滤中,不包含某些字符串的命令

转&#xff1a;http://www.dutycode.com/linux_grep_bubaohan.html文章系转载&#xff0c;亲测可用(转载自&#xff1a;http://www.itokit.com/2014/0105/75018.html)grep命令应该是我们在获取字符串内容时&#xff0c;或读取文件时&#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; 此时我们从最后一个非叶子结…

深度启动盘工具linux,Linux下无法安装深度启动盘制作工具

正在选中未选择的软件包 deepin-boot-maker。(正在读取数据库 ... 系统当前共安装有 231455 个文件和目录。)正准备解包 deep.deb ...正在解包 deepin-boot-maker (2.0.0-1) ...dpkg: 依赖关系问题使得 deepin-boot-maker 的配置工作不能继续&#xff1a;deepin-boot-maker 依赖…

GIS二次开发之初探

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

构建之法阅读笔记03

个人感受&#xff1a; 过去&#xff1a;个人英雄主义&#xff0c;却是一只狗熊 为什么不好&#xff1a;双拳难敌四腿&#xff0c;大项目一个人是很难完成的 解决方法&#xff1a;加入团队&#xff0c;共同开发 这章让我了解到了很多种软件开发的团队模式&#xff0c;有娱乐性的…

CSS3 2D Transform

位移translate()函数 结合起来&#xff0c;translate()函数移动元素主要有以下三种移动&#xff1a; 水平移动&#xff1a;向右移动translate(tx,0)和向左移动translate(-tx,0)&#xff1b;垂直移动&#xff1a;向上移动translate(0,-ty)和向下移动translate(0,ty);对角移动&am…

[转]用g++编译动态链接库

写了一个最简单的动态链接库程序&#xff0c;使用g命令行编译。怕以后忘记&#xff0c;就把它记到blog中。动态库导出头文件:/** * file: dll.h * Powered by JGood 2009-09-22 */ #ifndef __dll_h__#define __dll_h__ #ifdef __MY_DLL_LIB__ #define DLL_EXPORT extern …

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

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

javascript setTimeout 和 setInterval 区别

[setTimeout]setTimeout(表达式,延时时间)在执行时,是在载入后延迟指定时间后,去执行一次表达式,记住,次数 是一次用setTimeout实现的自动变化显示随机数的效果:<html><head><script>window.οnlοadsett;function sett(){document.body.innerHTMLMath.rando…

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

为什么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…