Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
1

Как для BinaryWriter указать кодировку (если это возможно)

21.01.2019, 18:41. Показов 2354. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу программу для записи данных в эксель.
Для записи у меня есть класс ExcelWriter:
C#
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
/// <summary>
    /// Produces Excel file without using Excel
    /// </summary>
    public class ExcelWriter
    {
        private Stream stream;
        private BinaryWriter writer;
 
        private ushort[] clBegin = { 0x0809, 8, 0, 0x10, 0, 0 };
        private ushort[] clEnd = { 0x0A, 00 };
 
 
        private void WriteUshortArray(ushort[] value)
        {
            for (int i = 0; i < value.Length; i++)
                writer.Write(value[i]);
        }
 
        /// <summary>
        /// Initializes a new instance of the <see cref="ExcelWriter"/> class.
        /// </summary>
        /// <param name="stream">The stream.</param>
        public ExcelWriter(Stream stream)
        {
            this.stream = stream;
            writer = new BinaryWriter(stream);
        }
 
        /// <summary>
        /// Writes the text cell value.
        /// </summary>
        /// <param name="row">The row.</param>
        /// <param name="col">The col.</param>
        /// <param name="value">The string value.</param>
        public void WriteCell(int row, int col, string value)
        {
            ushort[] clData = { 0x0204, 0, 0, 0, 0, 0 };
            int iLen = value.Length;
            byte[] plainText = Encoding.ASCII.GetBytes(value);
            clData[1] = (ushort)(8 + iLen);
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            clData[5] = (ushort)iLen;
            WriteUshortArray(clData);
            writer.Write(plainText);
        }
 
        /// <summary>
        /// Writes the integer cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, int value)
        {
            ushort[] clData = { 0x027E, 10, 0, 0, 0 };
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            WriteUshortArray(clData);
            int iValue = (value << 2) | 2;
            writer.Write(iValue);
        }
 
        /// <summary>
        /// Writes the double cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, double value)
        {
            ushort[] clData = { 0x0203, 14, 0, 0, 0 };
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            WriteUshortArray(clData);
            writer.Write(value);
        }
 
        /// <summary>
        /// Writes the empty cell.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        public void WriteCell(int row, int col)
        {
            ushort[] clData = { 0x0201, 6, 0, 0, 0x17 };
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            WriteUshortArray(clData);
        }
 
        /// <summary>
        /// Must be called once for creating XLS file header
        /// </summary>
        public void BeginWrite()
        {
            WriteUshortArray(clBegin);
        }
 
        /// <summary>
        /// Ends the writing operation, but do not close the stream
        /// </summary>
        public void EndWrite()
        {
            WriteUshortArray(clEnd);
            writer.Flush();
        }
    }
Данные записываю так:
C#
1
2
3
4
5
6
7
FileStream stream = new FileStream("Посещаемость.xls", FileMode.OpenOrCreate);
                ExcelWriter writer = new ExcelWriter(stream);
                writer.BeginWrite();
                writer.WriteCell(row, 0, "ID: " + readerBD[0].ToString() + "Name: " + readerBD[1].ToString());
                row++;
                writer.EndWrite();
                stream.Close();
Текст на русском языке и в Excel-e получается так, что вместо букв символы ??????? ??????
Прошу помощи, не знаю как быть.
Миниатюры
Как для BinaryWriter указать кодировку (если это возможно)  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.01.2019, 18:41
Ответы с готовыми решениями:

StreamWriter: как указать кодировку
в книгах написано что сохранять и открывать файлы нужно так: StreamWriter autput = new...

Какую кодировку указать для считывания русских букв из файла
using System; using System.Linq; using System.Text.RegularExpressions; using System.Text; using...

Какую кодировку указать для считывания из файла русских символов
Здравствуйте, есть такая программа using System; using System.Collections.Generic; using...

StreamWriter, StreamReader, где и как указать кодировку
В C# как известно все символы кодируются 2-мя байтами - следовательно есть определенные проблемы...

22
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
21.01.2019, 18:54 2
Вы её уже указали...
C#
1
byte[] plainText = Encoding.ASCII.GetBytes(value);
1
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 19:43  [ТС] 3
Someone007, Упс, не заметил)

Добавлено через 16 минут
Someone007, Поменял кодировку на UTF8, все вроде сработало нормально, но теперь документ вообще не открывается. Пишет, что ошибка в части содержимого таблицы. Как быть? Может надо указать другую кодировку?
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
21.01.2019, 20:21 4
А есил так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public void WriteCell(int row, int col, string value)
        {
            ushort[] clData = { 0x0204, 0, 0, 0, 0, 0 };
            byte[] plainText = Encoding.UTF8.GetBytes(value);
            int iLen = plainText.Length;
            clData[1] = (ushort)(8 + iLen);
            clData[2] = (ushort)row;
            clData[3] = (ushort)col;
            clData[5] = (ushort)iLen;
            WriteUshortArray(clData);
            writer.Write(plainText);
        }
1
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 20:33  [ТС] 5
Someone007, так уже пробовал
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
21.01.2019, 21:22 6
Вообще ваш ExcelWriter какой-то странный формат реализовывает. В оффициальной документации по xls формату последней версии указано что Record с типом 516 (Label) имеет следующую структуру:
cell (6 bytes): A Cell structure that specifies the row and column of the label and the index of the label’s format

rw (2 bytes): An Rw that specifies the row.
col (2 bytes): A Col that specifies the column.
ixfe (2 bytes): An IXFCell that specifies the XF record.
st (variable): A XLUnicodeString structure that contains the text of the label.

cch (2 bytes): An unsigned integer that specifies the count of characters in the string.
A - fHighByte (1 bit): A bit that specifies whether the characters in rgb are double-byte characters.
reserved (7 bits): MUST be zero, and MUST be ignored.
rgb (variable): An array of bytes that specifies the characters. If fHighByte is 0x0, the size of the array MUST be equal to cch. If fHighByte is 0x1, the size of the array MUST be equal to cch*2.
Но при попытке реализовать то, что написано в документации что-то ничего хорошего не выходит.

Возможно формат записи Label зависит от версии самого xls формата, а она скорее всего указана где-то в заголовке файла...
1
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.01.2019, 22:00 7
Цитата Сообщение от Crypt0r Посмотреть сообщение
Поменял кодировку на UTF8, все вроде сработало нормально, но теперь документ вообще не открывается.
В доке написано что символы должны быть в кодировке Unicode double characters. То есть UTF16, а не UTF8.
Вам нужно использовать
C#
1
Encoding.Unicode.GetBytes(value);
И еще нужно выставить бит в поле fHighByte.

И в поле cch нужно указывать не длину массива, а количество символов.
1
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 22:36  [ТС] 8
Цитата Сообщение от Storm23 Посмотреть сообщение
И еще нужно выставить бит в поле fHighByte.
И в поле cch нужно указывать не длину массива, а количество символов.
Не могу понять о чем вы. Не нашел никакого поля fHighByte и cch. Можете код показать?
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
21.01.2019, 22:38 9
Storm23, всё равно не будет работать, я пробовал. Пришлось полностью переделать по описанию в документации, поднять версию BIFF с BIFF5 до BIFF8 и теперь вроде работает... Но например google docs такие файлы не принимает всё равно...

C#
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
    /// <summary>
    /// Produces Excel file without using Excel
    /// </summary>
    public class ExcelWriter : IDisposable
    {
        private BinaryWriter writer;
 
        /// <summary>
        /// Initializes a new instance of the <see cref="ExcelWriter"/> class.
        /// </summary>
        /// <param name="stream">The stream.</param>
        public ExcelWriter(Stream stream)
        {
            writer = new BinaryWriter(stream);
        }
 
        private void WriteRecord(ushort type, ushort size)
        {
            writer.Write(type);
            writer.Write(size);
        }
 
        private void WriteCellInternal(ushort rw, ushort col, ushort ixfe)
        {
            writer.Write(rw);
            writer.Write(col);
            writer.Write(ixfe);
        }
 
        /// <summary>
        /// Writes the text cell value.
        /// </summary>
        /// <param name="row">The row.</param>
        /// <param name="col">The col.</param>
        /// <param name="value">The string value.</param>
        public void WriteCell(int row, int col, string value)
        {
            byte[] plainText = Encoding.Unicode.GetBytes(value);
 
            WriteRecord(0x0204, (ushort)(9 + plainText.Length)); // Label
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            // st
            writer.Write((ushort)value.Length); // cch
            writer.Write((byte)1); // A
            writer.Write(plainText); // rgb
        }
 
        /// <summary>
        /// Writes the integer cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, int value)
        {
            WriteRecord(0x027E, 0x0010); // RK
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            int iValue = (value << 2) | 2;
            writer.Write(iValue); // RK
        }
 
        /// <summary>
        /// Writes the double cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, double value)
        {
            WriteRecord(0x0203, 0x0014); // Number
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            writer.Write(value); // num
        }
 
        /// <summary>
        /// Writes the empty cell.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        public void WriteCell(int row, int col)
        {
            WriteRecord(0x0201, 0x0006); // Blank
            WriteCellInternal((ushort)row, (ushort)col, 0x0017 /*40% - Accent2*/);
        }
 
        /// <summary>
        /// Must be called once for creating XLS file header
        /// </summary>
        public void BeginWrite()
        {
            WriteRecord(0x0809, 0x0010); // BOF
 
            writer.Write((ushort)0x0600); // vers (BIFF8)
            writer.Write((ushort)0x0010); // dt (dialog sheet/worksheet)
            writer.Write((ushort)0x0001); // rupBuild
            writer.Write((ushort)0x07CD); // rupYear
            writer.Write((uint)(0x1 | 0x1 << 3)); // A...N, reserved1 (fWin | fWinAny)
            writer.Write((uint)0x6); // verLowestBiff, O, reserved2
        }
 
        /// <summary>
        /// Ends the writing operation, but do not close the stream
        /// </summary>
        public void EndWrite()
        {
            WriteRecord(0x000A, 0x0000); // EOF
            writer.Flush();
        }
 
        public void Dispose()
        {
            writer.Flush();
            writer.Dispose();
        }
    }
2
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 22:39  [ТС] 10
Изменил
C#
1
Encoding.ASCII.GetBytes(value);
На
C#
1
Encoding.Unicode.GetBytes(value);
Открываю Ecel документ, а он пустой...
Миниатюры
Как для BinaryWriter указать кодировку (если это возможно)  
0
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 22:42  [ТС] 11
Someone007, то же самое. Открываю документ, а он пустой. Странно
0
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 22:45  [ТС] 12
Вот так вот
Миниатюры
Как для BinaryWriter указать кодировку (если это возможно)   Как для BinaryWriter указать кодировку (если это возможно)  
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
21.01.2019, 22:49 13
У меня плагин Lister в Total Commander нормально открывает.

C#
1
2
3
4
5
6
7
8
9
10
            FileStream stream = new FileStream("123.xls", FileMode.OpenOrCreate);
            ExcelWriter writer = new ExcelWriter(stream);
            writer.BeginWrite();
            int row = 0;
            writer.WriteCell(row++, 0, "ID: тест");
            writer.WriteCell(row++, 0, 123);
            writer.WriteCell(row++, 0);
            writer.WriteCell(row++, 0, 456.7);
            writer.EndWrite();
            stream.Close();
Миниатюры
Как для BinaryWriter указать кодировку (если это возможно)  
1
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.01.2019, 22:51 14
Crypt0r, Someone007,
Вообще-то
Вместо
C#
1
FileStream stream = new FileStream("Посещаемость.xls", FileMode.OpenOrCreate);
нужно
C#
1
FileStream stream = new FileStream("Посещаемость.xls", FileMode.Create);
1
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 22:59  [ТС] 15
Someone007, я не через TCMDR открываю и не робит

Добавлено через 5 минут
Storm23, Все равно не открывается у меня
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
21.01.2019, 23:20 16
А если версию BIFF поменять обратно, то откроется?
C#
1
2
3
4
5
6
7
8
9
        public void BeginWrite()
        {
            WriteRecord(0x0809, 0x0008); // BOF
 
            writer.Write((ushort)0x0000); // vers (BIFF5)
            writer.Write((ushort)0x0010); // dt (dialog sheet/worksheet)
            writer.Write((ushort)0x0001); // rupBuild
            writer.Write((ushort)0x07CC); // rupYear
        }
Кстати, вариант с
C#
1
byte[] plainText = Encoding.GetEncoding(1251).GetBytes(value);
тоже работает, но это решение так себе...
1
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 23:28  [ТС] 17
Ых, не открывается (
0
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.01.2019, 23:34 18
Someone007,
У вас там ошибка в записи дробного и целого числа в ячейку - неправильно посчитана длина записи.
Если исправить, то все работает:

C#
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
using System;
using System.IO;
using System.Text;
 
namespace ConsoleApplication239
{
    class Program
    {
        static void Main(string[] args)
        {
            using (FileStream stream = new FileStream("123.xls", FileMode.OpenOrCreate))
            using (ExcelWriter writer = new ExcelWriter(stream))
            {
                writer.BeginWrite();
                int row = 0;
                writer.WriteCell(row++, 0, "ID: тест");
                writer.WriteCell(row++, 0, "ID: тест");
                writer.WriteCell(row++, 0, 123);
                writer.WriteCell(row++, 0);
                writer.WriteCell(row++, 0, 456.7);
                writer.EndWrite();
            }
        }
    }
 
 
    /// <summary>
    /// Produces Excel file without using Excel
    /// </summary>
    public class ExcelWriter : IDisposable
    {
        private BinaryWriter writer;
 
        /// <summary>
        /// Initializes a new instance of the <see cref="ExcelWriter"/> class.
        /// </summary>
        /// <param name="stream">The stream.</param>
        public ExcelWriter(Stream stream)
        {
            writer = new BinaryWriter(stream);
        }
 
        private void WriteRecord(ushort type, ushort size)
        {
            writer.Write(type);
            writer.Write(size);
        }
 
        private void WriteCellInternal(ushort rw, ushort col, ushort ixfe)
        {
            writer.Write(rw);
            writer.Write(col);
            writer.Write(ixfe);
        }
 
        /// <summary>
        /// Writes the text cell value.
        /// </summary>
        /// <param name="row">The row.</param>
        /// <param name="col">The col.</param>
        /// <param name="value">The string value.</param>
        public void WriteCell(int row, int col, string value)
        {
            byte[] plainText = Encoding.Unicode.GetBytes(value);
 
            WriteRecord(0x0204, (ushort)(9 + plainText.Length)); // Label
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            // st
            writer.Write((ushort)value.Length); // cch
            writer.Write((byte)1); // A
            writer.Write(plainText); // rgb
        }
 
        /// <summary>
        /// Writes the integer cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, int value)
        {
            WriteRecord(0x027E, 6 + 4); // RK
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            int iValue = (value << 2) | 2;
            writer.Write(iValue); // RK
        }
 
        /// <summary>
        /// Writes the double cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, double value)
        {
            WriteRecord(0x0203, 6 + 8); // Number
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            writer.Write(value); // num
        }
 
        /// <summary>
        /// Writes the empty cell.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        public void WriteCell(int row, int col)
        {
            WriteRecord(0x0201, 0x0006); // Blank
            WriteCellInternal((ushort)row, (ushort)col, 0x0017 /*40% - Accent2*/);
        }
 
        /// <summary>
        /// Must be called once for creating XLS file header
        /// </summary>
        public void BeginWrite()
        {
            WriteRecord(0x0809, 0x0010); // BOF
 
            writer.Write((ushort)0x0600); // vers (BIFF8)
            writer.Write((ushort)0x0010); // dt (dialog sheet/worksheet)
            writer.Write((ushort)0x0001); // rupBuild
            writer.Write((ushort)0x07CD); // rupYear
            writer.Write((uint)(0x1 | 0x1 << 3)); // A...N, reserved1 (fWin | fWinAny)
            writer.Write((uint)0x6); // verLowestBiff, O, reserved2
        }
 
        /// <summary>
        /// Ends the writing operation, but do not close the stream
        /// </summary>
        public void EndWrite()
        {
            WriteRecord(0x000A, 0x0000); // EOF
            writer.Flush();
        }
 
        public void Dispose()
        {
            writer.Flush();
            writer.Dispose();
        }
    }
}
Как для BinaryWriter указать кодировку (если это возможно)
2
1 / 1 / 6
Регистрация: 02.03.2017
Сообщений: 204
21.01.2019, 23:40  [ТС] 19
Storm23, будет уже смешно, но и это не работает у меня. Вот же ...
0
Эксперт .NET
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
22.01.2019, 00:14 20
Вот так по идее у вас будет работать, но как я уже сказал

Цитата Сообщение от Someone007 Посмотреть сообщение
это решение так себе...
C#
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
    /// <summary>
    /// Produces Excel file without using Excel
    /// </summary>
    public class ExcelWriter : IDisposable
    {
        private BinaryWriter writer;
        private Encoding encoding = Encoding.GetEncoding(1251);
 
        /// <summary>
        /// Initializes a new instance of the <see cref="ExcelWriter"/> class.
        /// </summary>
        /// <param name="stream">The stream.</param>
        public ExcelWriter(Stream stream)
        {
            writer = new BinaryWriter(stream);
        }
 
        private void WriteRecord(ushort type, ushort size)
        {
            writer.Write(type);
            writer.Write(size);
        }
 
        private void WriteCellInternal(ushort rw, ushort col, ushort ixfe)
        {
            writer.Write(rw);
            writer.Write(col);
            writer.Write(ixfe);
        }
 
        /// <summary>
        /// Writes the text cell value.
        /// </summary>
        /// <param name="row">The row.</param>
        /// <param name="col">The col.</param>
        /// <param name="value">The string value.</param>
        public void WriteCell(int row, int col, string value)
        {
            byte[] plainText = encoding.GetBytes(value);
 
            WriteRecord(0x0204, (ushort)(8 + plainText.Length)); // Label
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            // st
            writer.Write((ushort)value.Length); // cch
            writer.Write(plainText); // rgb
        }
 
        /// <summary>
        /// Writes the integer cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, int value)
        {
            WriteRecord(0x027E, 0x000A); // RK
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            int iValue = (value << 2) | 2;
            writer.Write(iValue); // RK
        }
 
        /// <summary>
        /// Writes the double cell value.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        /// <param name="value">The value.</param>
        public void WriteCell(int row, int col, double value)
        {
            WriteRecord(0x0203, 0x000E); // Number
            WriteCellInternal((ushort)row, (ushort)col, 0);
 
            writer.Write(value); // num
        }
 
        /// <summary>
        /// Writes the empty cell.
        /// </summary>
        /// <param name="row">The row number.</param>
        /// <param name="col">The column number.</param>
        public void WriteCell(int row, int col)
        {
            WriteRecord(0x0201, 0x0006); // Blank
            WriteCellInternal((ushort)row, (ushort)col, 0x0017 /*40% - Accent2*/);
        }
 
        /// <summary>
        /// Must be called once for creating XLS file header
        /// </summary>
        public void BeginWrite()
        {
            WriteRecord(0x0809, 0x0008); // BOF
 
            writer.Write((ushort)0x0000); // vers (BIFF5)
            writer.Write((ushort)0x0010); // dt (dialog sheet/worksheet)
            writer.Write((ushort)0x0000); // rupBuild
            writer.Write((ushort)0x0000); // rupYear
        }
 
        /// <summary>
        /// Ends the writing operation, but do not close the stream
        /// </summary>
        public void EndWrite()
        {
            WriteRecord(0x000A, 0x0000); // EOF
            writer.Flush();
        }
 
        public void Dispose()
        {
            writer.Flush();
            writer.Dispose();
        }
    }
1
22.01.2019, 00:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2019, 00:14
Помогаю со студенческими работами здесь

Как указать кодировку при чтении с файла
Суть программы. Имеется файл data.txt, в котором в такой последовательности записаны символы aaa...

Как указать кодировку UNICODE при записи в файл?
Пытался найти разную инфу по поводу записи в файл с определенной кодировкой, однако ни один мне не...

Как это сделать , если это возможно, сам не уверен
Помогите, как это сделать Пример В таблице Excel я ввожу какую нибудь формулу (Sin(x), a не...

Возможно ли это и если да как это сделать?
Имеется удаленный сервер с управлением через KVM и с операционной системой windows server 2012, ее...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru