Convert XML to Excel

Trạng thái
Không mở trả lời sau này.
tôi muốn cover XML sang excel, tôi phải học từ đâu ạ
========================
Admin tuhocvba:
Chúng tôi đã đạt được thỏa thuận code, sau đây kính mời các thành viên không liên quan hãy ngừng tham gia thảo luận topic này.
 

tuhocvba

Administrator
Thành viên BQT
Bạn upload file xml của bạn lên google drive, để public, kéo link về đây anh em xem sao.
 

hocexcel

Yêu THVBA
Thử tìm kiếm từ khóa: xml to excel
trang web cho bạn:
 

tuhocvba

Administrator
Thành viên BQT
OK. Đã download được file của bạn.
XML này lấy từ đâu vậy bạn? Dữ liệu thời khóa biểu gốc như thế nào vậy bạn, có thể chia sẻ hình ảnh để mình dễ hình dung được không?
Định dạng output như thế này có được không?
Bạn cần đăng nhập để thấy hình ảnh

Cách upload hình lên diễn đàn, bạn tham khảo:
 

Euler

Administrator
Thành viên BQT
Thử convert XML qua Excel bằng web mà các bạn nêu ở trên thì được file Excel định dạng như này:
Bạn cần đăng nhập để thấy hình ảnh

Đây có lẽ là định dạng output mà bạn muốn.
Web cho chuyển đổi 10 lần / ngày (như bạn nói) , như thế chưa đủ dùng hay sao?

Bất cứ một công việc nào đều sẽ làm phát sinh thời gian. Cho nên trước khi tiến hành cần phán đoán nó có thực sự cần thiết hay không. Nếu như có công cụ miễn phí hỗ trợ tốt rồi thì mất công code làm gì nữa.
Trong trường hợp bạn vẫn muốn thực hiện dự án này, mức phí đề xuất là 800k. Nếu bạn đồng ý, chúng tôi sẽ tiến hành làm dự án này.
 

Mật vụ FBI

Yêu THVBA
@Ngô Minh Ngọc

Cần gì viết code, bạn cứ mở excel lên và open file xml là OK thôi. File bạn mình đã mở như , bạn tham khảo.

* Ảnh demo

Bạn cần đăng nhập để thấy hình ảnh
 

tuhocvba

Administrator
Thành viên BQT
Chúng tôi đã đạt được thỏa thuận code, sau đây kính mời các thành viên không liên quan hãy ngừng tham gia thảo luận topic này.
1. Bên yêu cầu gửi trước một nửa tiền
(đã gửi). <Hiện tại tài khoản mình báo biến động số dư 300k>
Số tiền còn lại sẽ được chuyển sau khi THVBA hoàn thành demo.
Bên yêu cầu sẽ có 1 tuần chạy thử Tool và đưa ra phản hồi chỉnh sửa nếu cần thiết.

2.Input của Tool là file csv.
Bạn cần đăng nhập để thấy hình ảnh

Chú ý định dạng file rất quan trọng, đặc biệt là vị trí cột dữ liệu, tiêu đề cột dữ liệu.
Theo như bạn nói, file này là phần mềm xuất ra, nên chúng tôi hiểu định dạng này là cố định.
Tên các cột dữ liệu, vị trí các cột dữ liệu:
Bạn cần đăng nhập để thấy hình ảnh

3.Output của Tool là file Excel, gồm 3 file.
Output 1 (file name: ChiTiet)
Bạn cần đăng nhập để thấy hình ảnh

Output 2 (file name: ThoiKhoaBieu)
Bạn cần đăng nhập để thấy hình ảnh

Output 3 (file name: HocSinh)
Bạn cần đăng nhập để thấy hình ảnh

Câu hỏi:
Dựa vào thông tin input không có các tiết như chào cờ và sinh hoạt.
Nên không biết thông tin này sẽ được lấy ở đâu khi xây dựng thời khóa biểu?

Yêu cầu:
Dựa theo các file bạn đưa, gồm input và output, tôi tổng hợp ở đây. Bạn hãy kiểm tra lại, phòng trường hợp tôi hiểu sai thông tin.
Nếu có vấn đề gì xin hãy phản hồi lại trong topic này.
 

Euler

Administrator
Thành viên BQT
Bài toán này thì với @NhanSu sẽ có nhiều kinh nghiệm xử lý bằng ADO.
Đối với office 2019, đọc file csv này không có vấn đề gì, nhưng với office đời cũ hơn chắc sẽ có vấn đề về hiển thị dữ liệu.
Đối với việc trích xuất csv, lựa chọn tốt nhất có lẽ là ADO. Nếu thuần thục cấu trúc lệnh SQL thì chắc sẽ có lời giải đẹp. Nhưng với dữ liệu thời khóa biểu này, số lượng dòng dữ liệu khó có thể lên tới chục ngàn, nên Euler nghĩ có thể đọc thuần túy ra mảng rồi dùng Dictionary xử lý tiếp.

Về ADO sẽ có hai hướng là ADO stream. Hướng này nhiều tài liệu hướng dẫn xử lý đọc UTF-8.
Nhưng nếu đi theo hướng ADO recordset, thì sẽ ít tài liệu hơn. Euler sẽ lựa chọn hướng đi này để có thêm kinh nghiệm.
Nếu xử lý theo đúng giáo trình thì đọc ra cái output như này:
Bạn cần đăng nhập để thấy hình ảnh

Mã:
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" _
            & "Data Source=" & TARGET_FOLDER & ";" _
            & "Extended Properties=""Text;" _
            & "HDR=No;" _
            & "FMT=Delimited"""
Nguồn:
Euler sửa code thành:
Mã:
"FMT=Delimited;CharacterSet=65001'"""
Kết quả vẫn vậy, hiển thị vẫn tùm lum.
Xóa dấu nháy đơn ở cuối đi coi sao:

Mã:
"FMT=Delimited;CharacterSet=65001"""
Chạy code coi xem đọc csv ra gì nào:
Bạn cần đăng nhập để thấy hình ảnh

Kết quả đã đẹp rồi.
Tham khảo:
Mã:
[filename.csv]     <----     読み込むCSVファイル名を[ ]で括る
Format=CSVDelimited     <----     フォーマット形式指定
CharacterSet=65001     <----     文字コードをUTF-8(65001)に指定   
MaxScanRows=0     <----     読み込む行数を制限(0は制限なし)
ColNameHeader=True     <----     1行目をフィールド名とする
Nguồn:
 

NhanSu

SMod
Thành viên BQT
Bạn cần đăng nhập để thấy hình ảnh

Mình làm bằng ADO, output 1 thì được. Output 2 cũng được nhưng kết quả xấu do các lớp sắp xếp thứ tự text 10A1 - 10A10 - 10A11 - 10A2, có thể chèn dòng chào cờ và sắp xếp lại thứ tự cột bằng VBA.

Bạn cần đăng nhập để thấy hình ảnh
 

tuhocvba

Administrator
Thành viên BQT
Input đầu vào chủ thớt mới cập nhật, trong đó có các tiết chào cờ, sinh hoạt.
FIle input mình post lên lúc đó chưa có mấy tiết này.
Tạm thời đã ra output thứ nhất.
Bạn cần đăng nhập để thấy hình ảnh

Mình tính để 3 output vào 3 sheet trên cùng một file, cho tiện xử lý, mà như thế người dùng cũng dễ quan sát.
Output thứ nhất, mình sử dụng cả ADO và dict. Chắc là NhanSu sẽ có xử lý ADO khéo hơn mình.
 

NhanSu

SMod
Thành viên BQT
@tuhocvba chuỗi kết nối và sql mình sử dụng ở output thứ nhất là (mình dùng input cũ, ouput 2 cũng tương tự):
PHP:
s = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " & ThisWorkbook.Path & "; Extended Properties = ""text;HDR=Yes;FMT=Delimited;CharacterSet=65001"""
s = "TRANSFORM First(F5) SELECT F2, F3 FROM Tkb_t29.csv GROUP BY F2,F3 PIVOT F6
Kết nối với file csv này khó chịu ở chỗ chọn HDR=YES mà nó vẫn không lấy được tên cột.
 

tuhocvba

Administrator
Thành viên BQT
Không cần tên cột, mình tự ghi vào cũng được.
Cái vấn đề tên lớp xếp linh tinh như @NhanSu nói. Mình định xử lý bằng hàm tự tạo:
Mã:
rs.Open "SELECT Lop,hieuchinhso(Lop) FROM [" & sh1 & "$] GROUP BY Lop ORDER BY hieuchinhso(Lop) ASC", cn
Mã:
'Input: 11A6
'Output: 11
'Input: 10A5
'Output: 10
Function tachlayso1(ByVal s As String)
    Dim s2 As String, kq As String, i As Long, tmp As String
    s2 = Replace(s, " ", "", , , vbTextCompare)
    tachlayso1 = ""
    If s2 = "" Then Exit Function
    For i = 1 To Len(s2) Step 1
        tmp = Mid(s2, i, 1)
        If IsNumeric(tmp) Then
            kq = kq & tmp
        Else
            Exit For
        End If
    Next i
        tachlayso1 = kq
End Function

'Input: 10A6
'Output: 1006
Function hieuchinhso(ByVal s As String)
    Dim s1 As String
    Dim s2  As String
    s1 = tachlayso1(s)
    s2 = tachlayso(s)
    If Len(s1) = 1 Then s1 = "0" & s1
    If Len(s2) = 1 Then s2 = "0" & s2
    hieuchinhso = s1 & s2
End Function
Mà nó đang báo là hàm hieuchinhso chưa được định nghĩa =,=
 

Euler

Administrator
Thành viên BQT
Để đơn giản thì ta xây dựng ngay cột phụ khi lấy dữ liệu csv đưa vào sheet input.
Bạn cần đăng nhập để thấy hình ảnh
 
Trạng thái
Không mở trả lời sau này.
Top