Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 843

Вопрос по коду из FAQ: Экспорт DataGridView в Excel (без установленного офиса) или HTML

16.09.2020, 16:48. Показов 1853. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос вынесен из FAQ
Готовые решения и полезные коды на Visual Basic .NET (Часть-1)


PAnT0P, Что-то нормальный файл не создается вот скрин
Миниатюры
Вопрос по коду из FAQ: Экспорт DataGridView в Excel (без установленного офиса) или HTML  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.09.2020, 16:48
Ответы с готовыми решениями:

Работа с excel без установленного Офиса
Доброго времени суток. Подскажите пожалуйста библиотеку для работы с excel ( экспорт данных в xls файлы) без установленного офиса. Хорошо...

Экспорт datagridview в excel без скрытых столбцов
Вот так делаю экспорт в Excel без скрытых столбцов. var ws = wb.Worksheets.Item as Worksheet; for (int i = 0; i...

Возможно ли использование Variant Excel, Book, Sheet без установленного Excel?
Можно ли сделать как написано в названии?

34
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
19.09.2020, 02:32
Студворк — интернет-сервис помощи студентам
Класс записи DataSet в файл XLS.
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
Imports System
Imports System.IO
Imports System.Text
 
Class ExcelXMLExportHelper
    Private Shared Function getXMLWorkbookTemplate() As String
        Dim sb As StringBuilder = New StringBuilder(818)
        sb.AppendFormat("<?xml version=""1.0""?>{0}", Environment.NewLine)
        sb.AppendFormat("<?mso-application progid=""Excel.Sheet""?>{0}", Environment.NewLine)
        sb.AppendFormat("<Workbook xmlns=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine)
        sb.AppendFormat(" xmlns:o=""urn:schemas-microsoft-com:office:office""{0}", Environment.NewLine)
        sb.AppendFormat(" xmlns:x=""urn:schemas-microsoft-com:office:excel""{0}", Environment.NewLine)
        sb.AppendFormat(" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet""{0}", Environment.NewLine)
        sb.AppendFormat(" xmlns:html=""http://www.w3.org/TR/REC-html40"">{0}", Environment.NewLine)
        sb.AppendFormat(" <ss:Styles>{0}", Environment.NewLine)
        sb.AppendFormat("  <ss:Style ss:ID=""Default"" ss:Name=""Normal"">{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Alignment ss:Vertical=""Bottom""/>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""/>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Interior/>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:NumberFormat/>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Protection/>{0}", Environment.NewLine)
        sb.AppendFormat("  </ss:Style>{0}", Environment.NewLine)
        sb.AppendFormat("  <ss:Style ss:ID=""s62"">{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Borders>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   </ss:Borders>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Font ss:FontName=""Calibri"" x:Family=""Swiss"" ss:Size=""11"" ss:Color=""#000000""{0}", Environment.NewLine)
        sb.AppendFormat("    ss:Bold=""1""/>{0}", Environment.NewLine)
        sb.AppendFormat("  </ss:Style>{0}", Environment.NewLine)
        sb.AppendFormat("  <ss:Style ss:ID=""s63"">{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:NumberFormat ss:Format=""Short Date""/>{0}", Environment.NewLine)
        sb.AppendFormat("  </ss:Style>{0}", Environment.NewLine)
        sb.AppendFormat("  <ss:Style ss:ID=""s60"">{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Alignment ss:Vertical=""Bottom""/>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Borders>{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Bottom"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Top"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Left"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   <ss:Border ss:Position=""Right"" ss:LineStyle=""Continuous"" ss:Weight=""1"" />{0}", Environment.NewLine)
        sb.AppendFormat("   </ss:Borders>{0}", Environment.NewLine)
        sb.AppendFormat("  </ss:Style>{0}", Environment.NewLine)
        sb.AppendFormat(" </ss:Styles>{0}", Environment.NewLine)
        sb.Append("{0}\r\n</Workbook>")
        Return sb.ToString()
    End Function
 
    Private Shared Function replaceXmlChar(ByVal input As String) As String
        input = input.Replace("&", "&amp")
        input = input.Replace("<", "&lt;")
        input = input.Replace(">", "&gt;")
        input = input.Replace("""", "&quot;")
        input = input.Replace("'", "&apos;")
        Return input
    End Function
 
    Private Shared Function getCellXml(ByVal type As Type, ByVal cellData As Object, ByVal hasBorder As Boolean) As String
        Dim data As Object = IIf((TypeOf cellData Is DBNull), "", cellData)
        Dim border As String = ""
 
        If hasBorder Then
            border = " ss:StyleID=""s60"""
        End If
 
        If type.Name.Contains("Int") OrElse type.Name.Contains("Double") OrElse type.Name.Contains("Decimal") OrElse type.Name.Contains("decimal") Then
            Return String.Format("<Cell" & border & "><Data ss:Type=""Number"">{0}</Data></Cell>", data)
        End If
 
        If type.Name.Contains("DateTime") AndAlso data.ToString() <> String.Empty Then
            Return String.Format("<Cell ss:StyleID=""s63""><Data ss:Type=""DateTime"">{0}</Data></Cell>", Convert.ToDateTime(data).ToString("g"))
        End If
 
        Dim nad As Decimal = 0
 
        If Decimal.TryParse(cellData.ToString(), nad) Then
            Return String.Format("<Cell" & border & "><Data ss:Type=""Number"">{0}</Data></Cell>", data)
        End If
 
        Return String.Format("<Cell" & border & "><Data ss:Type=""String"">{0}</Data></Cell>", replaceXmlChar(data.ToString()))
    End Function
 
    Public Shared Sub ToFormattedExcel(ByVal dsInput As DataSet, ByVal filename As String)
        Dim excelTemplate As String = getXMLWorkbookTemplate()
        Dim tablas As String = "<Worksheet ss:Name=""Result"">"
        tablas += vbCrLf & "<Table>" & vbCrLf
 
        For Each dt As DataTable In dsInput.Tables
            tablas += GetExcelTableXml(dt, True)
        Next
 
        tablas += vbCrLf & "</Table>" & vbCrLf
        tablas += vbCrLf & "</Worksheet>"
        Dim excelXml As String = String.Format(excelTemplate, tablas)
 
        Try
            File.Delete(filename)
            Dim sw As StreamWriter = New StreamWriter(filename)
            sw.Write(excelXml)
            sw.Flush()
            sw.Close()
            sw.Dispose()
            sw = Nothing
        Catch ex As Exception
        End Try
    End Sub
 
    Public Shared Function GetExcelTableXml(ByVal dt As DataTable, ByVal hasBorder As Boolean) As String
        Dim result As String = ""
        result = vbCrLf & "<Row>"
 
        For Each dc As DataColumn In dt.Columns
            result += String.Format("<Cell ss:StyleID=""s62""><Data ss:Type=""String"">{0}</Data></Cell>", replaceXmlChar(dc.ColumnName))
        Next
 
        result += vbCrLf & "</Row>"
 
        For i As Integer = 0 To dt.Rows.Count - 1
            result += vbCrLf & "<Row>"
 
            For Each dc As DataColumn In dt.Columns
                result += getCellXml(dc.DataType, dt.Rows(i)(dc.ColumnName), hasBorder)
            Next
 
            result += "</Row>"
        Next
 
        Return result
    End Function
End Class

Честно скажу, что слизал с social.msdn.microsoft.com, но вроде работает.
Использование:
VB.NET
1
2
3
4
5
Private Sub SetDataTable_To_Excel(ByVal dtTable As DataTable, ByVal PathFileName As String)
    Dim ds As DataSet = New DataSet()
    ds.Tables.Add(dtTable)
    ExcelXMLExportHelper.ToFormattedExcel(ds, PathFileName)
End Sub
3
 Аватар для PAnT0P
1492 / 587 / 107
Регистрация: 26.03.2012
Сообщений: 1,039
19.09.2020, 06:44
Попробуйте открыть так: Файл -> имрорт -> xml.
Просто у меня LibreOffice стоит, он сразу без вопросов открывает, (еще раз убедился в правильности выбора)
0
266 / 217 / 54
Регистрация: 01.08.2016
Сообщений: 843
19.09.2020, 07:47  [ТС]
PAnT0P, попробовал:Файл -> имрорт -> xml но импортируется в файл какая то ерунда. Наверное ваш код применим только для LibreOffice у меня 16-я версия офиса
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
19.09.2020, 08:01
Цитата Сообщение от Uswer Посмотреть сообщение
Класс записи DataSet в файл XLS.
Помнится я заморачивался темой перевода DataTable в некоторые форматы, если не ошибаюсь (давно дело было), я сохранял хмл с помощью WriteXml и выполнял трансформацию с помощью XSLT. Насколько это актуально сейчас, уже не скажу, но, если кому интересно, то вот ссылка
Блох: Экспорт данных из DataTable(ADO.Net) с помощью XSLT. Часть 5–файлы и ссылки.
3
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
19.09.2020, 11:31
Я не увидел принципиального отличия в коде ExcelXMLExportHelper и коде PAnT0P, за исключением отсутствия указания ссылок на следующие пространства имён:
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"

Всё формирование XML в коде PAnT0P идёт в явном виде без этих ссылок.
andrsh, попробуйте добавить эти объявления в код от PAnT0P, а также добавить ссылки на эти пространства при формировании элементов документа. Каков будет результат?

Не по теме:

Сам попробовать не могу, т.к. у меня офис ооочень древний (он про XML вообще не знает).

0
 Аватар для PAnT0P
1492 / 587 / 107
Регистрация: 26.03.2012
Сообщений: 1,039
19.09.2020, 16:08
Домой приду попробую, вроде диск гдето валялся с 10 офисом

Добавлено через 4 часа 29 минут
Чтобы закрыть вопрос установил 10 офис и всё проверил.
MSOffice оказался более капризным, чем LibreOffice. Чтобы заработало пришлось добавить в выходной файл ещё одно пространство имен и префикс всем атрибутам.

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
    ' Это формат Excel XML, расширение файла должно быть .xml
    Public Sub ExportExcelXml(ByVal Table As DataGridView, ByVal FileName As String)
        Dim Column As DataGridViewColumn
        Dim Row As DataGridViewRow
        Dim Cell As DataGridViewCell
        Dim Index As Integer = 1
        Try
            Dim ExcelSheet As New IO.StreamWriter(FileName, False)
            ExcelSheet.WriteLine("<?xml version='1.0'?>")
            ExcelSheet.WriteLine("<?mso-application progid='Excel.Sheet'?>")
            ExcelSheet.WriteLine("<Workbook xmlns='urn:schemas-microsoft-com:office:spreadsheet' xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'>")
            ExcelSheet.WriteLine(Space(2) & "<Styles>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='Header'>")
            ExcelSheet.WriteLine(Space(6) & "<Font ss:Bold='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Center' ss:Vertical='Center' ss:WrapText='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='1'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Left' ss:Vertical='Top' ss:WrapText='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='2'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Center' ss:Vertical='Top' ss:WrapText='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='4'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Right' ss:Vertical='Top' ss:WrapText='0' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='16'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Left' ss:Vertical='Center' ss:WrapText='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='32'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Center' ss:Vertical='Center' ss:WrapText='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='64'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Right' ss:Vertical='Center' ss:WrapText='0' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='256'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Left' ss:Vertical='Bottom' ss:WrapText='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='512'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Center' ss:Vertical='Bottom' ss:WrapText='1' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(4) & "<Style ss:ID='1024'>")
            ExcelSheet.WriteLine(Space(6) & "<Alignment ss:Horizontal='Right' ss:Vertical='Bottom' ss:WrapText='0' />")
            ExcelSheet.WriteLine(Space(6) & "<Borders>")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(8) & "<Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1' />")
            ExcelSheet.WriteLine(Space(6) & "</Borders>")
            ExcelSheet.WriteLine(Space(4) & "</Style>")
            ExcelSheet.WriteLine(Space(2) & "</Styles>")
            ExcelSheet.WriteLine(Space(2) & "<Worksheet ss:Name='Sheet1'>")
            ExcelSheet.WriteLine(Space(4) & "<Table>")
            ' Ширина столбцов
            For Each Column In Table.Columns
                If Column.Visible Then
                    ExcelSheet.WriteLine(Space(6) & "<Column ss:Width='" & Column.Width & "' />")
                End If
            Next
            ' пустая строка
            ExcelSheet.WriteLine(Space(6) & "<Row />")
            ' Заголовок таблицы
            ExcelSheet.WriteLine(Space(6) & "<Row>")
            ExcelSheet.WriteLine(Space(8) & "<Cell>")
            ExcelSheet.WriteLine(Space(10) & "<Data ss:Type='String'>1 строка заголовка</Data>")
            ExcelSheet.WriteLine(Space(8) & "</Cell>")
            ExcelSheet.WriteLine(Space(6) & "</Row>")
            ExcelSheet.WriteLine(Space(6) & "<Row>")
            ExcelSheet.WriteLine(Space(8) & "<Cell>")
            ExcelSheet.WriteLine(Space(10) & "<Data ss:Type='String'>2 строка заголовка</Data>")
            ExcelSheet.WriteLine(Space(8) & "</Cell>")
            ExcelSheet.WriteLine(Space(6) & "</Row>")
            ' пустая строка
            ExcelSheet.WriteLine(Space(6) & "<Row />")
            ' Шапка таблицы
            ExcelSheet.WriteLine(Space(6) & "<Row ss:Height='" & Table.ColumnHeadersHeight & "'>")
            For Each Column In Table.Columns
                If Column.Visible Then
                    ExcelSheet.WriteLine(Space(8) & "<Cell ss:StyleID='Header'>")
                    ExcelSheet.WriteLine(Space(10) & "<Data ss:Type='String'>" & Column.HeaderText & "</Data>")
                    ExcelSheet.WriteLine(Space(8) & "</Cell>")
                End If
            Next
            ExcelSheet.WriteLine(Space(6) & "</Row>")
            ExcelSheet.WriteLine(Space(6) & "<Row>")
            ' Нумерация столбцов
            For Each Column In Table.Columns
                If Column.Visible Then
                    ExcelSheet.WriteLine(Space(8) & "<Cell ss:StyleID='Header'>")
                    ExcelSheet.WriteLine(Space(10) & "<Data ss:Type='String'>" & Index & "</Data>")
                    ExcelSheet.WriteLine(Space(8) & "</Cell>")
                    Index = Index + 1
                End If
            Next
            ExcelSheet.WriteLine(Space(6) & "</Row>")
            ' Строки данных
            For Each Row In Table.Rows
                ExcelSheet.WriteLine(Space(6) & "<Row ss:Height='" & Row.Height & "'>")
                ' Ячейки данных
                For Each Cell In Row.Cells
                    If Cell.Visible Then
                        ' Установка стиля ячейки по стилю столбца
                        ExcelSheet.WriteLine(Space(8) & "<Cell ss:StyleID='" & Table.Columns(Cell.ColumnIndex).DefaultCellStyle.Alignment & "'>")
                        ' Запись данных в ячейку
                        ExcelSheet.WriteLine(Space(10) & "<Data ss:Type='String'>" & Cell.Value & "</Data>")
                        ExcelSheet.WriteLine(Space(8) & "</Cell>")
                    End If
                Next
                ExcelSheet.WriteLine(Space(6) & "</Row>")
                '=== Отображение прогресса сохранения ===
                'Call frmMain.ShowProgress(Row.Index + 1, Table.RowCount)
                '========================================
            Next
            ExcelSheet.WriteLine(Space(4) & "</Table>")
            ExcelSheet.WriteLine(Space(2) & "</Worksheet>")
            ExcelSheet.WriteLine("</Workbook>")
            ExcelSheet.Close()
        Catch ex As Exception
            Call MsgBox("Файл заблокирован другой программой!", MsgBoxStyle.Exclamation + vbOKOnly, "Ошибка записи!")
        End Try
    End Sub
PS. Просьба к модераторам заменить код в соответствующей теме
1
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
19.09.2020, 16:27
PAnT0P, Заменил
1
2298 / 1614 / 400
Регистрация: 26.06.2017
Сообщений: 4,780
Записей в блоге: 1
19.09.2020, 16:59
Вместе мы сила
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
19.09.2020, 17:17
Uswer, Для этого и существует форум. Помогать друг другу решать вопросы
0
 Аватар для UBUNTU
352 / 213 / 42
Регистрация: 04.02.2015
Сообщений: 1,344
19.09.2020, 18:08
Есть же библиотека под OpenOffice на соурсфордж видел.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
19.09.2020, 18:41
UBUNTU, Тут не библиотека обсуждается, а возможность без сторонних компонентов выгружать данные в таблицу, понимаемую Excel включая ее форматирование.
0
 Аватар для UBUNTU
352 / 213 / 42
Регистрация: 04.02.2015
Сообщений: 1,344
19.09.2020, 20:15
Yury Komar, Ну если вопрос об отсутствии офиса идёт я просто как бы сказал, что опенофисом можно
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
19.09.2020, 20:53
По поводу экспорта датасета. Датасет может содержать несколько таблиц, так что их неплохо бы разместить на разных листах. Сделал с форматированием таблицы, преобразование типов стырил у Uswer, правда пришлось немного доработать код. Собственно вот результат
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
Imports <xmlns="urn:schemas-microsoft-com:office:spreadsheet">
Imports <xmlns:o="urn:schemas-microsoft-com:office:office">
Imports <xmlns:x="urn:schemas-microsoft-com:office:excel">
Imports <xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
Imports <xmlns:html="http://www.w3.org/TR/REC-html40">
 
 
Public Class DataSetToExcelXml
    Public Function Convert(ds As DataSet) As XDocument
        Return <?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">
                   <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
                       <Author>diadiavova</Author>
                       <LastAuthor>diadiavova</LastAuthor>
                       <Created>2020-09-19T13:06:33Z</Created>
                       <Version>16.00</Version>
                   </DocumentProperties>
                   <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
                       <AllowPNG/>
                   </OfficeDocumentSettings>
                   <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
                       <WindowHeight>7650</WindowHeight>
                       <WindowWidth>20490</WindowWidth>
                       <WindowTopX>0</WindowTopX>
                       <WindowTopY>0</WindowTopY>
                       <ProtectStructure>False</ProtectStructure>
                       <ProtectWindows>False</ProtectWindows>
                   </ExcelWorkbook>
                   <Styles>
                       <Style ss:ID="Default" ss:Name="Normal">
                           <Alignment ss:Vertical="Bottom"/>
                           <Borders/>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
                               ss:Color="#000000"/>
                           <Interior/>
                           <NumberFormat/>
                           <Protection/>
                       </Style>
                       <Style ss:ID="s30" ss:Name="Вывод">
                           <Borders>
                               <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                               <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                               <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                               <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                           </Borders>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
                               ss:Color="#3F3F3F" ss:Bold="1"/>
                           <Interior ss:Color="#F2F2F2" ss:Pattern="Solid"/>
                       </Style>
                       <Style ss:ID="s31" ss:Name="Вывод даты">
                           <Borders>
                               <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                               <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                               <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                               <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"
                                   ss:Color="#3F3F3F"/>
                           </Borders>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="11"
                               ss:Color="#3F3F3F" ss:Bold="1"/>
                           <Interior ss:Color="#F2F2F2" ss:Pattern="Solid"/>
                           <NumberFormat ss:Format="dd/mm/yy\ h:mm;@"/>
                       </Style>
                       <Style ss:ID="s22" ss:Name="Заголовок 1">
                           <Borders>
                               <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#5B9BD5"/>
                           </Borders>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="15"
                               ss:Color="#339966" ss:Bold="1"/>
                       </Style>
                       <Style ss:ID="s23" ss:Name="Заголовок 2">
                           <Borders>
                               <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#ACCCEA"/>
                           </Borders>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="13"
                               ss:Color="#339966" ss:Bold="1"/>
                       </Style>
                       <Style ss:ID="s127" ss:Name="ЗаголовокСтолбца">
                           <Alignment ss:Vertical="Bottom"/>
                           <Borders>
                               <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#ACCCEA"/>
                               <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#ACCCEA"/>
                               <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#ACCCEA"/>
                               <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#ACCCEA"/>
                           </Borders>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="13"
                               ss:Color="#FFFFFF" ss:Bold="1"/>
                           <Interior ss:Color="#5B9BD5" ss:Pattern="Solid"/>
                           <Protection/>
                       </Style>
                       <Style ss:ID="s63" ss:Parent="s22">
                           <Borders>
                               <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#5B9BD5"/>
                           </Borders>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="15"
                               ss:Color="#339966" ss:Bold="1"/>
                           <Interior/>
                       </Style>
                       <Style ss:ID="s65" ss:Parent="s23">
                           <Borders>
                               <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="3"
                                   ss:Color="#ACCCEA"/>
                           </Borders>
                           <Font ss:FontName="Calibri" x:CharSet="204" x:Family="Swiss" ss:Size="13"
                               ss:Color="#339966" ss:Bold="1"/>
                           <Interior/>
                       </Style>
                   </Styles>
                   <%= From table As DataTable In ds.Tables
                       Select GetWorksheet(table) %>
               </Workbook>
 
 
    End Function
 
    Function GetWorksheet(dt As DataTable) As XElement
        Return <Worksheet ss:Name=<%= dt.TableName %>>
                   <Table>
                       <Column ss:AutoFitWidth="0" ss:Width="60"/>
                       <Row ss:AutoFitHeight="0" ss:Height="20.25">
                           <Cell ss:StyleID="s63"><Data ss:Type="String"><%= dt.TableName %></Data></Cell>
                       </Row>
                       <Row ss:AutoFitHeight="0" ss:Height="15.75">
                           <%= From col As DataColumn In dt.Columns
                               Select <Cell ss:StyleID="s127"><Data ss:Type="String"><%= col.ColumnName %></Data></Cell>
                           %>
                       </Row>
                       <%= From row As DataRow In dt.Rows
                           Select
                               <Row ss:AutoFitHeight="0">
                                   <%= row.ItemArray.Select(Function(cell, index) GetCellXml(dt.Columns(index).DataType, cell)) %>
                               </Row> %>
                   </Table>
                   <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
                       <PageSetup>
                           <Header x:Margin="0.3"/>
                           <Footer x:Margin="0.3"/>
                           <PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
                       </PageSetup>
                       <Unsynced/>
                       <Selected/>
                       <Panes>
                           <Pane>
                               <Number>3</Number>
                               <ActiveRow>4</ActiveRow>
                               <ActiveCol>6</ActiveCol>
                           </Pane>
                       </Panes>
                       <ProtectObjects>False</ProtectObjects>
                       <ProtectScenarios>False</ProtectScenarios>
                   </WorksheetOptions>
               </Worksheet>
    End Function
 
 
 
    Private Function GetCellXml(ByVal type As Type, ByVal cellData As Object) As XElement
        Dim data As Object = IIf((TypeOf cellData Is DBNull), "", cellData)
        Dim sstype = "String", dataval = data, style = "s30"
        If type.Name.Contains("Int") OrElse type.Name.Contains("Double") OrElse type.Name.Contains("Decimal") OrElse type.Name.Contains("decimal") Then
            sstype = "Number"
        ElseIf type.Name.Contains("DateTime") AndAlso data.ToString() <> String.Empty Then
            sstype = "DateTime"
            dataval = System.Convert.ToDateTime(data).ToString("s")
            style = "s31"
        End If
        Return <Cell ss:StyleID=<%= style %>><Data ss:Type=<%= sstype %>><%= dataval.ToString() %></Data></Cell>
    End Function
 
End Class
Код преобразования аналогичен предыдущему
VB.NET
1
2
3
4
        If SaveFileDialog1.ShowDialog = DialogResult.OK Then
            Dim ds2xcl = New DataSetToExcelXml
            ds2xcl.Convert(Me.NorthWindDataSet).Save(SaveFileDialog1.FileName)
        End If
Во вложении резельтат преобразования датасета, в который загружена база NORTHWIND. Там есть поля с двоичными данными, они просто отображаются как System.Byte[].
Вложения
Тип файла: zip northwind.zip (109.2 Кб, 1 просмотров)
3
Модератор
Эксперт .NET
 Аватар для Yury Komar
4378 / 3448 / 512
Регистрация: 27.01.2014
Сообщений: 6,268
20.09.2020, 04:26
Такими темпами тут скоро родится класс (не библиотека сторонняя) по экспорту таблиц в Эксель с учётом форматирования... Надо только упаковать все это дело в XLSX (он же ZIP) и будет вообще супер!
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
20.09.2020, 08:06
Цитата Сообщение от Yury Komar Посмотреть сообщение
Надо только упаковать все это дело в XLSX (он же ZIP) и будет вообще супер!
Тот формат, который здесь испоьлзуется в качестве целевого, сильно отличается от содержимого архива, который представляет xlsx-файл. Там все намного сложнее и разделено на несколько файлов.
Возможно есть смысл дополнить конвертер настройкой стилей или копированием стилей, если речь о гриде. В случае датасета можно реализовать поддержку экспорта вычисляемых полей, ну, чтобы они в формулы превращались. Но, в общем и целом, тут главное - не перестараться. Есть готовые библиотеки, который в любом случае работают лучше. Хотя, тем же OpenXML, видимо лучше пользоваться на C#, поскольку там в сдк входит программа, которая умеет генерировать код на этом языке, а бейсик хорош хмл-литералами.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.09.2020, 08:06

Значение ячейки Excel без установленного Excel
Здравствуйте. Возможно считать средствами С# значение ячейки екселя если не установлен ексель? Или можно обойтись Опен офисом? Может у...

Работа с Excel 2007 без установленного MS Office
Здравствуйте. вопрос такой: на компе не установлен Excel 2007, прога работает с Interop ver.12 работа с файлами 2003 проходит на ура,...

Экспорт DataGridView в Excel с сохранением формата ячеек DataGridView
Доброго времени. Ситуевина такая: При экспорте dgv в эксель, эксель сам расставляет форматы ячеек как ему понравится, в связи с чем...

Как работать с файлом Excel без установленного MS Office
Нужно работать с файлом екселя без установленного офиса. Использую Microsoft Excel 11.0 Object Library (Классы типа Excel.Application,...

Работа с Excel таблицами без офиса
Добрый день! Подскажите бесплатный API для работы с Excel таблицами.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru