Экспорт из datagridview в Excel, используя XML в vb.net - PullRequest
0 голосов
/ 25 апреля 2020

Я пытаюсь использовать XML для экспорта данных из таблицы данных в файл 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: Неопределенное пространство имен Ошибка возникает в или ниже стека этого элемента: (стек пуст - ошибка возникает в или ниже элемента верхнего уровня.)

Может Любой, пожалуйста, помогите мне, где я делаю ошибку.

Также я хочу кодировать таким образом, если файл существует, тогда он добавит новый лист в код и запишет таблицу на этом листе. Может кто-нибудь помочь мне узнать, как это сделать, потому что этот код перезаписывает существующий файл.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Похоже, что вы пытаетесь создать файл Excel 2003 SpreadsheetML.

Вы указали, что получили эту ошибку при открытии файла в Excel

XML PARSE 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: погружение в SpreadsheetML (часть 1 из 2)

OfficeTalk: погружение в SpreadsheetML (часть 2 из 2)

Редактирование:

Вы также можете найти использование VB's Xml Literal более простым способом построить файл. Учебное видео [Как я:] Создание таблиц Excel с использованием LINQ для XML? может оказаться полезным для обзора.

0 голосов
/ 25 апреля 2020

Попробуйте с 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
...