Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 9

Пересохранение DBF файла в формате *.xls (MS EXCEL)

11.10.2016, 10:50. Показов 3172. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте.
Мне необходимо преобразовать существующий DBF файл в таблицу EXCEL.
Если я получаю данные из DBF файла в DataTable и потом построчно переношу записи в EXCEL все работает штатно, но долго.
возможно пригодится

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
            // Получаем данные из DBF в DataTable
            string get_data = "SELECT * FROM " + dbf_name + " ORDER BY F_NAME";
            DataTable dt = new DataTable();
           //  убрал работу VFPOLEDB в отдельный класс
            dt = QD.DataTable_Execute(path, get_data);
 
            // Подключаемся к EXCEL
            Excel.Application app = new Excel.Application();
            app.Workbooks.Open(path + @"\Act_Info.xls");
            Excel.Workbook book = app.ActiveWorkbook;
            Excel.Worksheet sheet = (Excel.Worksheet)book.Worksheets[1];
            // Номер строки, начиная с которой пойдёт запись
            int row_counter = 0;
            // построчно переносим данные из DataTable в книгу EXCEL
            foreach (DataRow row in dt.Rows)
            {
                row_counter++;
                sheet.Cells[row_counter, 1] = Convert.ToString(row["F_PATH"]);
                sheet.Cells[row_counter, 2] = Convert.ToString(row["F_NAME"]);
                sheet.Cells[row_counter, 3] = Convert.ToString(row["F_DATE"]);
                sheet.Cells[row_counter, 4] = Convert.ToString(row["F_SIZE"]);
                sheet.Cells[row_counter, 5] = Convert.ToString(row["F_HASH"]);
            }
            // Закрываем книгу EXCEL
            book.Save();
            app.Quit();
            // Освобождаем ресурсы
            System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(app);


Решил сразу открыть DBF файл через EXCEL и сохранить как *.xls. Но в итоге содержимое файла нечитаемо.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            // Задаём значение первому биту DBF файла. (по умолчинию создается 48). 
            // Иначе EXCEL не поймёт структуру таблицы и сделает всё одной строкой.
            FileStream fs_xls = new FileStream(path + @"" + dbf_name, FileMode.Open);
            byte bt_xls = 3; 
            fs_xls.Seek(0, SeekOrigin.Begin); 
            fs_xls.WriteByte(bt_xls); 
            fs_xls.Close();
 
            // Подключаемся к EXCEL
            Excel.Application app = new Excel.Application();
            Excel.Workbook book = app.Workbooks.Open(path + @"" + dbf_name);
            book.SaveAs(path + @"\Act_Info.xls", 18);  // 18 - FileFormat соответствующий книге EXCEL 97-2003. Если его не задать то при открытии EXCEL будет ругаться.
            book.Close();
            // Освобождаем ресурсы
            System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
В итоге таблица переносится правильно, но все кирилические символы сбиваются.
Пробовал задавать DBF файлу DOS кодировку (101) и Win кодировку (201) через FileStream в 29 бит файла.
Но разницы нет.

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
            FileStream fs_end = new FileStream(path + @"" + dbf_temp, FileMode.Open);
            byte bt_end = 101; 
            fs_end.Seek(29, SeekOrigin.Begin); 
            fs_end.WriteByte(bt_end); 
            fs_end.Close();
 
ИЛИ
 
            FileStream fs_end = new FileStream(path + @"" + dbf_temp, FileMode.Open);
            byte bt_end = 201;
             fs_end.Seek(29, SeekOrigin.Begin); 
            fs_end.WriteByte(bt_end); 
            fs_end.Close();
Миниатюры
Пересохранение DBF файла в формате *.xls (MS EXCEL)   Пересохранение DBF файла в формате *.xls (MS EXCEL)  
Вложения
Тип файла: xls Act_Info.xls (22.5 Кб, 6 просмотров)
Тип файла: zip Act_Info.zip (1.4 Кб, 12 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2016, 10:50
Ответы с готовыми решениями:

Из DBF-файла в XLS-файл
Всем привет. Вот у меня заиграла любопытность, можна ли как-то написать програмку с помощу которого будут перекидатся данные с...

Открыть txt файл в Excel и сохранить в xls формате
Здравствуйте! мне нужно данные из txt файла пересохранить в .xls формате. тем много, но конкретных шагов для ламера, что где кликнуть,...

Ко всем файлам добавилось .xml, теперь они в формате ***.xls.XML, ***doc.XML (изначально в Word и Excel)
при копировании с одного ноутбука на другом (изначально на новом не было офиса, м.б. из-за этого файлы так перенаименовались) они появились...

3
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
11.10.2016, 11:43
Цитата Сообщение от Ascolswork Посмотреть сообщение
построчно переношу записи в EXCEL все работает штатно, но долго.
Попробуйте не построчно, а сразу массив в Range, должно ускорить в разы.
1
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
11.10.2016, 12:01
Лучший ответ Сообщение было отмечено Ascolswork как решение

Решение

Цитата Сообщение от Ascolswork Посмотреть сообщение
построчно переношу записи в EXCEL все работает штатно, но долго.
Для DataTable:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
internal static void WriteClientData(DataTable dt, Excel.Worksheet oWorkSheet, int numrow, int columnrow)
        {
            object[,] dataExport = new object[dt.Rows.Count, dt.Columns.Count];
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int k = 0; k < dt.Columns.Count; k++)
                {
                    dataExport[i, k] = dt.Rows[i][k];
                }
            }
            Excel.Range rg = GetRange(oWorkSheet,numrow, columnrow, numrow + dt.Rows.Count - 1, columnrow + dt.Columns.Count - 1);
            rg.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, dataExport);
        }
internal static Excel.Range GetRange(Excel.Worksheet sheet, int rowbegin, int columnbegin, int rowend, int columnend)
        {
            Excel.Range c1 = sheet.Cells[rowbegin, columnbegin];
            Excel.Range c2 = sheet.Cells[rowend, columnend];
            return (Excel.Range)sheet.get_Range(c1, c2);
        }
numrow - порядковый номер строки. Если в первой строке Excel названия столбцов, то он равен 2.
1
0 / 0 / 0
Регистрация: 21.09.2016
Сообщений: 9
11.10.2016, 16:21  [ТС]
Спасибо за советы. Обязательно попробую. Но всё-же хочется вернуться к первоначальному вопросу. В чём может быть причина неправильного открытия файла?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2016, 16:21
Помогаю со студенческими работами здесь

Excel и чтение dbf файла.
Доброго времени суток! Есть кучка дбф файлов, (одни сутки - один файл), в Екселе сделана некая табличка которая должна при выборе даты...

Сменить иконку файла Excel 2003 (xls) (не ярлык)
Eсть такой XLS-файл с макросами, у которого в режиме просмотра &quot;Крупные значки&quot; вместо стандартной иконки - изображение (скриншот) первого...

Пересохранение из Word в Excel
Всем добра. Есть примитивная задача, но, в связи с тем что экспортом пытаюсь заниматься первый раз -- дичайше туплю. Задача: есть файл...

Повседневное использование файла XLS 800МБ внешними таблицами Excel
Есть проблема.. В производственном процессе используются огромные таблицы эксель (далее - База), (за год примерно 800 мб ОДИН ФАЙЛ XLS) и...

Иконка файла (книги) с расширением .xls (Табличный редактор Microsoft Excel)
Можно ли изменить иконку файла (книги) Excel (файла с расширением.xls). Чтобы иконка поменялась не у всех файлов Excel на моём компьютере,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru