关于怎么在后台获取到Excel表中的数据,并添加到Excel表格中 ,用代码创建一个Excel表格 # WebForm


关于怎么在后台获取到Excel表中的数据,并添加到Excel表格中,用代码创建一个Excel表格


实现步骤:
1.引入关于操作Excel表格的命名空间

Imports System.IO
Imports Aspose.Cells

2.声明一个方法,传入文件流对象,获取到文件流中的数据

'ExcelFile是上传的Excel文件
Private Function GetDataSource(ByVal ExcelFile As Stream) As DataTable
        '打開EXCEL文件
        Dim mWorkBook As New Aspose.Cells.Workbook(ExcelFile)
        '判斷指定的worksheet的名字為DataSource   
        'worksheet就是Excel文档左下角的选项卡名字,item("你想要的名字")
        If mWorkBook.Worksheets.Item("DataSource") Is Nothing Then
            Me.Error.Text = "上傳文件的左下角Sheet名稱有誤,請確認其名為:DataSource" '"上傳文件的Sheet名稱有誤,請確認其名為:DataSource"
            Return Nothing
        End If
        '構建一個新的表,用来存Excel文件中的数据
        Dim dtSource As New DataTable
        '建立數據列
        Dim dtC1 As New DataColumn("Names", System.Type.GetType("System.String"))
        Dim dtC2 As New DataColumn("Model", System.Type.GetType("System.String"))
        Dim dtC3 As New DataColumn("Count", System.Type.GetType("System.String"))
        Dim dtC4 As New DataColumn("Unit", System.Type.GetType("System.String"))
        '獲取到DataSource選項卡中的表格
        Dim DataSheet As Worksheet = mWorkBook.Worksheets.Item("DataSource")
        '把剛剛建立的數據列添加到表中
        dtSource.Columns.AddRange(New DataColumn() {dtC1, dtC2, dtC3, dtC4})
        '用于表示Excel中的第几行
		Dim idx As Integer = 1
        '通過while循環遍歷出DataSource選項卡中所有的列中的數據,然後填充到刚刚构建的新表中
        While (DataSheet.Cells(idx, 0).Value IsNot Nothing) AndAlso (DataSheet.Cells(idx, 0).Value.ToString.Trim <> "")
			
			'获取到每一行每一列的数据,idx就是行数
            Dim Names As String = IIf(DataSheet.Cells(idx, 0).Value Is Nothing, "", DataSheet.Cells(idx, 0).Value)
            Dim sModel As String = IIf(DataSheet.Cells(idx, 1).Value Is Nothing, "", DataSheet.Cells(idx, 1).Value)
            Dim Count As String = IIf(DataSheet.Cells(idx, 2).Value Is Nothing, "", DataSheet.Cells(idx, 2).Value)
            Dim Unit As String = IIf(DataSheet.Cells(idx, 3).Value Is Nothing, "", DataSheet.Cells(idx, 3).Value)
			
			'给刚刚构建的新表中添加新的一行数据
            Dim DrNew As DataRow = dtSource.NewRow
            DrNew.Item("Names") = Names.Trim
            DrNew.Item("Model") = Model.Trim
            DrNew.Item("Count") = Count.Trim
            DrNew.Item("Unit") = Unit.Trim
            dtSource.Rows.Add(DrNew)

            idx += 1
        End While
		'循环结束,返回一个Dataset表数据
        Return dtSource

End Function

3.获取上传的Excel文件,并且判断是否符合上传标准

'获取到FileUpload控件上传的文件
Dim myFile As FileUpload = CType(Me.FileUpload1, FileUpload)
		'判断上传的文件非空,以及上传的文件的大小不小于0
        If (Not myFile.PostedFile Is Nothing) AndAlso (myFile.PostedFile.ContentLength > 0) Then
        	'错误提醒
            Me.Error.Text = ""
            '获取文件的后缀名
            Dim ExtendName As String = myFile.FileName.Substring(myFile.FileName.LastIndexOf(".") + 1) 
            '校驗上傳的文件名是否為xls或xlsx
            If ExtendName <> "xls" AndAlso ExtendName <> "xlsx" Then
                Me.Error.Text = "上傳文件格式有誤"
                Exit Sub
            End If
            '获取上传文件的文件流
            Dim TemplateStream As Stream = myFile.PostedFile.InputStream
			'把文件流传入刚刚创建的方法中,获取到Excel表格中的数据
            Dim dt As DataTable = GetDataSource(TemplateStream)
            If (dt IsNot Nothing) AndAlso (dt.Rows.Count > 0) Then
            	'创建一个临时视图,用于查找是否有相同的商品名称
                Dim dv As DataView = New DataView(dt)
                '判断是否有重复的商品名称
                If (dv.Count <> dv.ToTable(True, "Names").Rows.Count) Then
                    Me.Error.Text = "名稱有重複,請檢查后導入"
                End If
                '判断是否有重复的型号名称
                If (dv.Count <> dv.ToTable(True, "Model").Rows.Count) Then
                    Me.Error.Text = "型號有重複,請檢查后導入"
                Else
                    '獲取到excel文檔中的數據dt,進行逐條添加
                    For i As Integer = 0 To dt.Rows.Count - 1 Step 1
                    	'获取dt中的数据
                        Dim Names As String = dt.Rows(i).Item("Names")
                        Dim ModelAs String = dt.Rows(i).Item("Model")
                        Dim CountAs String = dt.Rows(i).Item("Count")
                        Dim UnitAs String = dt.Rows(i).Item("Unit")
                        '------------------------------------------
                        ' 这里面写添加方法就可以了
                        '------------------------------------------
                    Next
                End If
            End If

        End If

4.如果你需要别人在Excel中输入的值只能是数据库中的值,比如说:商品类型,数据库里面只有生活用品类和饮食类,只能选择其中一个类型。
如果没有这种需求的话,就用上面两段代码即可实现批量添加,如果有这种需求,就还要加上这段代码,那就新建一个Excel表格,那一行数据只能让他在下拉框中选择这两个类
实现这种效果:输入框变成下拉框,下拉框里的值就是数据库带出来的值
在这里插入图片描述

“这些代码写在下载按钮的点击事件里面”
“1.首先自己手动创建一个Excel表格,要把下拉框用在哪一列,就把哪一列空着”
		
		'这一步是拿到刚刚手动创建好的Excel表
		Dim mFileTempalteName As String = String.Format("{0}\{1}", Server.MapPath("~\Reports"), "创建好的Excel表文件名")
        Dim mWorkBook As Aspose.Cells.Workbook = New Aspose.Cells.Workbook(mFileTempalteName)
        Dim mTemplateSheet As Aspose.Cells.Worksheet = mWorkBook.Worksheets(0)
        Dim validations As ValidationCollection = mTemplateSheet.Validations
		
		'假如我现在要加入两个下拉框  Validation对象有很多属性,具体的对象说明可以下面这个网站
		'http://www.360doc.com/content/17/0726/08/30583536_674178721.shtml
        '--------------------------------------第一个---------------------------------------
        Dim vBranch As Validation = validations(validations.Add())
        '驗證數據類型,3表示序列
        vBranch.Type = Aspose.Cells.ValidationType.List
        '元算符
        vBranch.Operator = OperatorType.None
        '設置為下拉框
        vBranch.InCellDropDown = True
        '數據源(如何把Dataset数据转换为字符串类型,我写在下一段代码里)
        vBranch.Formula1 = "数据源是一个字符串类型,不是dataset和datatable"
        '設置如果下拉框中输入的數據不是下拉框的數據,那就報錯
        vBranch.ShowError = True
        vBranch.AlertStyle = ValidationAlertType.Stop
        '報錯標題
        vBranch.ErrorTitle = "發生錯誤!"
        '報錯內容
        vBranch.ErrorMessage = "請選擇列表中內容!"


        Dim aBranch As CellArea
        aBranch.StartRow = 1
        aBranch.EndRow = 5000
        '下拉框显示到第几列,0开始,2就是第3列
        aBranch.StartColumn = 2  '从第几列开始
        aBranch.EndColumn = 2	'从第几列结束
        vBranch.AreaList.Add(aBranch)

        '-------------------------------------第二个---------------------------------------------
        '和上面的方法一模一样,只不过换一个列
        Dim vLab As Validation = validations(validations.Add())
        vLab.Type = Aspose.Cells.ValidationType.List
        vLab.Operator = OperatorType.None
        vLab.InCellDropDown = True
        vLab.Formula1 = GetString()
        vLab.ShowError = True
        vLab.AlertStyle = ValidationAlertType.Stop
        vLab.ErrorTitle = "發生錯誤!"
        vLab.ErrorMessage = "請選擇列表中內容!"

        Dim aLab As CellArea
        aLab.StartRow = 1
        aLab.EndRow = 5000
        aLab.StartColumn = 3
        aLab.EndColumn = 3
        vLab.AreaList.Add(aLab)

		'最后一步生成一个新的Excel文件
        Dim savename As String = Guid.NewGuid().ToString + ".xlsx"
        mWorkBook.Save(Server.MapPath("~\Reports\") + savename)
		'下载刚刚生成的Excel文件
        Response.Redirect("~/Reports/" + savename)

5.如何把DataTable数据转换为字符串类型

Public Shared Function GetString() As String

        Dim dt As DataTable = 数据
        Dim dr As DataRow
        Dim result As String = String.Empty
        '如果沒有數據就返回一個空字符串過去
        If (dt.Rows.Count = 0) Then
            result = ""
        End If
        '把拿到的數據組成一個字符串   1,2,3,4  之間用,號隔開
        For i As Integer = 0 To dt.Rows.Count - 1
            dr = dt.Rows(i)
            result = result + "," + dr.Item("MinTypeName")
        Next
        '把第一个逗号给去除掉
        If Len(result) > 0 Then
            result = result.Substring(1)
        End If
        Return result
    End Function

以上就是所有的代码,如果对你有帮助,记得点个赞哦!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值