Powershell:如何通过 XmlTextWriter 创建一个空的 Excel 工作表-XML?
Powershell: How to create an empty Excel worksheet-XML via XmlTextWriter?
我目前正在编写一个 Powershell 代码来将一个非常大的 DataTable 导入到一个 Excel-File 中,而无需在该机器上安装 Excel。到目前为止一切都很好,只是我不知道如何通过 XmlTextWriter 创建 worksheet.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>
这是我目前为止拥有的该部分的 Powershell 代码:
# create the settings:
$settings = [System.Xml.XmlWriterSettings]::new()
$settings.Encoding = [System.Text.Encoding]::UTF8
$settings.Async = $true
# create the XML:
$sb = [System.Text.StringBuilder]::new()
$wr = [System.Xml.XmlTextWriter]::create($sb, $settings)
[void]$wr.WriteStartDocumentAsync($true)
[void]$wr.WriteStartElement("worksheet") #, "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
[void]$wr.WriteStartAttribute("r", "xmlns", "http://schemas.openxmlformats.org/2006/relationships")
[void]$wr.WriteStartElementAsync($null, "sheetdata", $null)
[void]$wr.WriteEndElementAsync()
[void]$wr.WriteEndElementAsync()
$wr.Flush()
# show result:
$sb.ToString()
但结果不是预期的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”-entry PLUS 相同元素的“xmlns:r”-entry
- 并非所有调用都running/are在异步模式下可用。
有人可以帮忙吗?
xmlns
和 xmlns:r
不是属性,它们是名称空间声明。
一个简单的 xmlns
设置默认命名空间(文档中没有特定命名空间的每个元素都会得到这个。)。 xmlns:xxx
形式的命名空间声明意味着文档中以 xxx
为前缀的每个元素都在此命名空间中。
文档 here 建议如何编写这些内容,如下所示:
//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>
我目前正在编写一个 Powershell 代码来将一个非常大的 DataTable 导入到一个 Excel-File 中,而无需在该机器上安装 Excel。到目前为止一切都很好,只是我不知道如何通过 XmlTextWriter 创建 worksheet.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>
这是我目前为止拥有的该部分的 Powershell 代码:
# create the settings:
$settings = [System.Xml.XmlWriterSettings]::new()
$settings.Encoding = [System.Text.Encoding]::UTF8
$settings.Async = $true
# create the XML:
$sb = [System.Text.StringBuilder]::new()
$wr = [System.Xml.XmlTextWriter]::create($sb, $settings)
[void]$wr.WriteStartDocumentAsync($true)
[void]$wr.WriteStartElement("worksheet") #, "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
[void]$wr.WriteStartAttribute("r", "xmlns", "http://schemas.openxmlformats.org/2006/relationships")
[void]$wr.WriteStartElementAsync($null, "sheetdata", $null)
[void]$wr.WriteEndElementAsync()
[void]$wr.WriteEndElementAsync()
$wr.Flush()
# show result:
$sb.ToString()
但结果不是预期的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”-entry PLUS 相同元素的“xmlns:r”-entry
- 并非所有调用都running/are在异步模式下可用。
有人可以帮忙吗?
xmlns
和 xmlns:r
不是属性,它们是名称空间声明。
一个简单的 xmlns
设置默认命名空间(文档中没有特定命名空间的每个元素都会得到这个。)。 xmlns:xxx
形式的命名空间声明意味着文档中以 xxx
为前缀的每个元素都在此命名空间中。
文档 here 建议如何编写这些内容,如下所示:
//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>