首页 > 解决方案 > 使用 vb.net 中的 XML 从 datagridview 导出到 excel

问题描述

我正在尝试使用 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 PARSE ERROR: Undefined namespace Error occurred at or below this element stack: (Stack is empty --error发生在顶级元素或以下。)

任何人都可以在我犯错的地方帮助我。

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

标签: excelxmlvb.netdatagridview

解决方案


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

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

XML 解析错误:未定义的命名空间错误发生在此元素堆栈处或以下:(堆栈为空 - 错误发生在顶级元素处或以下。)

这使我想到了这一行:

.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:深入了解 SpreadsheetML(第 1 部分,共 2 部分)

OfficeTalk:深入了解 SpreadsheetML(第 2 部分,共 2 部分)

编辑:

您可能还会发现使用 VB 的 Xml Literals 是一种更简单的构建文件的方法。教程视频[我如何:] 使用 LINQ to XML 创建 Excel 电子表格?可能有利于复习。


推荐阅读