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

WebApp匯入資料之From Excel相关推荐

  1. [轉]資料庫讀寫分離

    From : http://blog.darkhero.net/archives/288 當系統越來越大的時候- 資料庫的負擔也會越來越大..這時候通常都會靠讀寫分離來讓系統更穩定. 讓資料庫更有效率 ...

  2. LabelImg 影像標註工具使用教學,製作深度學習用的資料集

    本篇介紹如何使用 LabelImg 這個免費的影像標註工具,標示照片中的物體,製作成可用來訓練深度學習引擎的輸入資料集. 在使用深度學習來實作影像的物件偵測時,都會需要有大量的已知資料集,也就是照片加 ...

  3. 實戰案例 - 微信平台與自有產品資料對接 (2)

    前面瞭解過程式的背景需求和基本架構之後,接著就來看整個開發工作是靠哪些原始碼兜起來的.因為兩個 WinForm 的原始碼骨架都差不多,所以這邊就拿 SybaseUtility 專案當範例. Servi ...

  4. Python 與數據資料分析2-Matplotlib.pyplot入門

    "Talk is cheap. Show me the code." ― Linus Torvalds 老子第41章 上德若谷 大白若辱 大方無隅 大器晚成 大音希聲 大象無形 道 ...

  5. Python程式與數據資料分析1

    "Talk is cheap. Show me the code." ― Linus Torvalds 老子第41章 上德若谷 大白若辱 大方無隅 大器晚成 大音希聲 大象無形 道 ...

  6. SQL Server 的分散式資料複寫技術

    作者:楊先民 本頁內容 前言 資料庫複寫(Replication)的介紹與使用時機 如何建置資料庫複寫 複寫代理程式 (Replication Agent) 的功能 複寫的種類與使用的時機 設計一個安 ...

  7. mysql hammerdb,[料理佳餚] 用 HammerDB 來執行資料庫 TPC-C 效能量測

    TPC-C 模擬的情境 TPC-C 模擬的情境是一個大型的商品批發商,擁有若干個倉庫,每個倉庫擁有 100000 件商品庫存.負責為 10 個地區供貨,每個地區服務 3000 名客戶,每名客戶平均一筆 ...

  8. C++ 檔案、資料夾、路徑處理函式庫:boost::filesystem

    原帖:https://tokyo.zxproxy.com/browse.php?u=uG7kXsFlW1ZmaxKEvCzu8HrCJ0bXIAddA1s5dtIUZ%2FYzM1u9JI7jjKLT ...

  9. FMDB與SQLite 數據庫應用示範:打做一隻簡單的電影資料庫 App

    原文:http://www.appcoda.com/fmdb-sqlite-database/ 作者:GABRIEL THEODOROPOULOS 譯者:kmyhy 通常在 App 中使用數據庫并處理 ...

最新文章

  1. VS(Visual Studio)中快速找出含中文的字符串
  2. VC++调试程序、快捷键以及Debug版本与Release版本
  3. css搜索的文本框,一个很不错的CSS改写的大表单文本框和搜索按钮组
  4. 数据库表DML不了 可能是被锁了
  5. MySQL分组查询—添加分组前筛选
  6. com 名字对象(3)使用IMoniker
  7. 【kafka】kafka KeeperErrorCode = ConnectionLoss for /config/topics
  8. ad6怎么画电阻_德国人怎么学电机——浅谈电机模型(十七):同步电机(四)永磁电机(二)...
  9. python入门指南 许半仙txt-影帝的脑子坏了
  10. html网页制作中的问题,网页制作中注意应用HTML标签的问题
  11. flutter配置高德地图定位
  12. word论文公式加点
  13. windows7快捷键-好玩的
  14. 深度学习CV文章整理
  15. 迅为电子HMI人机界面|CAN总线触摸屏
  16. [Pytorch系列-30]:神经网络基础 - torch.nn库五大基本功能:nn.Parameter、nn.Linear、nn.functioinal、nn.Module、nn.Sequentia
  17. 一)中央空调变风量变水量整体群控节能系统(专利技术)
  18. Extjs后台管理系统模板
  19. [高通SDM450][Android 9.0] 虹软人脸算法WIFI信息变化导致授权失败
  20. python实时抢网页红包_Python实现自动抢红包功能

热门文章

  1. 消费金融资金断流,银行抽贷、通道暂停,P2P离场
  2. 月息2%的贷款算高利贷吗?
  3. 几张旧照片,用傻瓜拍的,翻出来凑数
  4. 状态机在VHDL中的实现
  5. TFT显示屏驱动设计与验证
  6. C++11 Lambda函数(匿名函数)
  7. android webview 禁止放大缩小,WebView无法放大缩小解决方案
  8. python matplotlib_Python の Matplotlib
  9. 计算机操作记录怎么删除,win7系统如何清除电脑使用记录
  10. html php滚动代码,html中滚动条的代码是什么?如何设置html滚动条?