【问题标题】:Export from datagridview to excel using XML in vb.net使用 vb.net 中的 XML 从 datagridview 导出到 excel
【发布时间】:2020-08-09 05:13:02
【问题描述】:

我正在尝试使用 XML 将数据从 datagridview 导出到 excel 文件。下面是我写的代码

    Dim fs As New IO.StreamWriter(FileName, False)

        With fs
            .WriteLine("<?xml version=""1.0""?>")
            .WriteLine("<?mso-application progid=""Excel.Sheet""?>")
            .WriteLine("<ss:Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet"">")
            .WriteLine("    <ss:Styles>")
            .WriteLine("        <ss:Style ss:ID=""1"">")
            .WriteLine("            <ss:Font ss:Bold=""1""/>")
            .WriteLine("        <ss:/Style>")
            .WriteLine("    <ss:Worksheet ss:Name=""WCRPaymentLog"">")
            .WriteLine("        <ss:Table>")


            For x As Integer = 0 To dgReport.Columns.Count - 1
                .WriteLine("            <ss:Column ss:Width=""{0}""/>", dgReport.Columns.Item(x).Width)
            Next
            .WriteLine("            <ss:Row ss:StyleID=""1"">")

            For x As Integer = 0 To dgReport.Columns.Count - 1
                .WriteLine("                <ss:Cell>")
                .WriteLine(String.Format("                  <ss:Data ss:Type=""String"">{0}</ss:Data>", dgReport.Columns.Item(x).HeaderText.Trim))
                .WriteLine("                </ss:Cell>")
            Next
            .WriteLine("            </ss:Row>")

            For intRow As Integer = 0 To dgReport.RowCount - 2
                .WriteLine(String.Format("          <ss:Row ss:Height=""{0}"">", dgReport.Rows(intRow).Height))

                For intCol As Integer = 0 To dgReport.Columns.Count - 1
                    .WriteLine("                <ss:Cell>")
                    .WriteLine(String.Format("                  <ss:Data ss:Type=""String"">{0}</ss:Data>", dgReport.Item(intCol, intRow).Value.ToString.Trim))
                    .WriteLine("                </ss:Cell>")
                Next
                .WriteLine("            </ss:Row>")
            Next

            .WriteLine("        </ss:Table>")
            .WriteLine("    </ss:Worksheet>")
            .WriteLine("</ss:Workbook>")
            .Close()
        End With

当我尝试运行此代码时,它可以正常执行,但是在打开生成的文件时,它会给出错误:Strict Parse Error。

错误日志生成如下: XML 解析错误:未定义的命名空间 在此元素堆栈或其下方发生错误: (堆栈为空——在顶级元素或顶级元素以下发生错误。)

如果我犯了错误,谁能帮帮我。

如果文件存在,我也想这样编码,然后它将在代码中添加一个新工作表并在该工作表中写入表格。谁能帮我知道怎么做,因为这段代码会覆盖现有文件。

【问题讨论】:

    标签: excel xml vb.net datagridview


    【解决方案1】:

    您似乎正在尝试创建 Excel 2003 SpreadsheetML 文件。

    您表示在 Excel 中打开文件时收到此错误

    XML PARSE ERROR: Undefined namespace Error发生在此元素堆栈处或以下:(堆栈为空--错误发生在顶级元素处或以下。)

    这将我引向这一行:

    .WriteLine("<ss:Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet"">")
    

    这里您使用的是命名空间别名“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">
    

    有关详细信息,请参阅:

    OfficeTalk: Dive into SpreadsheetML (Part 1 of 2)

    OfficeTalk: Dive into SpreadsheetML (Part 2 of 2)

    编辑:

    您可能还会发现使用 VB 的 Xml 文字是一种更简单的方式来构建文件。教程视频[How Do I:] Create Excel Spreadsheets using LINQ to XML?可能有利于复习。

    【讨论】:

      【解决方案2】:

      尝试使用 Xml Linq:

      Imports System.Xml
      Imports System.Xml.Linq
      Public Class Form1
          Const FILENAME As String = "c:\temp\test.xml"
          Sub New()
      
              ' This call is required by the designer.
              InitializeComponent()
      
              ' Add any initialization after the InitializeComponent() call.
      
          End Sub
      
          Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
              Dim xml As String = "<?xml version=""1.0""?><?mso-application progid=""Excel.Sheet""?><ss:Workbook xmlns:ss=""abc"" xmlns:urn=""schemas-microsoft-com:office:spreadsheet"">" & _
                  "<ss:Styles><ss:Style ss:ID=""1""><ss:Font ss:Bold=""1""/></ss:Style></ss:Styles ></ss:Workbook>"
      
              Dim doc As XDocument = XDocument.Parse(xml)
      
              Dim workbook As XElement = doc.Root
              Dim ssNs As XNamespace = workbook.GetNamespaceOfPrefix("ss")
      
              Dim worksheet = New XElement(ssNs + "Worksheet", New XAttribute(ssNs + "Name", "WCRPaymentLog"))
              workbook.Add(worksheet)
      
              Dim table = New XElement(ssNs + "table")
              worksheet.Add(table)
      
              For x As Integer = 0 To dgReport.Columns.Count - 1
                  Dim column As XElement = New XElement(ssNs + "Column", New XAttribute(ssNs + "Width", dgReport.Columns.Item(x).Width))
                  TAB()
              Next
      
              Dim row As XElement = New XElement(ssNs + "Row", New XAttribute(ssNs + "StyleID", 1))
              table.Add(row)
              Dim cell As XElement
              For x As Integer = 0 To dgReport.Columns.Count - 1
                  cell = New XElement(ssNs + "Cell", New XElement(ssNs + "Data", New Object() {New XAttribute("Type", "String"), dgReport.Columns.Item(x).HeaderText.Trim}))
                  row.Add(cell)
              Next
      
              For intRow As Integer = 0 To dgReport.RowCount - 2
                  row = New XElement(ssNs + "Row", New XAttribute(ssNs + "Height", dgReport.Rows(intRow).Height))
                  table.Add(row)
                  For intCol As Integer = 0 To dgReport.Columns.Count - 1
                      cell = New XElement(ssNs + "Cell", New Object() {New XAttribute("Type", "String"), dgReport.Item(intCol, intRow).Value.ToString.Trim})
                      row.Add(cell)
                  Next
              Next
      
              doc.Save(FILENAME)
      
          End Sub
      End Class
      

      【讨论】:

      • 谢谢!打开生成的文件时,我得到 3 个选项:作为 XML 表、作为只读工作簿和使用 XML 源任务窗格。我选择第一个选项。打开文件后,它只有表格中的标题和数据类型,而且太行而不是列,我错过了什么吗?
      • xml 文件是文本,因此您可以在记事本中打开。我刚刚复制了您的代码,并在标题中进行了一些更正以修复一些命名空间错误。您应该可以在记事本中查看数据是否在 xml 文件中。
      • XML 文件在记事本中打开时包含正确的数据,但在 Excel 中打开时不显示。我在这里错过了什么吗?还是我的excel有问题?我无法理解,请帮助。
      • 我对 Open Xml 格式不太熟悉。你有可以比较的例子吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      相关资源
      最近更新 更多