0

こんにちは私はスプレッドシートをインポートする必要があります-データを検証してDBに保存します。

スプレッドシートデータは2つのソースから取得されます。1つは直接インポートできます(これには問題はありません)。データをDBに保存する前に、2番目のソースからのスプレッドシートのデータを操作する必要があります。

xlsファイルをアップロードしてからdatatableにインポートするWebページを作成しました。データテーブルは、グリッドビューのデータソースになります。次に、検証を行い、DBに保存します。

このコードは、標準のスプレッドシートでうまく機能しました。どちらのタイプのソーススプレッドシートにも対応できるように、コードを修正する必要があります。

データ標準ソースの例

Unique ID   Ref       PartName           New_SH Year  ProductType   Location  Qty  TopSeller
39564       SD9PP/SS  Micra Water Pump   N      2012  Cooling       CD19       12  Y

操作が必要なソース

Unique ID   Ref                   PartName          New_SH  Year  ProductType   Location    Qty  TopSeller
IS-4564     XM3M_ZZ_001_001_1982  180 wiper motor   S             Wiper Motor   CD19          3  N

上記の例では、最後の4桁がYEAR列に転送され、2番目のアンダースコアまでのRefの最初の部分がトリミングされ、アンダースコアが/(XM3M / ZZなど)に置き換えられるように、Refを操作する必要があります。参照は4+2suffixから6+2suffixまでの任意の値にすることができますが、常に_XXX_XXX_YYYYが続きます。ここで、XとYは数字Xは不要で、YYYYは年です。

私の計画は、スプレッドシートを一時データテーブルにインポートし、そのテーブルをセルごとに行ごとに調べ、必要な変更を加えた後、別のデータテーブルにコピーすることでした。この2番目のテーブルは、グリッドビューのデータソースとして使用されます。

これが私のコードです...

Protected Sub ReadExcelFile(filename As String, worksheet As String)

Try
' Fetch Data from Excel data is based on the following
'Unique ID  Ref         PartName        New_SH  Year    ProductType Location    Qty TopSeller
'IS-4564    XM3M_ZZ_001_001_1982    180 wiper motor     S       Wiper Motor CD19            3   N
'35667      SD9PP/SS        Micra water pump    N   2012    Cooling     CA4     14  Y

Dim MyConnection As New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; data source='" & filename & "'; Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'")
Dim MyCommand As New OleDbDataAdapter("select * from [" & worksheet & "]", MyConnection)
Dim dtPreview As New DataTable()
Dim dtTemp As New DataTable()


    'Place data in temp datatable
    MyCommand.Fill(dtTemp)

    'Go through tem[ datatable and transfer cell values to dtPreview
    If dtTemp.Columns.Count < 9 Then
    'We do not have enough columns
    lb_Error.Text = "Spreadsheet does not contain enough columns
    Exit Sub

    Else
    'We have at least 9 columns - we are only interested in the first 9
    If dtTemp.Rows.Count > 0 Then
        'we have at least one row

        'Add Column Headers
        For c = 0 To dtTemp.Columns.Count - 1
        dtPreview.Columns.Add(dtTemp.Columns(c).ColumnName, dtTemp.Columns(c).DataType)
        Next

        'Add Row Data
        Dim l As Integer = 0
        For Each drTempRow As DataRow In dtTemp.Rows


        Dim newRow As DataRow = dtPreview.NewRow()

        'Unique ID
        If Left(dtTemp.Rows(0).ToString, 3) = "IS-" Then
            newRow(0) = Mid(dtTemp.Columns(0).ToString.ToUpper.Trim, 4, 8)
        Else
            newRow(0) = dtTemp.Columns(0).ToString.ToUpper.Trim
        End If

        'Ref
        If Left(dtTemp.Rows(0).ToString, 3) = "IS-" Then
            l = Len(dtTemp.Columns(1).ToString.Trim)
            newRow(1) = Left(dtTemp.Columns(1).ToString.Replace("_", "/").ToUpper.Trim, l - 13)
        Else
            newRow(1) = dtTemp.Columns(1).ToString.ToUpper.Trim
        End If

        'Part Name
        newRow(2) = dtTemp.Columns(2).ToString.ToUpper.Trim

        'New / Secondhand
        newRow(3) = dtTemp.Columns(3).ToString.ToUpper.Trim

        'Year
        If Left(dtTemp.Columns(0).ToString, 3) = "IS-" Then
            newRow(4) = Right(dtTemp.Columns(0).ToString, 4)
        Else
            newRow(4) = dtTemp.Columns(4).ToString
        End If

        'Product Type
        newRow(5) = dtTemp.Columns(5).ToString.ToUpper.Trim

        'Location
        newRow(6) = dtTemp.Columns(6).ToString.ToUpper.Trim

        'Quantity in Stock
        newRow(7) = dtTemp.Columns(7).ToString

        'Top Seller
        newRow(8) = dtTemp.Columns(8).ToString.ToUpper.Trim

        dtPreview.Rows.Add(newRow)

        newRow = Nothing
        Next

    End If

    'Add additional columns
    dtPreview.Columns.Add("RecdBy", GetType(System.Int16), Session("UserNo").ToString())

    If ddl_FileSource.SelectedValue.ToString() = "1" Then
        dtPreview.Columns.Add("IntExt", GetType(System.Int16), "1")
    Else
        dtPreview.Columns.Add("IntExt", GetType(System.Int16), "0")
    End If

    dtTemp = Nothing

End If

'Bind DataTable to Gridview
Session("dtgv") = dtPreview
gv_StockData.DataSource = dtPreview
gv_StockData.DataBind()
MyConnection.Close()

Catch msg As Exception
lb_Error.Text = msg.Message

End Try

サブ終了

問題は、エラーが発生していることです。これに直角からアプローチしていますか?

4

1 に答える 1

0

並べ替え...データテーブルの各セルをループするためのコードに欠陥がありました...本日遅くに動作するバージョンを公開します。

于 2012-09-19T12:33:34.957 に答える