下面是我的代码,我已成功将数据从Excel导入GridView。
问题是我有两个专栏小时&描述。当我导入到GridView时某些描述数据没有完全导入到GridView中,一些文本丢失了。手段 在Excel中
小时说明 1 abcdefghijklmnopqrstuuudddd
在GridView中
小时说明 1 abcdefghijklmno
文本大约64个单词退出,其中包括所有字符,如2
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication49.WebForm1" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Read and Display Data From an Excel File (.xsl or .xlsx) in ASP.NET</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<b>Please Select Excel File: </b>
<asp:FileUpload ID="fileuploadExcel" runat="server" />
<asp:Button ID="btnImport" runat="server" Text="Import Data" OnClick="btnImport_Click" />
<br />
<asp:Label ID="lblMessage" runat="server" Visible="False" Font-Bold="True" ForeColor="#009933"></asp:Label><br />
<asp:GridView ID="grvExcelData" runat="server">
<HeaderStyle BackColor="#df5015" Font-Bold="true" ForeColor="White" />
</asp:GridView>
</div>
</form>
</body>
</html>
VB.Net代码
Imports System.Data
Imports System.Data.OleDb
Imports System.IO
Partial Class WebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
End Sub
Protected Sub btnImport_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim connString As String = ""
Dim strFileType As String = ".xls"
Dim path__1 As String = "c:\ccc.xls"
'Connection String to Excel Workbook
If strFileType.Trim() = ".xls" Then
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & path__1 & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"""
ElseIf strFileType.Trim() = ".xlsx" Then
connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path__1 & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=2"""
End If
Dim query As String = "SELECT [Hours (hr)],[Description] FROM [sheet1$]"
Dim conn As New OleDbConnection(connString)
If conn.State = ConnectionState.Closed Then
conn.Open()
End If
Dim cmd As New OleDbCommand(query, conn)
Dim da As New OleDbDataAdapter(cmd)
Dim ds As New DataSet()
da.Fill(ds)
grvExcelData.DataSource = ds.Tables(0)
grvExcelData.DataBind()
da.Dispose()
conn.Close()
conn.Dispose()
End Sub
End Class
答案 0 :(得分:0)
所以我写了一些东西。这段代码特定于Postgres(如果你可以选择,这将是一个非常好的选择。否则采取Firebird,它也是一个非常好的数据库,但你应该插入插入指令很多“插入”
Imports ADODB
Public Class ExcelToPostgres
Implements XToY
Dim cn As ADODB.Connection
Dim o As OleDb.OleDbConnection
Dim _Serials As ArrayList
Private _Txt As New System.Text.StringBuilder("")
Private _ForeignsTxt As New System.Text.StringBuilder("")
Private _Q As Boolean 'Quote all
Private p_Database As New ArrayList
Private P_Definition As Boolean = True
Private P_Data As Boolean = True
Private h_TAbles As SortedList(Of String, DBTable)
Private Quoter As New DbQuoter(dbEnum.ePostgres)
Public Property SetTables(ByVal Name As String) As Boolean Implements XToY.SetTables
Get
Return (h_TAbles(Name).IsSelected)
End Get
Set(ByVal value As Boolean)
h_TAbles(Name).IsSelected = value
End Set
End Property
Public Property UseQuotes As Boolean Implements XToY.UseQuotes
Get
Return _Q
End Get
Set(ByVal value As Boolean)
_Q = value
End Set
End Property
Public ReadOnly Property Tables() As SortedList(Of String, DBTable) Implements XToY.Tables
Get
Return h_TAbles
End Get
End Property
Public Property Definition As Boolean Implements XToY.Definition
Set(ByVal value As Boolean)
P_Definition = value
End Set
Get
Return P_Definition
End Get
End Property
Public Property Data As Boolean Implements XToY.Data
Set(ByVal value As Boolean)
P_Data = value
End Set
Get
Return P_Data
End Get
End Property
Sub New(ByVal dbpath As String, ByVal user As String, ByVal password As String)
Dim strCn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & dbpath & ";Extended Properties=Excel 8.0"
';Extended Properties=Excel 8.0;HDR=Yes;IMEX=1
o = New OleDb.OleDbConnection(strCn)
o.Open()
LoadTables()
End Sub
Private Sub LoadTables()
Dim dt As DataTable
Dim ch() As Char = {"'", Chr(34), " "}
dt = o.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, Nothing)
h_TAbles = New SortedList(Of String, DBTable)
Dim dbt As DBTable
For Each row As DataRow In dt.Rows
Dim tablename As String = DirectCast(row("TABLE_NAME"), String)
If tablename.Trim(ch).EndsWith("$") Then
dbt = New DBTable()
dbt.Name = tablename
dbt.DBTarget = "Postgres"
dbt.IsSelected = True
h_TAbles.Add(tablename, dbt)
End If
Next
LoadColumns()
End Sub
Private Sub LoadColumns()
Dim dt As DataTable
Dim dv As DataView
Dim c As ColumnTable
For Each d As KeyValuePair(Of String, DBTable) In h_TAbles
dt = o.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Columns, New String() {Nothing, Nothing, d.Key, Nothing})
dv = dt.DefaultView
dv.Sort = "ORDINAL_POSITION"
For i As Integer = 0 To dv.Count - 1
c = New ColumnTable
c.Name = dv.Item(i).Item("COLUMN_NAME")
c.NewName = QuoteName(dv.Item(i).Item("COLUMN_NAME"))
c.Type = Me.TypeAsString(dv.Item(i).Item("DATA_TYPE"), c.IsAutoincrement)
Select Case dv.Item(i).Item("DATA_TYPE")
Case 7, 8, 200, 201, 202, 203, 129, 130, 72, 129, 130, 32770
c.NeedQuote = True
c.NeedQuoteUserSetting = True
End Select
c.IsAutoincrement = False
c.IsNullable = True
c.IsSelected = True
d.Value.Columns.Add(c)
Next
Next
End Sub
Public Function Export() As String Implements XToY.Export
_Txt = New System.Text.StringBuilder("")
For Each a As KeyValuePair(Of String, DBTable) In h_TAbles
If a.Value.IsSelected Then
Me.CreateTables(a.Key)
_Txt.Append(vbNewLine)
End If
Next
' _Txt.Append(_ForeignsTxt.ToString)
Return _Txt.ToString
End Function
Private Sub CreateTables(ByVal Table As String)
Dim sTable As String = QuoteName(Table)
If Definition Then
_Txt.Append(String.Format("DO $$DECLARE r record; {0}" & _
"BEGIN {0}" & _
" FOR r IN SELECT conname, c.relname as tTab {0}" & _
" FROM pg_constraint ct {0}" & _
" inner join pg_class c on c.oid= ct.conrelid {0}" & _
" inner join pg_class c1 on c1.oid= ct.confrelid {0}" & _
" where contype='f' AND c1.relname ='{1}' {0}" & _
" LOOP {0}" & _
" EXECUTE 'ALTER TABLE ' || quote_ident(r.ttab) || ' DROP CONSTRAINT ' || quote_ident(r.conname); {0}" & _
" END LOOP; {0}" & _
"END$$; {0}", vbNewLine, sTable))
_Txt.Append("DROP TABLE IF EXISTS ")
_Txt.Append(sTable)
_Txt.Append(";")
_Txt.Append(vbNewLine)
_Txt.Append("CREATE TABLE IF NOT EXISTS ")
_Txt.Append(sTable)
_Txt.Append(" (")
CreateColumns(Table)
'CreateConstraints(Table)
'_Txt.Append(vbNewLine)
_Txt.Append("); ")
_Txt.Append(vbNewLine)
_Txt.Append(vbNewLine)
End If
If Data Then
_Serials = New ArrayList
Me.DataPump(Table)
_Txt.Append(vbNewLine)
For i = 0 To Me._Serials.Count - 1
_Txt.Append("Select setval(pg_get_serial_sequence('")
_Txt.Append(sTable)
_Txt.Append("','")
'_Txt.Append(Chr(34))
_Txt.Append(_Serials(i))
'_Txt.Append(Chr(34))
_Txt.Append("'), (Select max(")
_Txt.Append(QuoteName(_Serials(i)))
_Txt.Append(") from ")
_Txt.Append(sTable)
_Txt.Append(")); ")
_Txt.Append(vbNewLine)
Next
End If
End Sub
Private Sub CreateColumns(ByVal idTable As String)
Dim b As Boolean = False
With h_TAbles(idTable)
For i As Integer = 0 To .Columns.Count - 1
With CType(.Columns(i), ColumnTable)
If .IsSelected Then
If b Then
_Txt.Append(",")
Else
b = True
End If
_Txt.Append(vbNewLine)
_Txt.Append(.NewName)
_Txt.Append(" ")
If .IsAutoincrement Then
_Serials.Add(.NewName)
Else
_Txt.Append(.Type)
End If
_Txt.Append(" ")
If .DefaultValue <> "" Then
_Txt.Append(" DEFAULT ")
_Txt.Append(.DefaultValue)
End If
If Not .IsNullable Then _Txt.Append(" NOT NULL")
End If
End With
Next
End With
End Sub
Private Function TypeAsString(ByVal InternalId As Integer, ByVal isautoincrement As Boolean) As String
Select Case InternalId
Case 2, 16, 17, 18
Return " smallint "
Case 3, 19
If isautoincrement Then Return " Serial "
Return " int "
Case 4
Return " real "
Case 5
Return " double precision "
Case 6
Return " Money "
Case 7
Return " timestamp "
Case 8, 200, 201, 202, 203
Return " text "
Case 11
Return " boolean "
Case 72
Return " uuid "
Case 128
Return " bytea "
Case 129, 130
Return " text "
Case 131
Return " numeric "
Case 32769, 20, 21
If isautoincrement Then Return " bigserial "
Return " BIGINT "
Case 32771
Return " BLOB "
Case 32770
Return " TEXT "
Case Else
Throw New InvalidConstraintException("Type ID=" & InternalId & " Not Recognized")
End Select
End Function
Private Sub CreateConstraints(ByVal idTable As String)
Dim rsTbl, rsPk As Recordset
rsTbl = cn.OpenSchema(SchemaEnum.adSchemaTableConstraints, _
New Object() {Nothing, Nothing, Nothing, Nothing, Nothing, idTable, Nothing})
rsPk = cn.OpenSchema(SchemaEnum.adSchemaPrimaryKeys, New Object() {Nothing, Nothing, idTable})
Dim i As Integer
_Txt.Append(vbNewLine)
If Not rsPk.EOF Then 'primary key
_Txt.Append(",")
_Txt.Append(vbNewLine)
_Txt.Append("CONSTRAINT ")
rsTbl.Filter = "CONSTRAINT_TYPE='PRIMARY KEY'"
_Txt.Append(Chr(34))
_Txt.Append(idTable)
_Txt.Append("_")
_Txt.Append(rsTbl.Fields("CONSTRAINT_NAME").Value)
_Txt.Append(Chr(34))
_Txt.Append(" PRIMARY KEY(")
i = 1
rsPk.Filter = "ORDINAL=" & i
Do Until rsPk.EOF
If i > 1 Then _Txt.Append(",")
_Txt.Append(QuoteName(rsPk.Fields("COLUMN_NAME").Value))
i = i + 1
rsPk.Filter = "ORDINAL=" & i
Loop
_Txt.Append(")")
End If
rsPk.Close()
_Txt.Append(vbNewLine)
End Sub
Private Sub DataPump(ByVal idTable As String)
Dim dt As DataTable
'Dim dv As DataView
Dim hsh As New Hashtable
dt = o.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Columns, New String() {Nothing, Nothing, idTable, Nothing})
For k As Integer = 0 To dt.Rows.Count - 1
hsh.Add(dt.Rows(k).Item("COLUMN_NAME"), dt.Rows(k).Item("DATA_TYPE"))
Next
'Dim ch() As Char = {"'", " ", Chr(34)}
'Dim ch2() As Char = {Chr(34)}
Dim st As String = idTable '.Trim(ch)
If Left(st, 1) = Chr(34) Then st = Mid(st, 2, Len(st) - 2)
If st.EndsWith("$") Then st = Left(st, Len(st) - 1)
Dim sTable As String = QuoteName(st)
Dim tbl As DBTable
Dim i As Integer
Dim b As Boolean = False
Dim qryString As New System.Text.StringBuilder("")
tbl = h_TAbles(idTable)
If tbl.IsQuery Then
qryString.Append(tbl.QueryString)
Else
qryString.Append("SELECT ")
For i = 0 To tbl.Columns.Count - 1
If tbl.Columns(i).IsSelected Then
If b Then qryString.Append(",")
qryString.Append("[")
'If Left(tbl.Columns(i).Name, 1) = Chr(34) Then
' qryString.Append(Mid(tbl.Columns(i).Name, 2, Len(tbl.Columns(i).Name) - 2))
'Else
qryString.Append(tbl.Columns(i).Name)
'End If
qryString.Append("]")
b = True
End If
Next
qryString.Append(" FROM ")
qryString.Append("[")
qryString.Append(idTable)
qryString.Append("]")
End If
'Dim oComm As New OleDb.OleDbCommand("Select * From [" & idTable & "]", o)
Dim oDat As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(qryString.ToString, o)
dt = New DataTable
oDat.Fill(dt)
Dim InsertString As New System.Text.StringBuilder("INSERT INTO ")
InsertString.Append(sTable)
InsertString.Append("(")
b = False
For i = 0 To tbl.Columns.Count - 1
If tbl.Columns(i).IsSelected Then
If b Then InsertString.Append(",")
InsertString.Append(tbl.Columns(i).NewName)
b = True
End If
Next
InsertString.Append(") VALUES ")
Dim ci As New System.Globalization.CultureInfo("en-US")
System.Threading.Thread.CurrentThread.CurrentCulture = ci
Dim h As Boolean
Dim clmName As String
b = False
_Txt.Append(InsertString.ToString)
For i = 0 To dt.Rows.Count - 1
If b Then
_Txt.Append(",")
Else
b = True
End If
_Txt.Append(vbNewLine)
_Txt.Append("(")
h = False
For j As Integer = 0 To tbl.Columns.Count - 1
If tbl.Columns(j).IsSelected Then
If h Then
_Txt.Append(", ")
Else
h = True
End If
clmName = tbl.Columns(j).Name '.Trim(ch)
If TypeOf (dt.Rows(i).Item(clmName)) Is DBNull Then
_Txt.Append("NULL")
ElseIf tbl.Columns(j).NeedQuote <> tbl.Columns(j).NeedQuoteUserSetting Or Not hsh.Contains(clmName) Then
_Txt.Append(Me.PrepareCustomString(dt.Rows(i).Item(clmName), tbl.Columns(j).Type, tbl.Columns(j).NeedQuoteUserSetting))
Else
_Txt.Append(Me.PrepareDataString(dt.Rows(i).Item(clmName), hsh.Item(clmName)))
End If
End If
Next
_Txt.Append(")")
Next
_Txt.Append(";")
End Sub
Private Function PrepareCustomString(ByVal Dr As String, Type As String, NeedQuote As Boolean) As String
Dim Typetxt As New System.Text.StringBuilder
Select Case Type
Case "DATETIME", "TIMESTAMP"
Typetxt.Append(" to_timestamp('")
Typetxt.Append(CType(Dr, DateTime).ToString("dd-MM-yyy hh:mm:ss"))
Typetxt.Append("','dd-MM-yyy hh24:mi:ss')")
Case "DATE"
Typetxt.Append(" to_timestamp('")
Typetxt.Append(CType(Dr, DateTime).ToString("dd-MM-yyy"))
Typetxt.Append("','dd-MM-yyy')")
Case "TIME"
Typetxt.Append(" to_timestamp(('")
Typetxt.Append(CType(Dr, DateTime).ToString("hh:mm:ss"))
Typetxt.Append("','hh24:mi:ss')")
Case "YEAR"
Typetxt.Append(" to_timestamp('")
Typetxt.Append(CType(Dr, DateTime).ToString("yyyy"))
Typetxt.Append("','yyyy')")
Case Else
If NeedQuote Then
Typetxt.Append("'")
Dim s As String = Dr
For i As Integer = 0 To s.Length - 1
Typetxt.Append(s(i))
If s(i) = "'" Then Typetxt.Append("'")
Next
Typetxt.Append("'")
Else
Typetxt.Append(Dr.Replace(",", "."))
End If
End Select
Return Typetxt.ToString
End Function
Private Function NeedGrave(ByVal IDType As Integer) As String
Select Case IDType
Case 8, 200, 201, 202, 203, 129, 130, 32770, 7, 11
Return "'"
Case Else
Return ""
End Select
End Function
Private Function PrepareDataString(ByVal Dr As Object, ByVal dt As ADODB.DataTypeEnum) As String
'DataType Enum |Value |Access |SQLServer |Oracle
'--------------------------------------------------------------------------------------------------------
'adBigInt |20 | |BigInt |
'adBinary |128 | |Binary |Raw *
' | | |TimeStamp |
'adBoolean |11 |YesNo |Bit |
'adChar |129 | |Char |Char
'adCurrency |6 |Currency |Money |
' | | |SmallMoney |
'adDate |7 |Date |DateTime |
'adDBTimeStamp |135 |DateTime |DateTime |Date
' | | |SmallDateTime |
'adDecimal |14 | | |Decimal *
'adDouble |5 |Double |Float |Float
'adGUID |72 |ReplicationID |UniqueIdentifier |
'adIDispatch |9 | | |
'adInteger |3 |AutoNumber |Identity |Int *
' | |Integer |Int |
' | |Long | |
'adLongVarBinary |205 |OLEObject |Image |Long Raw *
' | | | |Blob
'adLongVarChar |201 |Memo |Text |Long *
' | |Hyperlink | |Clob
'adLongVarWChar |203 |Memo |NText (SQL Server 7.0 +) |NClob
' | |Hyperlink | |
'adNumeric |131 |Decimal |Decimal |Decimal
' | | |Numeric |Integer
' | | | |Number
' | | | |SmallInt
'adSingle |4 |Single |Real |
'adSmallInt |2 |Integer |SmallInt |
'adUnsignedTinyInt |17 |Byte |TinyInt |
'adVarBinary |204 |ReplicationID |VarBinary |
'adVarChar |200 |Text |VarChar |VarChar
'adVariant |12 | |Sql_Variant |VarChar2
'adVarWChar |202 |Text |NVarChar |NVarChar2
'adWChar |130 | |NChar |
Dim DataString As New System.Text.StringBuilder("")
Select Case dt
Case 0
DataString.Append("NULL")
Case 2, 3, 16, 17, 18 'int,small end big
DataString.Append(Dr)
Case 4, 5, 6, 131 'float,double
DataString.Append(Dr.ToString.Replace(",", "."))
Case 7 'datetime
DataString.Append("to_timestamp('")
DataString.Append(CType(Dr, DateTime).ToString("dd-MM-yyy hh:mm:ss"))
DataString.Append("','dd-MM-yyy hh24:mi:ss')")
Case 8, 200, 201, 202, 203, 129, 130, 32770 'varchar
DataString.Append("'")
Dim s As String = Dr
For i As Integer = 0 To s.Length - 1
DataString.Append(s(i))
If s(i) = "'" Then DataString.Append("'")
Next
DataString.Append("'")
Case 72 'guid
DataString.Append(Dr)
Case 11 'bit
DataString.Append("'")
If Dr = "0" Then
DataString.Append("False")
ElseIf Dr = "-1" Then
DataString.Append("True")
Else
DataString.Append(Dr)
End If
DataString.Append("'")
Case 32768 'uniqueidentifier it should never come here
DataString.Append(Dr)
Case 32771 'blob
DataString.Append(Dr)
Case 128
DataString.Append("decode('")
DataString.Append(Convert.ToBase64String(Dr))
DataString.Append("','base64')")
Case Else
Throw New InvalidConstraintException("Type ID=" & dt & " Not Recognized")
End Select
Return DataString.ToString
End Function
Public ReadOnly Property Databases As ArrayList Implements XToY.Databases
Get
Return Me.p_Database
End Get
End Property
Public Property Database As String Implements XToY.Database
Get
Return ""
End Get
Set(val As String)
End Set
End Property
Public Sub AddQueries(qryName As String, qryDefinition As String) Implements XToY.AddQueries
Dim odr As New OleDb.OleDbDataAdapter(qryDefinition, o)
Dim tbl As New DBTable
tbl.Name = qryName
tbl.IsQuery = True
tbl.QueryString = qryDefinition
tbl.DBTarget = "Postgres"
odr.Fill(tbl.Datatable)
tbl.TranslateToTable()
For i As Integer = 0 To tbl.Columns.Count - 1
tbl.Columns(i).NewName = QuoteName(tbl.Columns(i).Name)
Next
odr.Dispose()
h_TAbles.Add(qryName, tbl)
End Sub
Public Property Schema As String Implements XToY.Schema
Get
Return ""
End Get
Set(value As String)
End Set
End Property
Public ReadOnly Property schemas As ArrayList Implements XToY.Schemas
Get
Dim i As New ArrayList
Return i
End Get
End Property
Private Function QuoteName(ByVal st As String) As String
Dim cha() As Char = {"'", Chr(34), " ", "$", "`"}
st = st.Trim(cha)
st = st.Replace("/", "_").Replace("\", "_").Replace(".", "_")
Return Quoter.QuoteNamePG(st, UseQuotes)
End Function
Private Function EscapeName(ByVal st As String) As String
Dim s As New System.Text.StringBuilder
Dim cha() As Char = {"'", Chr(34), " ", "$", "`"}
st = st.Trim(cha)
st = st.Replace("/", "_").Replace("\", "_").Replace(".", "_")
For i As Integer = 0 To st.Length - 1
s.Append(st(i))
If st(i) = "'" Then s.Append("'")
Next
Return s.ToString
End Function
End Class
IT来自一个程序,所以忽略这些工具。有两个访问点New,它们打开连接并加载表的模式。另一个是Execute(),它创建SQL指令。拿你需要的东西......