2009-06-28 13 views
6

मैं एक एक्सएमएल फ़ाइल में संग्रहीत टैब्यूलर डेटा को संपादित करने के लिए एमएस एक्सेल 2007 का उपयोग कर प्रयोग कर रहा हूं। यह स्कीमा (xsd फ़ाइल) के विरुद्ध एक्सएमएल डेटा आयात करने और यहां तक ​​कि वैध करने का भी अच्छा काम करता है, लेकिन जब मैं निर्यात करता हूं, तो यह xmlns, xlmns: xsi, और xsi: रूट तत्व से schemaLocation विशेषताएँ छोड़ देता है। यह डिफ़ॉल्ट नेमस्पेस को एक स्पष्ट नामस्थान में भी बदल देता है।क्या एक्सेल को मूल तत्व में एक्सएमएल विशेषताओं को संरक्षित करने का कोई तरीका है?

यहाँ एक से पहले है/तुलना के बाद:

से पहले (एक्सेल से निर्यात के बाद एक्सएमएल फ़ाइल)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<database 
    xmlns="experimentManager" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="experimentManager Database.xsd"> 
    <conditionTokens> 
    ... 
    </conditionTokens> 
    <participants> 
    ... 
    </participants> 
</database> 

(एक्सेल में आयात करने से पहले एक्सएमएल फ़ाइल) के बाद

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns1:database xmlns:ns1="experimentManager"> 
    <ns1:conditionTokens> 
     ... 
    </ns1:conditionTokens> 
    <ns1:participants> 
     ... 
    </ns1:participants> 
</ns1:database> 

एक्सेल को इन विशेषताओं और गड़बड़ी को अलग करने से रोकने का कोई तरीका है नामस्थान के साथ? मैंने एक्सएमएल मैपिंग और आयात/निर्यात पर एमएस सहायता पढ़ी है, लेकिन जीयूआई में जो भी करना है, उसके लिए कोई सेटिंग नहीं प्रतीत होती है। अगर मुझे कस्टम मैक्रो लिखना है, तो यह एक संभावना है, लेकिन अगर बेहतर/आसान तरीका है तो मैं ऐसा नहीं करूँगा।

एक दूसरा प्रश्न: क्या एक्सेल-जैसी यूआई का उपयोग कर एक्सएमएल फाइलों के कुछ हिस्सों के आसान संपादन की इजाजत देने के लिए एक बेहतर टूल है?

+0

ध्यान दें कि एक्सेल नामस्थान बदल नहीं रहा है। यह केवल 'xsi: schemaLocation' को छोड़ रहा है और फिर अप्रयुक्त' xsi' नेमस्पेस को हटा रहा है। –

उत्तर

3

ठीक है, ठीक है, मैंने बुलेट को थोड़ा सा लिखा और एक अच्छा ओएल 'वीबीए मैक्रो लिखा। मैंने सोचा कि अगर मैं किसी और समस्या को चलाता हूं तो मैं इसे आपके साथ साझा करूंगा।

यह मैक्रो मूल रूप से एक्सेल की अंतर्निर्मित XML निर्यात() विधि को कॉल करता है तो परिणामस्वरूप फ़ाइल पर टेक्स्ट प्रतिस्थापन की एक श्रृंखला करता है। टेक्स्ट प्रतिस्थापन पूरी तरह से आपके ऊपर हैं। बस उन्हें नीचे दिए गए लिंक में से एक की तरह किसी कार्यपत्रक में जगह ...

कैसे स्थापित करने के लिए का एक उदाहरण "नियम की जगह": Click me for screen cap

इस उदाहरण में, मैं टैब अंतरिक्ष खाली स्थान बना दिया , "ns1" रिक्त के साथ, "ns1:" रिक्त के साथ, और मूल रूट तत्व के साथ छीनने वाले रूट तत्व।

आप अपने को फ़ॉर्मेट नियम आप की तरह किसी भी तरह से बदल सकते हैं बस के रूप में जब तक आप इन निर्देशों का पालन:

  1. सभी कोशिकाओं "क्या लगता है" और उन्हें नाम * "FindWhat" देने का चयन करें (डॉन ' टी में आपके चयन में शीर्षक पंक्ति शामिल नहीं है; रिक्त स्थान को अनदेखा कर दिया जाएगा)।
  2. सभी "कोशिकाओं के साथ प्रतिस्थापित करें" का चयन करें और उन्हें नाम "रीप्लेसविथ" दें (वहां "क्या ढूंढें" और "प्रतिस्थापित करें" कोशिकाओं के बीच एक-से-एक मैपिंग होना चाहिए; अवांछित टेक्स्ट को हटाने के लिए रिक्त स्थान का उपयोग करें)।
  3. अपनी कार्यपुस्तिका में कहीं भी XML मानचित्र का नाम दर्ज करें, और उस सेल को "XmlMap" नाम दें।
  4. मैक्रो चलाएं। (आपको उस फ़ाइल को निर्दिष्ट करने के लिए कहा जाएगा जिसे आप निर्यात करना चाहते हैं।)

* यदि आप एक्सेल 2007 में नामकरण श्रेणियों से अपरिचित हैं, तो फॉर्मूला टैब पर क्लिक करें और नाम प्रबंधक चुनें।

ठीक है, मैं अब आपको रहस्य में नहीं रखूंगा (एलओएल) ... यहां मैक्रो के लिए कोड है। बस इसे वीबीए संपादक में मॉड्यूल में रखें।मैं इस मुफ्त कोड के साथ कोई गारंटी नहीं देता हूं (यदि आप श्रेणियों को सही तरीके से नाम नहीं देते हैं तो आप आसानी से इसे तोड़ सकते हैं), लेकिन मेरे द्वारा किए गए दो उदाहरणों ने मेरे लिए काम किया है।

Option Explicit 

Sub ExportXml() 
    Dim exportResult As XlXmlExportResult 
    Dim exportPath As String 
    Dim xmlMap As String 
    Dim fileContents As String 
    exportPath = RequestExportPath() 
    If exportPath = "" Or exportPath = "False" Then Exit Sub 
    xmlMap = range("XmlMap") 
    exportResult = ActiveWorkbook.XmlMaps(xmlMap).Export(exportPath, True) 
    If exportResult = xlXmlExportValidationFailed Then 
     Beep 
     Exit Sub 
    End If 
    fileContents = ReadInTextFile(exportPath) 
    fileContents = ApplyReplaceRules(fileContents) 
    WriteTextToFile exportPath, fileContents 
End Sub 

Function ApplyReplaceRules(fileContents As String) As String 
    Dim replaceWorksheet As Worksheet 
    Dim findWhatRange As range 
    Dim replaceWithRange As range 
    Dim findWhat As String 
    Dim replaceWith As String 
    Dim cell As Integer 
    Set findWhatRange = range("FindWhat") 
    Set replaceWithRange = range("ReplaceWith") 
    For cell = 1 To findWhatRange.Cells.Count 
     findWhat = findWhatRange.Cells(cell) 
     If findWhat <> "" Then 
      replaceWith = replaceWithRange.Cells(cell) 
      fileContents = Replace(fileContents, findWhat, replaceWith) 
     End If 
    Next cell 
    ApplyReplaceRules = fileContents 
End Function 

Function RequestExportPath() As String 
    Dim messageBoxResult As VbMsgBoxResult 
    Dim exportPath As String 
    Dim message As String 
    message = "The file already exists. Do you want to replace it?" 
    Do While True 
     exportPath = Application.GetSaveAsFilename("", "XML Files (*.xml),*.xml") 
     If exportPath = "False" Then Exit Do 
     If Not FileExists(exportPath) Then Exit Do 
     messageBoxResult = MsgBox(message, vbYesNo, "File Exists") 
     If messageBoxResult = vbYes Then Exit Do 
    Loop 
    RequestExportPath = exportPath 
End Function 

Function FileExists(path As String) As Boolean 
    Dim fileSystemObject 
    Set fileSystemObject = CreateObject("Scripting.FileSystemObject") 
    FileExists = fileSystemObject.FileExists(path) 
End Function 

Function ReadInTextFile(path As String) As String 
    Dim fileSystemObject 
    Dim textStream 
    Dim fileContents As String 
    Dim line As String 
    Set fileSystemObject = CreateObject("Scripting.FileSystemObject") 
    Set textStream = fileSystemObject.OpenTextFile(path) 
    fileContents = textStream.ReadAll 
    textStream.Close 
    ReadInTextFile = fileContents 
End Function 

Sub WriteTextToFile(path As String, fileContents As String) 
    Dim fileSystemObject 
    Dim textStream 
    Set fileSystemObject = CreateObject("Scripting.FileSystemObject") 
    Set textStream = fileSystemObject.CreateTextFile(path, True) 
    textStream.Write fileContents 
    textStream.Close 
End Sub 
0

दरअसल, यह उससे बहुत आसान है।

  1. बदलें .xlsx प्रत्यय .zip के लिए - xlsx प्रारूप वास्तव में xml फ़ाइलें ज़िप की है!
  2. ओपन xl उप-निर्देशिका
  3. कॉपी xmlMaps.xml.zip फ़ोल्डर
  4. संपादित फ़ाइल अपना पसंदीदा नाम स्थान के साथ nsX: प्रविष्टियों को बदलने के लिए बाहर किसी स्थान पर फाइल करने के लिए Windows Explorer
  5. ब्राउज़ में ज़िप फ़ाइल और अपने परिवर्तनों को बचाओ।
  6. फाइल कॉपी और .zip फ़ोल्डर
  7. में संस्करण को ओवरराइट फ़ोल्डर .xslx

वापस करने के लिए का नाम बदलें अब अपने xml नक्शा (रों) अपना पसंदीदा नामस्थान दिखाएगा।

संबंधित मुद्दे

 संबंधित मुद्दे