【问题标题】:how to read an excel column from vb.net, that have 2 types of data如何从 vb.net 读取具有 2 种数据类型的 excel 列
【发布时间】:2020-04-14 16:20:55
【问题描述】:

我有一个问题: 在我的 excel 上,我有一列包含整数和字符串。我需要阅读该列并用我拥有的任何内容填充数据表。

excel 看起来像这样:

Ndedocumento

2.147.483.647,
959.224,
949.143,
530.949,

第一个为字符串,下一个为整数。

我的申请返回:

Ndedocumento

null,
959.224,
949.143,
530.949,

我试图发布图片以便您可以清楚地看到它,但我不允许。它让我摆脱了数字之间的输入:(

您知道读取所有值的任何方法吗?因为通过这种方式,我什么都没有得到价值,所以我无法格式化它或任何让我捕捉到价值的东西。

这是我读取 excel 的代码:

    conexion_te.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ruta_archivo + "; Extended Properties=Excel 12.0 Xml;HDR=YES;"

    Dim cmd As New OleDb.OleDbCommand
    Dim da As New OleDb.OleDbDataAdapter
    Dim dtExt As New DataTable

    cmd.CommandText = "Select * FROM [" + Me.Combo_Tabla_Hoja.SelectedItem + "]"
    cmd.Connection = conexion_te
    da.SelectCommand = cmd
    da.Fill(dtExt)

【问题讨论】:

  • 嗨!我还没有意识到我还不能发布图片。我会用文字发帖
  • 现在可以了,因为我可以在没有图像的情况下 :)
  • Ndedocumento“第一”。整数在哪里?在您的国家/地区,. 是千位分隔符吗?您似乎给出了用逗号分隔的 4 个值?这是 CSV 吗? “下一个”是指 3 个值吗?您是要读取所有 4 个值(字符串、整数、整数、整数)还是仅读取两个值(字符串、整数)
  • 你好!以逗号分隔的每个数字位于不同的行上。我想将它作为 excel 发布,但它会自动加入同一个 renglon 这里。每个数字都是一个文件编号,所以点不是十进制,只是分隔数字。它们不是用逗号分隔的 4 个数字,它是一个中间带点的数字。它是一个 .xls。 Next 指的是同一列中不同行上的其他 3 个不同值。是的,我试图将所有 4 个值读取为(字符串、整数、整数、整数)。它们都在同一列 (Ndedocumento) 中,每个列在不同的行上(一个在另一个下面)
  • 我使用代码标签格式化了您的帖子。它是否准确地反映了您的意思?您有 1 列,标题为 Ndedocumento,然后是 4 个值,您尝试读取第一个值失败,但其他值读取正常 - 是吗?

标签: excel vb.net


【解决方案1】:

我很想放弃使用 ACE 驱动程序从 Excel 中读取数据,而是使用 EPPlus,如 Tim Schmelter 的回答 here 中所述。他的第一行从 2 或 1 开始,你应该从 3 或 2 开始。

这是他的代码的 VB 版本:

    Public Shared Function GetDataTableFromExcel(path As String, Optional hasHeader As Boolean = True) As DataTable
        Using pck = New OfficeOpenXml.ExcelPackage()

            Using stream = File.OpenRead(path)
                pck.Load(stream)
            End Using


            Dim ws = pck.Workbook.Worksheets.First()
            Dim tbl = New DataTable();

            For Each firstRowCell In ws.Cells(1, 1, 1, ws.Dimension.End.Column)
                tbl.Columns.Add(If(hasHeader, firstRowCell.Text, String.Format("Column {0}", firstRowCell.Start.Column)))
            Next

            Dim startRow = If(hasHeader, 3, 2)

            For rowNum = startRow To ws.Dimension.End.Row Step 1
                Dim wsRow = ws.Cells(rowNum, 1, rowNum, ws.Dimension.End.Column)
                Dim row = tbl.Rows.Add()
                For Each cell In wsRow

                    row(cell.Start.Column - 1) = cell.Text
                Next cell
            Next rowNum

            Return tbl
        End Using

    End Function

我认为我已经正确翻译了它,但是如果它对您来说很奇怪,请使用调试器对其进行单步调试并查看原因。这将返回一个数据表,其中所有列都是字符串类型,这应该意味着您的数据得到了很好的表示。之后可以对其进行转换和格式化

【讨论】:

  • 我没有OfficeOpenXml,你现在怎么弄?
  • 对不起,应该提到;右键Solution Explorer中的项目名称,选择Manage Nuget Packages,点击左上角Browse,输入EPPlus,安装下载量约1700万的那个
  • 我还必须打开这些文件:.mdb、.xls、.xlxs、.dbf,我不知道您的回答是否对此有用
  • 好吧,公平地说,你的问题确实是“Excel”。现在转身说“哦,它也需要打开access db”有点尴尬。但是如果它确实需要打开一个Access DB,那么数据类型没有任何问题,因为一个Access DB表列可以'不能既是字符串又是数字!谷歌搜索“TypeGuessRows”,看看是否编辑注册表以使数据库驱动程序扫描更少/更多行有助于将数据作为字符串而不是数字返回,或者考虑将其用于 excel 文件和用于 DB 文件的 jet 驱动程序
  • 为什么这么说:他的第一行从 2 或 1 开始,你应该从 3 或 2 开始。这取决于它是否有标题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2015-01-13
  • 2020-12-14
  • 2021-12-27
  • 1970-01-01
  • 2014-05-08
相关资源
最近更新 更多