Excel 导入/导出Oracle 数据库

来源:互联网 发布:4glte是什么网络制式 编辑:程序博客网 时间:2024/05/21 04:41

      程序要求:通用性高,即对数据库中任意一个表能进行导入导出EXCEL.

      程序环境:vs2008 ,vb.net,Oracle 9i

     1.根据表名获取正确的查询语句,因为ORACLE中时间类型的字段直接用SELECT * FROM  TABLENAME 会出错,所以需要对 TIMESTAMP(0) WITH TIME ZONE  类型字段格式化.

 

 

 

  1. ''' <summary>
  2.     ''get all colums name from table
  3.     ''' </summary>
  4.     ''' <param name="tbname"></param>
  5.     ''' <param name="tb"></param>
  6.     ''' <returns></returns>
  7.     ''' <remarks></remarks>
  8.     Public Function getColumsName(ByVal tbname As String, ByRef tb As DataTable) As Boolean
  9.         Dim Sql As String = " SELECT COLUMN_NAME,DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = :TABLE_NAME"
  10.         Dim params As OracleParameter() = New OracleParameter() {New OracleParameter("TABLE_NAME", tbname)}
  11.         Try
  12.             clsOraDB = New clsOraClienDb()
  13.             clsOraDB.ConnectionString = strDBConn
  14.             clsOraDB.Open()
  15.             If Not clsOraDB.FillDataTable(Sql, tb, params) Then
  16.                 Return False
  17.             End If
  18.         Catch ex As Exception
  19.             Return False
  20.         Finally
  21.             clsOraDB.Close()
  22.             clsOraDB = Nothing
  23.         End Try
  24.         Return True
  25.     End Function
  26.     ''' <summary>
  27.     ''get all colums data from database
  28.     ''' </summary>
  29.     ''' <param name="tbname"></param>
  30.     ''' <param name="tb"></param>
  31.     ''' <param name="TIMEZONE"></param>
  32.     ''' <returns></returns>
  33.     ''' <remarks></remarks>
  34.     Public Function getTable(ByVal tbname As String, ByRef tb As DataTable, ByVal TIMEZONE As String) As Boolean
  35.         Dim dt As DataTable = New DataTable()
  36.         If Not getColumsName(tbname, dt) Then
  37.             Return False
  38.         End If
  39.         If dt.Rows.Count = 0 Then
  40.             Return False
  41.         End If
  42.         Dim sql As String = "SELECT "
  43.         For i As Integer = 0 To dt.Rows.Count - 1
  44.             If i = dt.Rows.Count - 1 Then
  45.                 If dt.Rows(i).Item("DATA_TYPE").ToString.ToUpper() = "TIMESTAMP(0) WITH TIME ZONE" Then
  46.                     sql = sql & "BS_TO_CHAR_DATETIME(" & dt.Rows(i).Item("COLUMN_NAME").ToString & ",'" & TIMEZONE & "')  " & dt.Rows(i).Item("COLUMN_NAME").ToString
  47.                 Else
  48.                     sql = sql & dt.Rows(i).Item("COLUMN_NAME").ToString
  49.                 End If
  50.             Else
  51.                 If dt.Rows(i).Item("DATA_TYPE").ToString.ToUpper() = "TIMESTAMP(0) WITH TIME ZONE" Then
  52.                     sql = sql & "BS_TO_CHAR_DATETIME(" & dt.Rows(i).Item("COLUMN_NAME").ToString & ",'" & TIMEZONE & "')  " & dt.Rows(i).Item("COLUMN_NAME").ToString & ","
  53.                 Else
  54.                     sql = sql & dt.Rows(i).Item("COLUMN_NAME").ToString & ","
  55.                 End If
  56.             End If
  57.         Next
  58.         sql = sql & " from " & tbname
  59.         Try
  60.             clsOraDB = New clsOraClienDb()
  61.             clsOraDB.ConnectionString = strDBConn
  62.             clsOraDB.Open()
  63.             If Not clsOraDB.FillDataTable(sql, tb) Then
  64.                 Return False
  65.             End If
  66.         Catch ex As Exception
  67.             Return False
  68.         Finally
  69.             clsOraDB.Close()
  70.             clsOraDB = Nothing
  71.         End Try
  72.         Return True
  73.     End Function

上面两个函数会返回数据中的数据,以下两个函数会读取EXCEL数据,并更新EXCEL数据到数据表

  1. ''' <summary>
  2.     ''' make a excel file on the server by datatable
  3.     ''' </summary>
  4.     ''' <param name="filename"></param>
  5.     ''' <param name="tbname"></param>
  6.     ''' <returns></returns>
  7.     ''' <remarks></remarks>
  8.     Public Function MakeExcelTable(ByVal filename As String, ByVal tbname As String) As DataTable
  9.         'declare excel content object ----------------------------------------------------
  10.         Dim xlApp As New Excel.Application()
  11.         Dim xlBook As Excel.Workbook
  12.         Dim xlSheet As Excel.Sheets
  13.         Dim dt As DataTable = New DataTable()
  14.         dt.TableName = tbname
  15.         If xlApp.Equals(Nothing) Then
  16.             Return Nothing
  17.         End If
  18.         'xlApp.Visible = True
  19.         Dim oMissing As Object = System.Reflection.Missing.Value
  20.         Dim worksheet As Excel.Worksheet
  21.         Try
  22.             xlBook = xlApp.Workbooks.Open(filename, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, , oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing)
  23.             xlSheet = xlBook.Worksheets
  24.             worksheet = CType(xlSheet.Item(1), Excel.Worksheet)
  25.             'xlSheet = DirectCast(xlBook.Worksheets(1), Excel.Worksheet)
  26.             If worksheet.Equals(Nothing) Then
  27.                 Return Nothing
  28.             End If
  29.         Catch ex As Exception
  30.             Return Nothing
  31.         End Try
  32.         'declare excel content object end ---------------------------------------------------
  33.         'take excel data into datatable -----------------------------------------------------
  34.         Dim cellcontent As String = String.Empty
  35.         Dim rowcount, colcount, rowindex, colindex As Integer
  36.         rowcount = worksheet.UsedRange.Rows.Count
  37.         colcount = worksheet.UsedRange.Columns.Count
  38.         Dim range As Excel.Range
  39.         Try
  40.             'excel row 
  41.             For rowindex = 1 To rowcount
  42.                 Dim dtrow As DataRow = dt.NewRow()
  43.                 'excel colum
  44.                 For colindex = 1 To colcount
  45.                     range = worksheet.Cells(rowindex, colindex)
  46.                     If range.Value Is Nothing Then
  47.                         cellcontent = String.Empty
  48.                     Else
  49.                         cellcontent = range.Value
  50.                     End If
  51.                     If rowindex = 1 Then
  52.                         dt.Columns.Add(cellcontent)
  53.                     Else
  54.                         Try
  55.                             dtrow(colindex - 1) = cellcontent
  56.                         Catch ex As Exception
  57.                             Return Nothing
  58.                         End Try
  59.                     End If
  60.                 Next
  61.                 If rowindex > 1 Then
  62.                     dt.Rows.Add(dtrow)
  63.                 End If
  64.             Next
  65.             'take excel data into datatable en -----------------------------------------------------
  66.         Catch ex As Exception
  67.             Return Nothing
  68.         Finally
  69.             'release resource -----------------------------------
  70.             xlBook.Close(False, oMissing, oMissing)
  71.             System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook)
  72.             xlBook = Nothing
  73.             xlApp.Quit()
  74.             System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
  75.             xlApp = Nothing
  76.             GC.Collect()
  77.             GC.WaitForPendingFinalizers()
  78.             'release resource end-----------------------------------
  79.         End Try
  80.         Return dt
  81.     End Function
  82. ''' <summary>
  83.     ''' Import data from excel to database for excel
  84.     ''' </summary>
  85.     ''' <param name="filename"></param>
  86.     ''' <param name="tbname"></param>
  87.     ''' <returns></returns>
  88.     ''' <remarks></remarks>
  89.     Public Function readExcel(ByVal filename As String, ByVal tbname As String, ByRef erds As DataSet, ByVal timezone As String) As Boolean
  90.         'get dataset from excel
  91.         '---------------------------------------------------------------------------
  92.         Dim xlsds As New DataSet()
  93.         Dim xldt As DataTable = Nothing
  94.         Try
  95.             xldt = MakeExcelTable(filename, tbname)
  96.             xlsds.Tables.Add(xldt)
  97.         Catch ex As Exception
  98.             Return False
  99.         End Try
  100.         '------------------------------------------------------------------------
  101.         'GET DATASET FROM DATABASE
  102.         '------------------------------------------------------------------------------
  103.         Dim dbds As DataSet = New DataSet()
  104.         Dim sqlconn As OracleConnection = New OracleConnection(strDBConn)
  105.         Dim lsSQL As String = getSql(tbname, timezone)
  106.         If lsSQL = "" Then
  107.             Return False
  108.         End If
  109.         Dim dbcmd As OracleCommand = New OracleCommand(lsSQL, sqlconn)
  110.         Dim dbda As OracleDataAdapter = New OracleDataAdapter(dbcmd)
  111.         dbda.MissingSchemaAction = MissingSchemaAction.AddWithKey
  112.         Try
  113.             dbda.Fill(dbds, tbname)
  114.         Catch ex As Exception
  115.             Return False
  116.         Finally
  117.             sqlconn.Close()
  118.             sqlconn = Nothing
  119.         End Try
  120.         '---------------------------------------------------------------------------------
  121.         'create a  new dataset whose structure is as same as dbdataset
  122.         '----------------------------------------------------------------------
  123.         Dim newds As DataSet = New DataSet()
  124.         newds = dbds.Clone()
  125.         erds = xlsds.Clone()
  126.         'create a table for contain error rows
  127.         '-------------------------------------------------------------------------
  128.         'COMPARE THE COLOUMS BETWEEN DATABASE TABLE AND EXCELd
  129.         Dim a As Integer = xlsds.Tables(tbname).Columns.Count
  130.         Dim b As Integer = dbds.Tables(tbname).Columns.Count
  131.         If a <> b Then
  132.             Return False
  133.         End If
  134.         'APPEND DATAS OF EXCEL 
  135.         '------------------------------------------------------------------------
  136.         Dim xlsrow As DataRow
  137.         Dim colnums As Integer = dbds.Tables(tbname).Columns.Count
  138.         For Each xlsrow In xlsds.Tables(tbname).Rows
  139.             Dim colindex As Integer = 0
  140.             Dim isrownull As Integer = 0
  141.             Dim newrow As DataRow = newds.Tables(tbname).NewRow
  142.             Try
  143.                 For colindex = 0 To colnums - 1
  144.               '测试列的长度与类型
  145.                     Dim maxleng As Integer = dbds.Tables(tbname).Columns(colindex).MaxLength
  146.                     Dim name As String = dbds.Tables(tbname).Columns(colindex).ColumnName
  147. '此处是我还未解决的问题,无法测出TIMESTAMP(0) WITH TIME ZONE  类型的列 的DATATYPE,显示的为STRING类型,郁闷啊,长度确是4000,因此我在这里测试时勉强用4000作为判断是不是时间类型的条件,其实这是不科学的.
  148.                     If maxleng = 4000 Then
  149.                         Dim s As String = dbds.Tables(tbname).Columns(colindex).DateTimeMode
  150. 以下我想格式化时间列,但还是没效果,这样的字符串在ORACLE中必须格式化,对ORACLE我不太熟悉,因此不知道有什么方法可以解决这个问题
  151.                         newrow.Item(colindex) = Date.Parse(xlsrow.Item(colindex).ToString).ToString("yyyy/MM/dd HH:mm:ss ") & timezone
  152.                        ' newrow.Item(colindex) = System.DateTime.Now
  153.                     Else
  154.                         If xlsrow.Item(colindex).ToString = "" Then
  155.                             newrow.Item(colindex) = DBNull.Value
  156.                         Else
  157.                             newrow.Item(colindex) = xlsrow.Item(colindex)
  158.                         End If
  159.                     End If
  160.                     isrownull = isrownull + Len(xlsrow(colindex).ToString.Trim)
  161.                 Next
  162.                 If isrownull <> 0 Then
  163.                     newds.Tables(tbname).Rows.Add(newrow)
  164.                 Else
  165.                     Call CollectError(colnums, xlsrow, erds, tbname)
  166.                     newrow.Delete()
  167.                 End If
  168.             Catch ex As Exception
  169.                 Call CollectError(colnums, xlsrow, erds, tbname)
  170.                 newrow.Delete()
  171.             End Try
  172.         Next
  173.         '-----------------------------------------------------------------------------
  174.         'merge newds to dbds,it's very important.
  175.         '-------------------------------
  176.         dbds.Merge(newds, False)
  177.         newds = Nothing
  178.         xlsds = Nothing
  179.         '-------------------------------------------
  180.         'update datas
  181.         '-----------------------------------------------------------------------
  182.         Dim objBuilder As OracleCommandBuilder = New OracleCommandBuilder(dbda)
  183.         dbda.UpdateCommand = objBuilder.GetUpdateCommand
  184.         dbda.InsertCommand = objBuilder.GetInsertCommand
  185.         Dim k As Integer = 0
  186.         Dim J As Integer = dbds.Tables(tbname).Rows.Count
  187.         Try
  188.             'dbda.ContinueUpdateOnError = True
  189. '对时间类型的字段更新,我现在依然没有解决问题,在调用UPDATE函数的时候他自己生成的字句在ORACLE中调用的UPDATE语句可能采用不同的时间函数,这让我很郁闷,我试图在合并数据集之前对时间类型字段进行格式化,但很让我失望这并没效果.我觉得一定还有其他的方式可以将时间类型的字段通过UPDATE函数更新,希望友人赐教.
  190.             k = dbda.Update(dbds.Tables(tbname).Select(Nothing, Nothing, DataViewRowState.CurrentRows))
  191.         Catch ex As Exception
  192.             Return False
  193.         Finally
  194.             dbda = Nothing
  195.             dbds = Nothing
  196.         End Try
  197.         '-------------------------------------------------------------------------
  198.         Return True
  199.     End Function

对于下载,我做的比较简单,这个并不难.DOWNLODEXL函数是放在.aspx.vb中的

  1.     ''' <summary>
  2.     ''' function about download excel file  
  3.     ''' </summary>
  4.     ''' <param name="filename"></param>
  5.     ''' <param name="tbname"></param>
  6.     ''' <returns></returns>
  7.     ''' <remarks></remarks>
  8.     Public Function DownloadExl(ByVal filename As String, ByVal tbname As String) As Boolean
  9.         Response.Clear()
  10.         Response.Buffer = True
  11.         'Response.AddHeader("content-disposition""attachment;filename= DOA BGA Report_" & Format(Now(), "yyyyMMdd") & ".xls")
  12.         Response.AddHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8))
  13.         Response.ContentType = "application/vnd.ms-excel"
  14.         Response.ContentEncoding = System.Text.Encoding.UTF8
  15.         Response.Charset = ""
  16.         Me.EnableViewState = False
  17.         Dim first As Boolean = True
  18.         ' ''Set the content type to Excel.
  19.         ''response.ContentType = "application/octet-stream"
  20.         ''response.AddHeader("Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8))
  21.         Dim stringWriter As New StringWriter()
  22.         Dim htmlWriter As HtmlTextWriter = New HtmlTextWriter(stringWriter)
  23.         Dim Table As New DataTable()
  24.         Dim gvExcel As DataGrid = New DataGrid()
  25.         Try
  26.             'If Not m_BL.getTable(tbname, Table) Then
  27.             '    Return False
  28.             'End If
  29.             If Not m_BL.getTable(tbname, Table, UserInfo.TimeZoneRegion) Then
  30.                 Return False
  31.             End If
  32.             gvExcel.DataSource = Table
  33.             gvExcel.DataBind()
  34.         Catch ex As Exception
  35.             Return False
  36.         End Try
  37.         Try
  38.             gvExcel.RenderControl(htmlWriter)
  39.             Response.Write(stringWriter.ToString())
  40.             Response.End()
  41.         Catch ex As Exception
  42.             Return False
  43.         End Try
  44.         Return True
  45.     End Function
原创粉丝点击