VB.NET Excel导入
来源:互联网 发布:集体智慧编程python3 编辑:程序博客网 时间:2024/04/26 04:40
最近上班发现一定要注意两点:
1.前台的字段类型一定要与数据库保持一致!!!
2.一定要做非空判断!!!
下面进入正题,最近两天在做excel表格批量导入,从前台程序直接打开EXCEL,批量导入到数据库中
思路是:
1.先把EXCEL表格转换成Datatable,
2.然后datatable转成list,
3.把list保存到数据库中
1.首先在NPOI类中写四个方法,导入的,两个导入进入转换成datatable,(一个xls,一个xlsx),两个读取格式的(*就是第一步,转换成datatable)
Public Shared Function ExcelToTableForXLS(ByVal filePath As String) As DataTable Dim dt As DataTable = New DataTable Dim fs As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read) Dim hssfworkbook As HSSFWorkbook = New HSSFWorkbook(fs) Dim sheet As ISheet = hssfworkbook.GetSheetAt(0) '表头 Dim header As IRow = sheet.GetRow(sheet.FirstRowNum) Dim columns As List(Of Integer) = New List(Of Integer) Dim i As Integer = 0 Do While (i < header.LastCellNum) Dim obj As Object = GetValueTypeForXLS(CType(header.GetCell(i), HSSFCell)) If ((obj Is Nothing) OrElse (obj.ToString = String.Empty)) Then dt.Columns.Add(New DataColumn(("Columns" + i.ToString))) 'continue; Else dt.Columns.Add(New DataColumn(obj.ToString)) End If columns.Add(i) i = (i + 1) Loop '数据 Dim m As Integer = (sheet.FirstRowNum + 1) Do While (m <= sheet.LastRowNum) Dim dr As DataRow = dt.NewRow Dim hasValue As Boolean = False For Each j As Integer In columns dr(j) = GetValueTypeForXLS(CType(sheet.GetRow(m).GetCell(j), HSSFCell)) If ((Not (dr(j)) Is Nothing) _ AndAlso (dr(j).ToString <> String.Empty)) Then hasValue = True End If Next If hasValue Then dt.Rows.Add(dr) End If m = (m + 1) Loop Return dt End Function Private Shared Function GetValueTypeForXLS(ByVal cell As HSSFCell) As Object If (cell Is Nothing) Then Return Nothing End If Select Case (cell.CellType) Case CellType.BLANK 'BLANK: Return Nothing Case CellType.BOOLEAN 'BOOLEAN: Return cell.BooleanCellValue Case CellType.NUMERIC 'NUMERIC: Return cell.NumericCellValue Case CellType.STRING 'STRING: Return cell.StringCellValue Case CellType.ERROR 'ERROR: Return cell.ErrorCellValue Case CellType.FORMULA 'FORMULA: Select Case (cell.CellType) Case CellType.BLANK Return DBNull.Value Case CellType.BOOLEAN Return cell.BooleanCellValue Case CellType.NUMERIC Return cell.NumericCellValue Case CellType.STRING Return cell.StringCellValue Case CellType.ERROR Return cell.ErrorCellValue Case Else Return cell.CellType End Select Case Else Return ("=" + cell.CellFormula) End Select End Function Private Shared Function GetValueTypeForXLSX(ByVal cell As XSSFCell) As Object If (cell Is Nothing) Then Return DBNull.Value End If Select Case (cell.CellType) Case CellType.BLANK 'BLANK: Return DBNull.Value Case CellType.BOOLEAN 'BOOLEAN: Return cell.BooleanCellValue Case CellType.NUMERIC 'NUMERIC: Return cell.NumericCellValue Case CellType.STRING 'STRING: Return cell.StringCellValue Case CellType.ERROR 'ERROR: Return cell.ErrorCellValue Case CellType.FORMULA 'FORMULA: Select Case (cell.CachedFormulaResultType) Case CellType.BLANK 'BLANK: Return DBNull.Value Case CellType.BOOLEAN 'BOOLEAN: Return cell.BooleanCellValue Case CellType.NUMERIC 'NUMERIC: Return cell.NumericCellValue Case CellType.STRING 'STRING: Return cell.StringCellValue Case CellType.ERROR 'ERROR: Return cell.ErrorCellValue Case Else Return cell.CellType End Select Case Else Return ("=" + cell.CellFormula) End Select End Function Public Shared Function ExcelToTableForXLSX(ByVal filePath As String) As DataTable Dim dt As DataTable = New DataTable Dim fs As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read) Dim xssfworkbook As XSSFWorkbook = New XSSFWorkbook(fs) Dim sheet As ISheet = xssfworkbook.GetSheetAt(0) '表头 Dim header As IRow = sheet.GetRow(sheet.FirstRowNum) Dim columns As List(Of Integer) = New List(Of Integer) Dim i As Integer = 0 Do While (i < header.LastCellNum) Dim obj As Object = GetValueTypeForXLSX(CType(header.GetCell(i), XSSFCell)) If ((obj Is Nothing) _ OrElse (obj.ToString = String.Empty)) Then dt.Columns.Add(New DataColumn(("Columns" + i.ToString))) 'continue; Else dt.Columns.Add(New DataColumn(obj.ToString)) End If columns.Add(i) i = (i + 1) Loop '数据 Dim m As Integer = (sheet.FirstRowNum + 1) Do While (m <= sheet.LastRowNum) Dim dr As DataRow = dt.NewRow Dim hasValue As Boolean = False For Each j As Integer In columns dr(j) = GetValueTypeForXLSX(CType(sheet.GetRow(m).GetCell(j), XSSFCell)) If ((Not (dr(j)) Is Nothing) _ AndAlso (dr(j).ToString <> String.Empty)) Then hasValue = True End If Next If hasValue Then dt.Rows.Add(dr) End If m = (m + 1) Loop Return dt End Function
其中,引用了四个包,
然后在这个批量导入按钮内写入的内容:(*就是第二步,datatable转换成List)
Dim OpenFileDialog1 As New OpenFileDialog OpenFileDialog1.Filter = "Excel files(*.xls)|*.xls" OpenFileDialog1.ShowDialog() Dim strPath As String = OpenFileDialog1.FileName.ToString If OpenFileDialog1.FileName = "" Then MessageBox.Show("请选择文件") Exit Sub End If Dim dtin = NPOIHelper.ExcelToTableForXLS(strPath) Dim bllo As New BllM_MaterialManagementT ' Dim oo As New M_MaterialManagementT Dim listMm As New List(Of M_MaterialManagementT) For Each uu In dtin.Rows '共21个字段,除去Id自增列为20,(除去NUMBER,date,IsState)-17 Dim oo As New M_MaterialManagementT 'MaterialNumber 'oo.MaterialNumber = uu("MaterialNumber") 'MaterialName If Not uu("MaterialName") Is DBNull.Value Then oo.MaterialName = uu("MaterialName") End If 'MerchantID If Not uu("MerchantID") Is DBNull.Value Then oo.MerchantID = uu("MerchantID") End If 'ClassA If Not uu("ClassA") Is DBNull.Value Then oo.ClassA = uu("ClassA") End If listMm.Add(oo) 'Dim m = bllo.Insert(oo) 'If m > 0 Then 'Else ' CommonMsg.ShowMsg(Me.Text, Constant.ENU_MSGID.MSGID67) ' Return 'End If Next Dim y = bllo.Insertlist(listMm) If y > 0 Then CommonMsg.ShowMsg(Me.Text, Constant.ENU_MSGID.MSGID62) Else CommonMsg.ShowMsg(Me.Text, Constant.ENU_MSGID.MSGID67) End If End Sub
其中注释掉的代码是之前写的,作为datatable接收,直接用datatable插入,没有问题,后来想写的规范点,转一下list
3.下面是bll层和dal层,作为List实现插入数据库的方法:
bll层:
#Region " InsertlistEXCEL " '插入数据 Public Function Insertlist(ByVal listPp As List(Of M_MaterialManagementT)) As Integer Dim objDalM_MaterialManagementT As New DalM_MaterialManagementT Dim ObjDBConn As New DbHelper Dim strSql As String = String.Empty Dim listSql As New List(Of String) strErrorName = "BllM_MaterialManagement.Insertlist" Dim i As Integer = 0 Try listSql = objDalM_MaterialManagementT.Savelist(listPp) For Each uu In listSql Dim sql As String = String.Empty sql = uu intRows = ObjDBConn.ExcuteScalar(sql) Next ObjDBConn.Dispose() Return intRows Catch ex As Exception ExHelper.ProcessDBHelper(ObjDBConn) Throw New Exception(strErrorName, ex) End Try End Function#End Region
dal层1:
Public Shared ReadOnly MNumber = "SELECT isnull(RIGHT('000000' + convert(nvarchar(6),cast (MAX(Id) as int) + 1),6),'000001') FROM M_MaterialManagement" Public Function Savelist(ByVal listPp As List(Of M_MaterialManagementT)) As List(Of String) Dim listSql As New List(Of String) For Each pp In listPp Dim sql As String = String.Empty pp.MaterialNumber = MNumber sql = Insertexcel(pp) listSql.Add(sql.ToString) Next Return listSql End Function
dal层2:
#Region " Insert " '数据插入操作 Public Function Insertexcel(ByVal clsM_MaterialManagementT As M_MaterialManagementT) As String Dim strSql As New StringBuilder(System.String.Empty) 'Sql文 Try strSql.Append(" INSERT INTO M_MaterialManagement") '原材料信息管理表 strSql.Append(" (MaterialNumber") '产品编号 strSql.Append(" ,MaterialName") '产品名称 strSql.Append(" ,MerchantID") '商戸编号 strSql.Append(")") strSql.Append(" VALUES ") '产品编号 strSql.Append(" ((" + clsM_MaterialManagementT.MaterialNumber + ")") '产品名称 strSql.Append(" ,'" & Utility.ChangeQuotation(clsM_MaterialManagementT.MaterialName) & "'") '商戸编号 If clsM_MaterialManagementT.MerchantID = "" Then strSql.Append(" ,NULL ") Else strSql.Append(" ,'" & Utility.ChangeQuotation(clsM_MaterialManagementT.MerchantID) & "'") End If strSql.Append(") select @@IDENTITY") Return strSql.ToString Catch ex As Exception Return String.Empty MessageBox.Show(ex.ToString) End Try End Function
在UI层循环那里,循环前先定义个泛型集合,model的list,
循环excel转换成的datatable,将他每一列一一赋值给list,每次循环结束后listadd()
循环全部结束,得到一个List,把这个List带到BLL层里,再从BLL层进入dal层,然后把这个List循环,每行都走插入语句。
0 0
- VB.NET Excel导入
- VB.net将图片导入到Excel
- VB.NET实现Excel导入SQL数据库
- VB.NET实现Excel导入SQL数据库
- VB.NET导入Excel 的问题
- vb.net导入excel,生成上级parent_id
- vb.net excel数据导入datagridview显示
- Excel导入SQL(VB.NET版)
- [VB.NET]如何导入excel表格到数据库
- [VB.NET]救命啊!!!数据库导入excel中的问题
- VB.NET将EXCEL中的数据导入到SQL SERVER
- VB.NET DataGridView中的数据导入到Excel
- VB.net 导入Excel方法(2010及以下版本适用)
- vb.net 将DataGridView数据导入到Excel的方式
- VB .NET把Excel中的数据导入SQL SERVER数据库
- [VB.NET]数据导入
- vb.net 连接excel
- [VB.NET]excel 问题
- Servlet中使用Spring注入Service层
- 50道Java线程面试题
- LFS 中文版手册发布:如何打造自己的 Linux 发行版
- 数据结构实验之排序四:寻找大富翁
- android studio svn版本控制
- VB.NET Excel导入
- Android天气预报(Json解析)
- 工欲善其事,必先利其器
- Uva 10003 切木棍(dp)
- 符号计算
- 经典~~
- 数据库的乐观锁和悲观锁
- 判断SD卡是否可用
- JNI/NDK开发指南(八)---JNI调用性能测试及优化