1

我有复杂的 XSD。在 excel 开发人员中,在 XML 部分中,我可以单击“源”并将 XSD 添加到数据源映射,然后将节点映射到特定的单元格、行等。

然后我可以按预期输入数据并导出 XML,很好。当我重新打开保存的 XLS 时,发生了一些奇怪的事情,excel 说我的 XML 映射已损坏并要求删除损坏的映射并显示他认为错误的一个节点。但是所有选项都是灰色的,我发现的唯一选项是通过 VBA 删除地图,

ActiveWorkbook.XmlMaps("JPK_mapa").Delete

但是当地图被删除时,所有映射都消失了,我必须再次添加地图并手动完成所有映射。这对我来说并不难,但普通用户可能会遇到问题,我只想给他们 XLS 来填充数据。

我无法更改 XSD,对其内容没有影响,所以我认为我必须忍受它并以某种方式教 excel 在自动启动时删除并再次添加此映射。由于有很多映射,并且只需在 excel 中单击几下,我很乐意将其记录为宏。但是当我打开记录时,它不会记录我所做的映射。

Q1:有什么方法可以记录映射生成吗?或者有没有办法以某种方式自动化这个过程?

我还发现了有趣的事情。如果我将地图损坏的 xlsx 作为 zip 打开并从中删除 xmlMaps.xml,再次打开 xls 后我可以打开 XML 数据源,当我添加我的 xsd 时,所有映射都会恢复并正确绑定到 xls 中的单元格(标记为粗体在附图中)。这导致我提出问题2。

Q2:有没有办法可以删除 VBA 中的映射,当再次添加时它会记住映射?

希望您能给我一些建议,谢谢。

XSD 的一部分

4

1 回答 1

1

我找到了问题的解决方案。不完全是我预期的方式,但工作正常。我所做的是在打开 excel 文件时重建地图。我将字段映射保存到单独的隐藏工作表中的架构,当文件打开时,我删除旧架构,添加新架构并添加映射。该过程对用户是透明的。

    Private Sub Auto_Open()
        Dim myMap As XmlMap

        ActiveWorkbook.XmlMaps(1).Delete
        Set myMap = ActiveWorkbook.XmlMaps.Add(Application.ActiveWorkbook.Path & "\JPK_VAT2v1-0.xsd", "JPK")
        myMap.Name = "JPK_mapa"



     A = True
     row = 1
     While A
        If (Worksheets("Maps").Range("A" & row).Value <> "") Then

            mySheet = Worksheets("Maps").Range("A" & row).Value
            mycell = Worksheets("Maps").Range("B" & row).Value
            myXpath = Worksheets("Maps").Range("D" & row).Value
            ret = Worksheets(mySheet).Range(mycell).XPath.SetValue(myMap, myXpath)
            row = row + 1

        Else
            A = False
        End If
     Wend
     End Sub

地图工作表如下所示:

    ColA    ColB    ColC        ColD

    Start   $B$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:KodFormularza
    Start   $C$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:KodFormularza/@kodSystemowy
    Start   $D$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:KodFormularza/@wersjaSchemy
    Start   $E$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:WariantFormularza
    Start   $F$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:CelZlozenia
    Start   $G$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:DataWytworzeniaJPK
    Start   $H$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:DataOd
    Start   $I$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:DataDo
    Start   $J$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:DomyslnyKodWaluty
    Start   $K$2    JPK_mapa    /ns1:JPK/ns1:Naglowek/ns1:KodUrzedu
    Start   $B$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:IdentyfikatorPodmiotu/ns2:NIP
    Start   $C$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:IdentyfikatorPodmiotu/ns2:PelnaNazwa
    Start   $D$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:IdentyfikatorPodmiotu/ns2:REGON
    Start   $E$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:KodKraju
    Start   $F$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Wojewodztwo
    Start   $G$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Powiat
    Start   $H$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Gmina
    Start   $I$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Ulica
    Start   $J$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:NrDomu
    Start   $K$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:NrLokalu
    Start   $L$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Miejscowosc
    Start   $M$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:KodPocztowy
    Start   $N$5    JPK_mapa    /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Poczta
    Sprzedaz    $B$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/@typ
    Sprzedaz    $C$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:LpSprzedazy
    Sprzedaz    $D$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:NrKontrahenta
    Sprzedaz    $E$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:NazwaKontrahenta
    Sprzedaz    $F$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:AdresKontrahenta
    Sprzedaz    $G$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:DowodSprzedazy
    Sprzedaz    $H$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:DataWystawienia
    Sprzedaz    $I$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:DataSprzedazy
    Sprzedaz    $J$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_10
    Sprzedaz    $K$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_11
    Sprzedaz    $L$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_12
    Sprzedaz    $M$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_13
    Sprzedaz    $N$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_14
    Sprzedaz    $O$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_15
    Sprzedaz    $P$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_16
    Sprzedaz    $Q$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_17
    Sprzedaz    $R$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_18
    Sprzedaz    $S$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_19
    Sprzedaz    $T$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_20
    Sprzedaz    $U$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_21
    Sprzedaz    $V$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_22
    Sprzedaz    $W$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_23
    Sprzedaz    $X$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_24
    Sprzedaz    $Y$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_25
    Sprzedaz    $Z$1    JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_26
    Sprzedaz    $AA$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_27
    Sprzedaz    $AB$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_28
    Sprzedaz    $AC$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_29
    Sprzedaz    $AD$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_30
    Sprzedaz    $AE$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_31
    Sprzedaz    $AF$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_32
    Sprzedaz    $AG$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_33
    Sprzedaz    $AH$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_34
    Sprzedaz    $AI$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_35
    Sprzedaz    $AJ$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_36
    Sprzedaz    $AK$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_37
    Sprzedaz    $AL$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_38
    Sprzedaz    $AM$1   JPK_mapa    /ns1:JPK/ns1:SprzedazWiersz/ns1:K_39
    SprzedazCTRL    $B$2    JPK_mapa    /ns1:JPK/ns1:SprzedazCtrl/ns1:LiczbaWierszySprzedazy
    SprzedazCTRL    $C$2    JPK_mapa    /ns1:JPK/ns1:SprzedazCtrl/ns1:PodatekNalezny
    Zakup   $B$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/@typ
    Zakup   $C$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:LpZakupu
    Zakup   $D$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:NrDostawcy
    Zakup   $E$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:NazwaDostawcy
    Zakup   $F$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:AdresDostawcy
    Zakup   $G$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:DowodZakupu
    Zakup   $H$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:DataZakupu
    Zakup   $I$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:DataWplywu
    Zakup   $J$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_43
    Zakup   $K$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_44
    Zakup   $L$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_45
    Zakup   $M$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_46
    Zakup   $N$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_47
    Zakup   $O$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_48
    Zakup   $P$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_49
    Zakup   $Q$1    JPK_mapa    /ns1:JPK/ns1:ZakupWiersz/ns1:K_50
    ZakupCTRL   $B$2    JPK_mapa    /ns1:JPK/ns1:ZakupCtrl/ns1:LiczbaWierszyZakupow
    ZakupCTRL   $C$2    JPK_mapa    /ns1:JPK/ns1:ZakupCtrl/ns1:PodatekNaliczony

我还编写了一个小函数来根据实际映射的内容制作地图工作表,因此我不必手动编写地图工作表的内容。这是基于我在我的 excel 文件和工作表中存储映射字段的方式,但我认为它应该对如何实现这一点有所了解,也许有人觉得它很有用:-) 所以,当我更改一些映射时,我只是运行手动 makeMap 函数并生成 Maps 工作表。

    Sub makeMap()
        mapRow = store("Start", 2, 1)
        mapRow = store("Start", 5, mapRow)
        mapRow = store("Sprzedaz", 1, mapRow)
        mapRow = store("SprzedazCTRL", 2, mapRow)
        mapRow = store("Zakup", 1, mapRow)
        mapRow = store("ZakupCTRL", 2, mapRow)
    End Sub

    Function store(Sh As String, row As Integer, ByVal mapRow As Integer) As Integer


        Dim mySheet As Worksheet
        Set mySheet = Worksheets(Sh)


        myRow = row
        mycell = ""

        For cols = 2 To 50
        hasXpath = mySheet.Cells(row, cols).XPath

        If Not hasXpath = Empty Then

            Worksheets("Maps").Range("A" & mapRow).Value = Sh
            Worksheets("Maps").Range("B" & mapRow).Value = mySheet.Cells(row, cols).Address
            Worksheets("Maps").Range("C" & mapRow).Value = mySheet.Cells(row, cols).XPath.Map
            Worksheets("Maps").Range("D" & mapRow).Value = mySheet.Cells(row, cols).XPath
            mapRow = mapRow + 1
       End If



       Next cols
       store = mapRow
    End Function
于 2017-05-02T21:35:54.470 回答