Patrzyłem na inne podejście niż stosowane przez mnmnc.
Moje próby zapisania testowego dokumentu Word jako HTML nie zakończyły się sukcesem. W przeszłości odkryłem, że HTML generowany przez pakiet Office jest tak pełen plew, że wybranie żądanych bitów jest prawie niemożliwe. Przekonałem się, że tak właśnie jest w tym przypadku. Miałem też problem z równaniami. Program Word zapisuje równania jako obrazy. Dla każdego równania będą dwa obrazy, jeden z rozszerzeniem WMZ i jeden z rozszerzeniem GIF. Jeśli wyświetlasz plik HTML w Google Chrome, równania wyglądają OK, ale nie wspaniale; wygląd pasuje do pliku GIF, gdy jest wyświetlany za pomocą narzędzia do wyświetlania / edycji obrazu, które może obsługiwać przezroczyste obrazy. Jeśli wyświetlasz plik HTML w przeglądarce Internet Explorer, równania wyglądają idealnie.
Dodatkowe informacje
Powinienem był zawrzeć tę informację w oryginalnej odpowiedzi.
Utworzyłem mały dokument Worda, który zapisałem jako HTML. Trzy panele na poniższym obrazku pokazują oryginalny dokument Word, dokument HTML wyświetlany w przeglądarce Microsoft Internet Explorer i dokument HTML wyświetlany w przeglądarce Google Chrome.
Jak wyjaśniono wcześniej, różnica między obrazami IE i Chrome wynika z dwukrotnego zapisania równań, raz w formacie WMZ i raz w formacie GIF. HTML jest za duży, aby go tu wyświetlić.
HTML utworzony przez makro to:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head><body>
<p>Some ordinary text.</p>
<p>H<sub>2</sub>SO<sub>4</sub>.</p>
<p>Abc & def > ghi < jkl</p>
<p>x<sup>3</sup>+ x<sup>2</sup>+3x+4=0.</p><p></p>
<p><i>Equation</i> </p>
<p>Mno</p>
<p><i>Equation</i></p>
</body></html>
Który wyświetla się jako:
Nie próbowałem konwertować równań, ponieważ bezpłatny zestaw MathType Software Development Kit najwyraźniej zawiera procedury konwertowane na LaTex
Kod jest dość prosty, więc niewiele komentarzy. Zapytaj, czy coś jest niejasne. Uwaga: jest to ulepszona wersja oryginalnego kodu.
Sub ConvertToHtml()
Dim FileNum As Long
Dim NumPendingCR As Long
Dim objChr As Object
Dim PathCrnt As String
Dim rng As Word.Range
Dim WithinPara As Boolean
Dim WithinSuper As Boolean
Dim WithinSub As Boolean
FileNum = FreeFile
PathCrnt = ActiveDocument.Path
Open PathCrnt & "\TestWord.html" For Output Access Write Lock Write As #FileNum
Print #FileNum, "<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Frameset//EN""" & _
" ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"">" & _
vbCr & vbLf & "<html xmlns=""http://www.w3.org/1999/xhtml"" " & _
"xml:lang=""en"" lang=""en"">" & vbCr & vbLf & _
"<head><meta http-equiv=""Content-Type"" content=""text/html; " _
& "charset=utf-8"" />" & vbCr & vbLf & "</head><body>"
For Each rng In ActiveDocument.StoryRanges
NumPendingCR = 0
WithinPara = False
WithinSub = False
WithinSuper = False
Do While Not (rng Is Nothing)
For Each objChr In rng.Characters
If objChr.Font.Superscript Then
If Not WithinSuper Then
' Start of superscript
Print #FileNum, "<sup>";
WithinSuper = True
End If
ElseIf WithinSuper Then
' End of superscript
Print #FileNum, "</sup>";
WithinSuper = False
End If
If objChr.Font.Subscript Then
If Not WithinSub Then
' Start of subscript
Print #FileNum, "<sub>";
WithinSub = True
End If
ElseIf WithinSub Then
' End of subscript
Print #FileNum, "</sub>";
WithinSub = False
End If
Select Case objChr
Case vbCr
NumPendingCR = NumPendingCR + 1
Case "&"
Print #FileNum, CheckPara(NumPendingCR, WithinPara) & "&";
Case "<"
Print #FileNum, CheckPara(NumPendingCR, WithinPara) & "<";
Case ">"
Print #FileNum, CheckPara(NumPendingCR, WithinPara) & ">";
Case Chr(1)
Print #FileNum, CheckPara(NumPendingCR, WithinPara) & "<i>Equation</i>";
Case Else
Print #FileNum, CheckPara(NumPendingCR, WithinPara) & objChr;
End Select
Next
Set rng = rng.NextStoryRange
Loop
Next
If WithinPara Then
Print #FileNum, "</p>";
withpara = False
End If
Print #FileNum, vbCr & vbLf & "</body></html>"
Close FileNum
End Sub
Function CheckPara(ByRef NumPendingCR As Long, _
ByRef WithinPara As Boolean) As String
' Have a character to output. Check paragraph status, return
' necessary commands and adjust NumPendingCR and WithinPara.
Dim RtnValue As String
RtnValue = ""
If NumPendingCR = 0 Then
If Not WithinPara Then
CheckPara = "<p>"
WithinPara = True
Else
CheckPara = ""
End If
Exit Function
End If
If WithinPara And (NumPendingCR > 0) Then
' Terminate paragraph
RtnValue = "</p>"
NumPendingCR = NumPendingCR - 1
WithinPara = False
End If
Do While NumPendingCR > 1
' Replace each pair of CRs with an empty paragraph
RtnValue = RtnValue & "<p></p>"
NumPendingCR = NumPendingCR - 2
Loop
RtnValue = RtnValue & vbCr & vbLf & "<p>"
WithinPara = True
NumPendingCR = 0
CheckPara = RtnValue
End Function