Импорт HTML в Excel с помощью VSTO - PullRequest
0 голосов
/ 28 мая 2019

У меня есть несколько html-файлов, и мне нужно импортировать данные в Excel. Я использую VSTO (VB.NET) для достижения того же. К сожалению, я получаю некоторые ошибки. Я новичок в разборе HTML. Может кто-нибудь сказать мне, где я иду не так в коде ниже.

Я попытался прочитать текст заголовка 2 из коллекции HTML, но он не работает. Может кто-нибудь сообщить мне, где я иду не так?

        Dim doc As HtmlDocument, htmlTable As Object, htmlBody As 
        HtmlElementCollection
        Dim wbrowser As New WebBrowser
        Dim header2 as String
        wbrowser.Visible = False
        wbrowser.Navigate(InputHtmlFile)
        'Do
        '
        'Loop Until Not wbrowser.IsBusy

        doc = wbrowser.Document

        htmlBody = doc.GetElementsByTagName("BODY")
        htmlheadings = doc.GetElementsByTagName("H2")
        header2 = htmlheadings(0).Innertext

Ниже приведен HTML-код

    <HEAD>
    <TITLE> SOME TITLE </TITLE>
    </HEAD>
    <BODY>
    <H2> HEADER 2 TEXT </H2>
    <HR NOSHADE>
    <H3> <U>DATA</U> </H3>
    <BLOCKQUOTE>
    VERSION NUMBER X.X.XXX
    </BLOCKQUOTE>
    <HR SIZE = 5>
    <H3> <U>DATA SET 2</U></H3>
    <BLOCKQUOTE>
    <H4>DATA SET 3 </H4>
    <BLOCKQUOTE>

    <TABLE border=1>
    <TR> <TH> TableHeader1 </TH> <TH>TTableHeader2</TH> 
    <TH>TableHeader3</TH><TH>TableHeader4</TH><TH>TableHeader5</TH> 
    <TH>TableHeader6</TH></TR><TR ALIGN=CENTER><TD>1</TD><TD> 6.4</TD><TD> 
    StringData</TD><TD> No</TD><TD> </TD><TD> </TD> </TR></TABLE><BR>
    </BLOCKQUOTE>

Я ожидаю, что "HEADER 2 TEXT" назначен переменной header2, но я получаю следующую ошибку в строке

    header2 = htmlheadings(0).Innertext

System.ArgumentOutOfRangeException: значение «0» недопустимо для «индекса». 'index' должен быть между 0 и -1. Имя параметра: индекс '

htmlheadings (0) .InnerHtml = 'htmlheadings (0) .InnerHtml' вызвала исключение типа 'System.ArgumentOutOfRangeException'

Также коллекции htmlBody и htmlheadings пусты.

1 Ответ

1 голос
/ 29 мая 2019

Ваш HTML-код не является правильным HTML. Нет никаких тегов , нет конечных тегов , больше открывающих тегов

, чем закрывающих и т. Д. Я удалил то, что было неверно:
    <?xml version="1.0" encoding="utf-8" ?>
    <html>
      <head>
        <title>SOME TITLE</title>
      </head>
      <body>
        <h2>HEADER 2 TEXT </h2>
        <h3>
          <u>DATA</u>
        </h3>
        <blockquote>VERSION NUMBER X.X.XXX</blockquote>
        <h3><u>DATA SET 2</u></h3>
        <h4>DATA Set 3</h4>
        <table border="1">
          <tr><th>TableHeader1</th><th>TTableHeader2</th><th>TableHeader3</th><th>TableHeader4</th><th>TableHeader5</th><th>TableHeader6</th></tr>
          <tr align="CENTER"><td>1</td><td>6.4</td><td>StringData</td><td>No</td><td></td><td></td></tr>
        </table>
        <br />
      </body>
    </html>

Элементы работают нормально в обработчике событий DocumentCompleted элемента управления браузера (дважды щелкните его, чтобы сгенерировать обработчик событий):

Public Class Form1

    Public Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        wbrowser.Visible = False
        wbrowser.Navigate("C:\temp\foo.html")
    End Sub

    Private Sub wbrowser_DocumentCompleted(sender As Object, e As Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles wbrowser.DocumentCompleted
        Dim doc = wbrowser.Document
        Dim htmlBody = doc.GetElementsByTagName("BODY")(0)
        Dim htmlheadings = htmlBody.GetElementsByTagName("H2")
        Dim header2 = htmlheadings(0).InnerText
        MsgBox(header2)
    End Sub

End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...