2012-04-03 50 views
31

Có cách nào để lấy HTML và nhập nó vào excel sao cho nó được định dạng văn bản đa dạng (tốt nhất là bằng cách sử dụng VBA)? Về cơ bản, khi tôi dán vào một tế bào Excel, tôi đang tìm cách để tắt chức năng này:Văn bản HTML có thẻ để định dạng văn bản trong ô Excel

<html><p>This is a test. Will this text be <b>bold</b> or <i>italic</i></p></html> 

vào đây:

Đây là một thử nghiệm. văn bản này sẽ được đậm hoặc nghiêng

Trả lời

24

Có nó có thể :) Trong thực tế chúng ta hãy Internet Explorer làm công việc bẩn cho bạn;)

thử và thử nghiệm

GIẢ CỦA TÔI

  1. Tôi giả định rằng văn bản html nằm trong Ô A1 của Sheet1. Bạn cũng có thể sử dụng biến thay thế.
  2. Nếu bạn có một cột đầy đủ các giá trị html, sau đó chỉ cần đưa vào mã bên dưới trong một vòng lặp

Sub Sample() 
    Dim Ie As Object 

    Set Ie = CreateObject("InternetExplorer.Application") 

    With Ie 
     .Visible = False 

     .Navigate "about:blank" 

     .document.body.InnerHTML = Sheets("Sheet1").Range("A1").Value 

     .document.body.createtextrange.execCommand "Copy" 
     ActiveSheet.Paste Destination:=Sheets("Sheet1").Range("A1") 

     .Quit 
    End With 
End Sub 

SNAPSHOT

enter image description here

HTH

Sid

+1

Siddharth, giải pháp của bạn khiến báo cáo của tôi trông rất nice..Thanks rất nhiều .. – javanoob

+9

kịch bản VBA này không thành công trên máy tính của tôi trên 'execCommand " Sao chép "dòng", tôi nghi ngờ đó là bởi vì tôi đã cài đặt IE11 mà không hỗ trợ nó. – BornToCode

+0

Điều tương tự đã xảy ra với tôi BornToCode. –

7

Bạn có thể sao chép mã HTML vào khay nhớ tạm và dán lại mã đặc biệt dưới dạng văn bản Unicode. Excel sẽ hiển thị HTML trong ô. Kiểm tra bài này http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

Mã vĩ mô có liên quan từ bài:

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim objData As DataObject 
    Dim sHTML As String 
    Dim sSelAdd As String 

    Application.EnableEvents = False 

    If Target.Cells.Count = 1 Then 
     If LCase(Left(Target.Text, 6)) = "<html>" Then 
     Set objData = New DataObject 

     sHTML = Target.Text 

     objData.SetText sHTML 
     objData.PutInClipboard 

     sSelAdd = Selection.Address 
     Target.Select 
     Me.PasteSpecial "Unicode Text" 
     Me.Range(sSelAdd).Select 

     End If 
    End If 

    Application.EnableEvents = True 

End Sub 
+0

Cảm ơn. Trong Excel 2010, tôi đã phải thêm 'FM20.DLL' theo cách thủ công vào _Tools..References_ để lấy' DataObject' có sẵn từ "Thư viện đối tượng Microsoft Forms 2.0". Sau đó, tôi đã có một vấn đề với 'Me.PasteSpecial' vì nó không thích tôi (không có câu chuyện cười). 'Target.PasteSpecial' đưa ra một lỗi, nhưng' Sheets (1) .Range ("B51") .Tính năng đặc biệt' đã hoạt động. Và tôi đã từ bỏ cố gắng để có được dán vào một tế bào sáp nhập, sẽ chỉ phải sử dụng sprinklings tự do của các thẻ BR trong HTML được cấu hình của tôi để buộc ngắt dòng để kiểm soát chiều rộng của đầu ra. –

6

Nếu ví dụ IE không hoạt động sử dụng thế này. Dù sao, điều này sẽ nhanh hơn việc bắt đầu lên một phiên bản của IE.

Dưới đây là một giải pháp hoàn chỉnh dựa trên
http://www.dailydoseofexcel.com/archives/2005/02/23/html-in-cells-ii/

Lưu ý, nếu innerHTML của bạn là tất cả các số ví dụ như '12345', HTML định dạng doesnt hoàn toàn làm việc trong excel vì nó đối xử với con số khác nhau? nhưng thêm một ký tự, ví dụ: dấu cách ở cuối ví dụ. 12345 + "& nbsp;" định dạng ok.

Sub test() 
    Cells(1, 1).Value = "<HTML>1<font color=blue>a</font>" & _ 
         "23<font color=red>4</font></HTML>" 
    Dim rng As Range 
    Set rng = ActiveSheet.Cells(1, 1) 
    Worksheet_Change rng, ActiveSheet 
End Sub 


Private Sub Worksheet_Change(ByVal Target As Range, ByVal sht As Worksheet) 

    Dim objData As DataObject ' Set a reference to MS Forms 2.0 
    Dim sHTML As String 
    Dim sSelAdd As String 

    Application.EnableEvents = False 

    If Target.Cells.Count = 1 Then 

      Set objData = New DataObject 
      sHTML = Target.Text 
      objData.SetText sHTML 
      objData.PutInClipboard 
      Target.Select 
      sht.PasteSpecial Format:="Unicode Text" 
    End If 

    Application.EnableEvents = True 

End Sub 
+4

FYI cho bất kỳ ai khác, tôi không có MS Forms 2.0 trong thư viện tham chiếu mặc định của mình, vì vậy tôi phải thêm nó. Trên PC của tôi là C: \ WINDOWS \ system32 \ FM20.dll –

+3

Brilliant! Trong Excel tiếng Đức, chuỗi Định dạng được bản địa hóa, tôi cần 'sht.PasteSpecial Format: =" Unicode-Text "'. Đối với các bản địa hoá khác, ghi lại hành động Dán Đặc biệt (hoặc Dán Nội dung) một lần trong macro. – Andre

6

Tôi biết chủ đề này là cổ xưa, nhưng sau khi giao innerHTML, ExecWB làm việc cho tôi:

.ExecWB 17, 0 
 
'Select all contents in browser 
 
.ExecWB 12, 2 
 
'Copy them

Và sau đó chỉ cần dán nội dung vào Excel. Vì các phương pháp này dễ bị lỗi thời gian chạy, nhưng hoạt động tốt sau khi một hoặc hai lần thử trong chế độ gỡ lỗi, bạn có thể phải yêu cầu Excel thử lại nếu nó gặp lỗi. Tôi giải quyết điều này bằng cách thêm xử lý lỗi này đến phụ, và nó hoạt động tốt:

Sub ApplyHTML() 
 
    On Error GoTo ErrorHandler 
 
    ... 
 
    Exit Sub 
 

 
ErrorHandler: 
 
    Resume 
 
    'I.e. re-run the line of code that caused the error 
 
Exit Sub 
 
     
 
End Sub

0

Tất cả các bạn có giải pháp hợp lệ, và với một số ít trong số họ, bạn có thể thực hiện chính xác này.

công cụ cần là cụm từ thông dụng, LINQ, công cụ tìm kiếm, vb.net hoặc C# và internet.

Tìm kiếm "html table to dataset". Sau đó tìm kiếm "tập dữ liệu để excel mà không cần cài đặt excel".

Tôi nghĩ rằng với những cụm từ đó, bạn có thể đặt cùng nhau. ;)

Nhưng đây là một số giải pháp.

  Using sr As StreamReader = New StreamReader(fileName, Encoding.UTF8) 
       result = sr.ReadToEnd() 
      End Using 
      result = result.Substring(result.IndexOf("<tab")) 
      Dim sb As New StringBuilder 
      sb.AppendLine("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"" ""http://www.w3.org/TR/html4/loose.dtd"">") 
      sb.AppendLine("<html>") 
      sb.AppendLine("<head>") 
      sb.AppendLine("<meta http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1" > "") 
      sb.AppendLine("<title>Title</title>") 
      sb.AppendLine("</head>") 
      sb.AppendLine("<body>") 
      sb.Append(result) 
      sb.AppendLine("</body>") 
      sb.AppendLine("</html>") 
      result = sb.ToString() 
      File.Move(fileName, System.IO.Path.GetFileNameWithoutExtension(fileName) + ".txt") 
      Dim ds As DataSet = GetTableAsDataSet.ConvertHTMLTablesToDataSet(result) 
      If (DataSetToExcel.WriteXLSFile(fileName, ds) = True) Then 

http://www.dotnetfunda.com/articles/show/51/convert-html-tables-to-a-dataset

http://www.codeproject.com/Tips/313731/How-to-convert-DataSet-to-Excel-workbook-xls-using

Đối với mục đích đơn giản tập tin đầu vào của tôi là một bảng html mà các bản đồ để nổi trội ngay cho quan điểm đúng đắn. Nhưng một cái nhìn là tất cả. vì vậy tôi đọc nó trong dải tắt crap meta phong cách và bọc nó trong nguồn cấp dữ liệu html hợp lệ nó vào để có được các thiết lập dữ liệu và ghi dữ liệu đặt ra. thưởng thức.

Tôi nghĩ rằng biểu hiện thường xuyên có thể giúp bạn với tập hợp các phần khác của html ...

<table[^>]*>(.*?)</table> == <html[^>]*>(.*?)</html> 

Tín đi đến các tác giả của cho biết mã. Tôi chỉ đặt nó lại với nhau.

1

Tôi chạy vào cùng một lỗi mà BornToCode được xác định đầu tiên trong các nhận xét của giải pháp gốc. Không quen thuộc với Excel và VBA, tôi mất một giây để tìm ra cách thực hiện giải pháp của tiQU. Vì vậy, tôi đăng nó như là một "For Dummies" giải pháp dưới đây

  1. Đầu tiên kích hoạt chế độ nhà phát triển trong Excel: Link
  2. Chọn Tab Developer> Visual Basic
  3. Bấm View> Mã
  4. Dán mã bên dưới cập nhật các dòng yêu cầu tham chiếu ô là chính xác.
  5. Nhấp vào Xanh Run mũi tên hoặc nhấn F5

Sub Sample() Dim Ie As Object Set Ie = CreateObject("InternetExplorer.Application") With Ie .Visible = False .Navigate "about:blank" .document.body.InnerHTML = Sheets("Sheet1").Range("I2").Value 'update to the cell that contains HTML you want converted .ExecWB 17, 0 'Select all contents in browser .ExecWB 12, 2 'Copy them ActiveSheet.Paste Destination:=Sheets("Sheet1").Range("J2") 'update to cell you want converted HTML pasted in .Quit End With End Sub

Các vấn đề liên quan