Nhập dữ liệu từ file XML

Liên hệ QC

Heo con không mập

Thành viên mới
Tham gia
28/2/21
Bài viết
7
Được thích
0
Chào các bác,
hiện e có 1 mớ file XML có cấu trúc kiểu như thế này:
XML:
<?xml version="1.0" encoding="utf-8"?>
<Invoice>
<Content Id="data">
<InvoiceName>Hóa đơn giá trị gia tăng</InvoiceName>
<InvoiceType>01GTKT</InvoiceType>
<InvoicePattern>01GTKT0/001</InvoicePattern>
<InvoiceSerial>EK/21E</InvoiceSerial>
<InvoiceNumber>0001217</InvoiceNumber>
<InvoiceDate>24/02/2021</InvoiceDate>
<SignedDate>24/02/2021</SignedDate>
<PaymentMethod>Tiền mặt/ Chuyển khoản</PaymentMethod>
<CompanyName>CÔNG TY Đã xóa </CompanyName>
<CompanyTaxCode>0000000</CompanyTaxCode>
<CompanyAddress>09A Hùng Vương/CompanyAddress>
<CompanyPhone>0999.999.999</CompanyPhone>
<CompanyFax></CompanyFax>
<CompanyEmail></CompanyEmail>
<CompanyBankAccount>421213213109</CompanyBankAccount>
<CompanyBankName>Ngân hàng Chính Sách Xã Hội</CompanyBankName>
<CustomerCode>600</CustomerCode>
<CustomerTaxCode>60</CustomerTaxCode>
<Buyer>LAN ANH</Buyer><CustomerName>NHÀ THUỐC LAN ANH</CustomerName>
<CustomerAddress>HB</CustomerAddress>
<CustomerPhone>0941.941.941</CustomerPhone>
<CustomerFax></CustomerFax>
<EmailDeliver></EmailDeliver><
CustomerBankAccount></CustomerBankAccount>
<CustomerBankName></CustomerBankName>
<CustomerType></CustomerType>
<CurrencyUnit>VND</CurrencyUnit>
<ExchangeRate>1.000000000000</ExchangeRate>
<Amount>1698571.00</Amount>
<TaxRate>5.00</TaxRate>
<TaxAmount>84929.00</TaxAmount>
<TotalAmount>1783500.00</TotalAmount>
<AmountInWords>Một triệu, bảy trăm tám mươi ba nghìn, năm trăm đồng chẵn</AmountInWords>
<TaxAmountFree>0</TaxAmountFree>
<TaxAmount0>0</TaxAmount0>
<TaxAmount5>0</TaxAmount5>
<TaxAmount10>0</TaxAmount10>
<DiscountAmount>0.00</DiscountAmount>
<PromotionAmount>0.00</PromotionAmount>
<Note></Note>
<External1>Kho CN</External1><External2></External2><External3></External3>
<NumberExternal1>10</NumberExternal1><NumberExternal2>0</NumberExternal2>
<NumberExternal3>0</NumberExternal3>
<KindOfInvoice>1</KindOfInvoice>
<Products>
<Product>

<LineNumber>1</LineNumber>
<LinePrint>1</LinePrint>
<ItemCode>A15.0005</ItemCode>
<ItemName>AgiCipro 500 H/100v, Agimexpharm</ItemName>
<UnitOfMeasure>Hộp</UnitOfMeasure>
<IsPromotion>0</IsPromotion>
<Quantity>8.000</Quantity>
<Price>140000.0000</Price>
<Amount>1120000.00</Amount>
<DiscountRate>0.00</DiscountRate>
<DiscountAmount>0.00</DiscountAmount>
<TaxRate>5.00</TaxRate>
<TaxAmount>56000.00</TaxAmount>
<Note></Note>
<External1>020520</External1>
<External2>5/2023</External2>
<External3></External3>
<NumberExternal1>0</NumberExternal1>
<NumberExternal2>0</NumberExternal2>
<NumberExternal3>0</NumberExternal3>
</Product><Product>

<LineNumber>2</LineNumber>
<LinePrint>2</LinePrint>
<ItemCode>A15.0012</ItemCode>
<ItemName>Agimoti 10mg, H/100v, AGMP</ItemName>
<UnitOfMeasure>Hộp</UnitOfMeasure>
<IsPromotion>0</IsPromotion><Quantity>5.000</Quantity>
<Price>38095.2400</Price>
<Amount>190476.00</Amount>
<DiscountRate>0.00</DiscountRate>
<DiscountAmount>0.00</DiscountAmount>
<TaxRate>5.00</TaxRate>
<TaxAmount>9524.00</TaxAmount>
<Note></Note>
<External1>020720</External1>
<External2>8/2022</External2>
<External3></External3>
<NumberExternal1>0</NumberExternal1>
<NumberExternal2>0</NumberExternal2>
<NumberExternal3>0</NumberExternal3>
</Product><Product>
<LineNumber>3</LineNumber>
<LinePrint>3</LinePrint>
<ItemCode>A15.0013</ItemCode>
<ItemName>Agiparofen H/50v, Agimexpharm</ItemName>
<UnitOfMeasure>Viên</UnitOfMeasure>
<IsPromotion>0</IsPromotion>
<Quantity>250.000</Quantity>
<Price>600.0000</Price>
<Amount>150000.00</Amount>
<DiscountRate>0.00</DiscountRate>
<DiscountAmount>0.00</DiscountAmount>
<TaxRate>5.00</TaxRate>
<TaxAmount>7500.00</TaxAmount>
<Note></Note><External1>030820</External1>
<External2>9/2023</External2>
<External3></External3>
<NumberExternal1>0</NumberExternal1>
<NumberExternal2>0</NumberExternal2>
<NumberExternal3>0</NumberExternal3>
</Product><Product>
<LineNumber>4</LineNumber>
<LinePrint>4</LinePrint>
<ItemCode>A15.0054</ItemCode>
<ItemName>Gel- Aphos 20g H/20 gói, Agimexpharm</ItemName>
<UnitOfMeasure>Hộp</UnitOfMeasure>
<IsPromotion>0</IsPromotion>
<Quantity>5.000</Quantity>
<Price>47619.0500</Price>
<Amount>238095.00</Amount>
<DiscountRate>0.00</DiscountRate>
<DiscountAmount>0.00</DiscountAmount>
<TaxRate>5.00</TaxRate>
<TaxAmount>11905.00</TaxAmount>
<Note></Note><External1>1291120</External1>
<External2>12/2022</External2>
<External3></External3>
<NumberExternal1>0</NumberExternal1>
<NumberExternal2>0</NumberExternal2>
<NumberExternal3>0</NumberExternal3></Product></Products></Content>
<Key>AQAAANVu+iKd2LFdNhSaQQqSfVKvDwbfiWkm53XQET5YjTeosBMJ9Xyyieg=003918</Key>
<ExternalKeys><UnitCode>100</UnitCode></ExternalKeys>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI="#data"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue></DigestValue></Reference></SignedInfo><SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#">=</SignatureValue><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><X509Data><X509Certificate></X509Certificate></X509Data></KeyInfo></Signature></Invoice>
nói chung là 1 mớ thẻ rác, trong đó em chỉ cần 1 vài tag trong đó, điền vào đúng vị trí của các cột tương ứng.
Vd như: từ cột
<ItemName>AgiCipro 500 H/100v, Agimexpharm</ItemName> vào cột tên.
<Price>140000.0000</Price> vào cột giá nhập
<Quantity>8.000</Quantity> vào cột số lượng...
thì có cách nào làm cho nhanh không ạ? E đang phải sử dụng chức năng XML map trong cột Developer nhưng làm tay nó chậm quá :(
 
E gửi bác đây ạ.
cấu trúc thì giống nhau hết. Tập tin excel kia là mẫu, chỉ cần thứ tự hàng & tên cột giống như mẫu là em có thể import vào trang quản trị của pharmacy vnpt dc. Cứ mỗi lần làm là e sẽ phải tạo 1 file excel mới lên có cấu trúc tương tự là được, Em cần lấy các thẻ này thôi:

<ItemCode></ItemCode> Thành cột
<ItemName></ItemName>Thành cột Tên
<UnitOfMeasure></UnitOfMeasure>Thành cộtĐơn vị nhỏ nhất
<Quantity></Quantity>Thành cột Số lượng
<Price></Price>Thành cộtGiá nhập
<TaxRate></TaxRate>Thành cột VAT
<External1></External1>Thành cột
<External2></External2>Thành cộtNgày hết hạn

XML:
 <ItemCode></ItemCode>  Thành cột  Mã
 <ItemName></ItemName> Thành cột  Tên
 <UnitOfMeasure></UnitOfMeasure> Thành cột Đơn vị nhỏ nhất
 <Quantity></Quantity> Thành cột  Số lượng
 <Price></Price> Thành cột Giá nhập
 <TaxRate></TaxRate> Thành cột  VAT
 <External1></External1> Thành cột Lô
 <External2></External2> Thành cột Ngày hết hạn
 

File đính kèm

  • Pharmacy.zip
    7.5 KB · Đọc: 22
E gửi bác đây ạ.
cấu trúc thì giống nhau hết. Tập tin excel kia là mẫu, chỉ cần thứ tự hàng & tên cột giống như mẫu là em có thể import vào trang quản trị của pharmacy vnpt dc. Cứ mỗi lần làm là e sẽ phải tạo 1 file excel mới lên có cấu trúc tương tự là được, Em cần lấy các thẻ này thôi:

<ItemCode></ItemCode> Thành cột
<ItemName></ItemName>Thành cột Tên
<UnitOfMeasure></UnitOfMeasure>Thành cộtĐơn vị nhỏ nhất
<Quantity></Quantity>Thành cột Số lượng
<Price></Price>Thành cộtGiá nhập
<TaxRate></TaxRate>Thành cột VAT
<External1></External1>Thành cột
<External2></External2>Thành cộtNgày hết hạn

XML:
 <ItemCode></ItemCode>  Thành cột  Mã
<ItemName></ItemName> Thành cột  Tên
<UnitOfMeasure></UnitOfMeasure> Thành cột Đơn vị nhỏ nhất
<Quantity></Quantity> Thành cột  Số lượng
<Price></Price> Thành cột Giá nhập
<TaxRate></TaxRate> Thành cột  VAT
<External1></External1> Thành cột Lô
<External2></External2> Thành cột Ngày hết hạn
File XML của bạn bị lỗi nhé.
 
E đang phải sử dụng chức năng XML map trong cột Developer nhưng làm tay nó chậm quá :(
Thì làm bằng tay 1 lần nhưng có record (thẻ Developer -> Record Macro) để xem kết quả ra sao.

Nếu muốn tham khảo 1 cách khác thì đọc tiếp.

Mở tập tin Excel -> Alt + F11 -> Insert -> Module -> dán code sau vào Module1 -> chạy sub read_xml.
Lưu ý: sheet kết quả có tên là Sheet2. Nếu khác thì sửa Sheet2 trong code.
Mã:
Option Explicit

Sub read_xml()
Dim xmlDoc As Object, node As Object
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    xmlDoc.Load ThisWorkbook.Path & "\202101080000150.xml"
    Set node = xmlDoc.DocumentElement.SelectSingleNode("/Invoice/Content/Products")
    parseNodes node, ThisWorkbook.Worksheets("Sheet2")
    Set node = Nothing
    Set xmlDoc = Nothing
End Sub

Sub parseNodes(node As Object, ByVal sh As Worksheet)
Dim n As Long, result() As String, child As Object
    If node Is Nothing Then Exit Sub
    If (node.HasChildNodes) Then
        ReDim result(1 To node.ChildNodes.Length, 1 To 12)
        For n = 0 To node.ChildNodes.Length - 1
            Set child = node.ChildNodes.Item(n)
            result(n + 1, 1) = child.SelectSingleNode("ItemName").Text
            result(n + 1, 3) = child.SelectSingleNode("ItemCode").Text
            result(n + 1, 6) = child.SelectSingleNode("UnitOfMeasure").Text
            result(n + 1, 7) = child.SelectSingleNode("Price").Text
            result(n + 1, 9) = child.SelectSingleNode("Quantity").Text
            result(n + 1, 10) = child.SelectSingleNode("TaxRate").Text
            result(n + 1, 11) = child.SelectSingleNode("External1").Text
            result(n + 1, 12) = child.SelectSingleNode("External2").Text
        Next n
        sh.Cells(Rows.Count, "A").End(xlUp).Offset(1, 3).Resize(UBound(result, 1), UBound(result, 2)).Value = result
    End If
End Sub
 
Thì làm bằng tay 1 lần nhưng có record (thẻ Developer -> Record Macro) để xem kết quả ra sao.

Nếu muốn tham khảo 1 cách khác thì đọc tiếp.

Mở tập tin Excel -> Alt + F11 -> Insert -> Module -> dán code sau vào Module1 -> chạy sub read_xml.
Lưu ý: sheet kết quả có tên là Sheet2. Nếu khác thì sửa Sheet2 trong code.
Mã:
Option Explicit

Sub read_xml()
Dim xmlDoc As Object, node As Object
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")
    xmlDoc.Load ThisWorkbook.Path & "\202101080000150.xml"
    Set node = xmlDoc.DocumentElement.SelectSingleNode("/Invoice/Content/Products")
    parseNodes node, ThisWorkbook.Worksheets("Sheet2")
    Set node = Nothing
    Set xmlDoc = Nothing
End Sub

Sub parseNodes(node As Object, ByVal sh As Worksheet)
Dim n As Long, result() As String, child As Object
    If node Is Nothing Then Exit Sub
    If (node.HasChildNodes) Then
        ReDim result(1 To node.ChildNodes.Length, 1 To 12)
        For n = 0 To node.ChildNodes.Length - 1
            Set child = node.ChildNodes.Item(n)
            result(n + 1, 1) = child.SelectSingleNode("ItemName").Text
            result(n + 1, 3) = child.SelectSingleNode("ItemCode").Text
            result(n + 1, 6) = child.SelectSingleNode("UnitOfMeasure").Text
            result(n + 1, 7) = child.SelectSingleNode("Price").Text
            result(n + 1, 9) = child.SelectSingleNode("Quantity").Text
            result(n + 1, 10) = child.SelectSingleNode("TaxRate").Text
            result(n + 1, 11) = child.SelectSingleNode("External1").Text
            result(n + 1, 12) = child.SelectSingleNode("External2").Text
        Next n
        sh.Cells(Rows.Count, "A").End(xlUp).Offset(1, 3).Resize(UBound(result, 1), UBound(result, 2)).Value = result
    End If
End Sub
cảm ơn bác ạ, code chạy đẹp rồi ạ :d
 
Web KT
Back
Top Bottom