Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:如何通过XmlTextWriter创建空的Excel工作表XML?_Xml_Powershell_Asynchronous_Worksheet_Xmltextwriter - Fatal编程技术网

Powershell:如何通过XmlTextWriter创建空的Excel工作表XML?

Powershell:如何通过XmlTextWriter创建空的Excel工作表XML?,xml,powershell,asynchronous,worksheet,xmltextwriter,Xml,Powershell,Asynchronous,Worksheet,Xmltextwriter,我目前正在编写一个Powershell代码,以便将非常大的数据表导入Excel文件,而不必在该计算机上安装Excel。到目前为止一切都很好,只是我不知道如何通过XmlTextWriter创建sheet.xml结构 这是我需要通过XmlTextWriter创建的最后一个XML结构: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <worksheet xml

我目前正在编写一个Powershell代码,以便将非常大的数据表导入Excel文件,而不必在该计算机上安装Excel。到目前为止一切都很好,只是我不知道如何通过XmlTextWriter创建sheet.xml结构

这是我需要通过XmlTextWriter创建的最后一个XML结构:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" >
    <sheetData/>
</worksheet>
但结果不是预期的XML:

<?xml version="1.0" encoding="utf-16" standalone="yes"?><worksheet r:xmlns="" xmlns:r="http://schemas.openxmlformats.org/2006/relationships"><sheetdata /></worksheet>

  • 编码仍然是UTF-16而不是UTF-8
  • 我得到一个额外的“r:xmlns”-条目(?)
  • 我无法创建 同一元素的“xmlns”-条目加上“xmlns:r”-条目
  • 并非所有调用都在异步模式下运行/可用

  • 有人能帮忙吗?

    xmlns
    xmlns:r
    不是属性,而是名称空间声明

    普通的
    xmlns
    设置默认名称空间(文档中没有特定名称空间的每个元素都会获得此名称空间)。格式为
    xmlns:xxx
    的名称空间声明意味着文档中前缀为
    xxx
    的每个元素都在该名称空间中

    文档建议如何编写以下内容:

    //Write an element (this one is the root).
    writer.WriteStartElement("bookstore");
    
    //Write the namespace declaration.
    writer.WriteAttributeString("xmlns", "bk", null, "urn:samples");
    
    writer.WriteStartElement("book");
    
    编码采用UTF-16,因为您正在将XML写入StringBuilder(而C#在后台使用UTF-16字符串)。如果将其写入流,默认情况下应启用UTF-8

    $stream = [System.IO.File]::create("output.xml")
    $wr = [System.Xml.XmlTextWriter]::create([System.IO.StreamWriter]::new($stream), $settings)
    

    不要忘记在结尾关闭流:
    $stream.close()

    这是我根据wasmachien的输入得出的最后一个代码:

    # create the settings:
    $settings = [System.Xml.XmlWriterSettings]::new()
    $settings.Encoding = [System.Text.Encoding]::UTF8
    $settings.Indent = $true
    $settings.Async  = $true
    
    # the XmlWriter MUST be based on a stream to allow custom encodings:
    $stream = [System.IO.MemoryStream]::new()
    $writer = [System.Xml.XmlTextWriter]::create($stream, $settings)
    
    # create the XML:
    [void]$writer.WriteStartDocumentAsync($true)
    [void]$writer.WriteStartElementAsync($null, "worksheet", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
    [void]$writer.WriteAttributeStringAsync("xmlns", "r", $null, "http://schemas.openxmlformats.org/2006/relationships")
    [void]$writer.WriteStartElementAsync($null, "sheetdata", $null)
    [void]$writer.WriteEndElementAsync()
    [void]$writer.WriteEndElementAsync()
    [void]$writer.WriteEndDocumentAsync()
    [void]$writer.Flush()
    
    # show result:
    cls
    $utf8 = [System.Text.Encoding]::UTF8
    $utf8.GetString($stream.ToArray())
    $stream.Dispose()
    
    以下是输出:

    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <worksheet xmlns:r="http://schemas.openxmlformats.org/2006/relationships" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
      <sheetdata xmlns="" />
    </worksheet>
    
    
    
    剩下的问题是由于位于默认名称空间()中,而不在任何名称空间中造成的。尝试将相同的名称空间添加到。谢谢,但我想我必须接受额外的条目。否则,我必须对以下所有子节点(数千行)执行相同的操作,因为性能原因,我希望避免使用这些子节点。
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <worksheet xmlns:r="http://schemas.openxmlformats.org/2006/relationships" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
      <sheetdata xmlns="" />
    </worksheet>