【问题标题】:How do you save an **EXCEL** XML file with linq?如何使用 linq 保存 **EXCEL** XML 文件?
【发布时间】:2012-08-14 04:42:20
【问题描述】:

我正在使用 XElement 加载和保存 Excel XML 文件,其中包含以下内容:

    Dim root As XElement = XElement.Load(inFile)
    'code to change elements goes here 
    root.Save(outFile)

问题在于 Save 例程正在添加命名空间标记以及谁知道什么,因此 Excel 和 windows 不再将其识别为 Excel XML 文件。在我的示例中,我什至没有操作元素。我只是加载和保存文件。我基本上想使用 linq 在 XML 中查找某些元素,更改它们然后保存整个文件。我是不是太难了?

inFile XML

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
  <Worksheet ss:Name="Datagrid">
    <Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="11" x:FullColumns="1"
     x:FullRows="1" ss:DefaultRowHeight="15">
      <Row ss:Index="3" ss:AutoFitHeight="0">
        <Cell ecProperty="email_address">
          <Data ss:Type="String">email address</Data>
        </Cell>
      </Row>
      <Row ss:Index="4" ss:AutoFitHeight="0">
        <Cell ecProperty="synthesis_mode">
          <Data ss:Type="String">Ideal Mode</Data>
        </Cell>
      </Row>
    </Table>
  </Worksheet>
</Workbook>

输出文件结果

<?xml version="1.0" encoding="utf-8"?>
<ss:Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
  <ss:Worksheet ss:Name="Datagrid">
    <ss:Table ss:ExpandedColumnCount="13" ss:ExpandedRowCount="11" x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="15">
      <ss:Row ss:Index="3" ss:AutoFitHeight="0">
        <ss:Cell ecProperty="email_address">
          <ss:Data ss:Type="String">email address</ss:Data>
        </ss:Cell>
      </ss:Row>
      <ss:Row ss:Index="4" ss:AutoFitHeight="0">
        <ss:Cell ecProperty="synthesis_mode">
          <ss:Data ss:Type="String">Ideal Mode</ss:Data>
        </ss:Cell>
      </ss:Row>
    </ss:Table>
  </ss:Worksheet>
</ss:Workbook>

【问题讨论】:

  • 当默认命名空间也在前缀中定义时,这似乎是一个陷阱......
  • 问题是 没有被保存。如果我手动添加,我会得到想要的结果

标签: xml vb.net linq excel


【解决方案1】:

使用XDocument 而不是XElement 来保留完整的文档。

Dim root As XDocument = XDocument.Load(inFile)
'code to change elements goes here 
root.Save(outFile)

【讨论】:

  • 恐怕我没关注你。
  • 成功了!我会将其标记为正确,但你知道为什么(或如何防止 ss: 命名空间在保存时被添加?
  • 原因很简单:XElement 不存储周围的节点,而只存储一个元素和 inside 的所有内容。 XDocument 存储完整的文档,包括任何 XML 声明、注释、处理指令等节点。但是,我没有命名空间前缀陷阱的解决方案,这似乎是由于用作默认命名空间的命名空间被重新声明为前缀并且它只使用前缀的事实引起的。但是,由于需要前缀的属性,因此无法删除前缀。
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2019-11-30
  • 2017-05-29
  • 2011-09-13
  • 1970-01-01
相关资源
最近更新 更多