Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
22 / 22 / 3
Регистрация: 20.10.2010
Сообщений: 82
.NET 2.x

Объединение двух *.xls файлов

22.11.2010, 22:59. Показов 3155. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые формульчане! Возникла проблема с объдинением двух различных *.xls файлов. Задача стоит такая: второй *.xls скопировать в конец первого.
Видел на форуме много тем по Excel'ю, но того, что нужно не нашёл. Делаю с помощью Microsoft.Office.Interop.Excel.dll.

Вот мои наработки:
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
private void CombineXlsFile()
        {
            ApplicationClass app = new ApplicationClass();
            Workbook book = null;
            Worksheet sheet = null;
            Range range = null;
 
            ApplicationClass app1 = new ApplicationClass();
            Workbook book1 = null;
            Worksheet sheet1 = null;
            Range range1 = null;
 
            try
            {
                app.Visible = false;
                app.ScreenUpdating = false;
                app.DisplayAlerts = false;
                app1.Visible = false;
                app1.ScreenUpdating = false;
                app1.DisplayAlerts = false;
 
                //Открываем первый файл
                book = app.Workbooks.Open(this.xlsFname, Missing.Value, Missing.Value, Missing.Value
                                                  , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                                                 , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                                                , Missing.Value, Missing.Value, Missing.Value);
 
                //Открываем второй файл
                book1 = app1.Workbooks.Open(this.textBox1.Text, Missing.Value, Missing.Value, Missing.Value
                                                  , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                                                 , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                                                , Missing.Value, Missing.Value, Missing.Value);
 
 
                sheet = (Worksheet)book.Worksheets[1];
                range = sheet.get_Range("A1", Missing.Value);
                range = range.get_End(XlDirection.xlToRight);
                range = range.get_End(XlDirection.xlDown);
 
                sheet1 = (Worksheet)book1.Worksheets[1];
                range1 = sheet1.get_Range("A1", Missing.Value);
                range1 = range1.get_End(XlDirection.xlToRight);
                range1 = range1.get_End(XlDirection.xlDown);
 
                string downAddress = range.get_Address(
                    false, false, XlReferenceStyle.xlA1,
                    Type.Missing, Type.Missing);
 
                string downAddress1 = range1.get_Address(
                    false, false, XlReferenceStyle.xlA1,
                    Type.Missing, Type.Missing);
 
                range = sheet.get_Range("A1", downAddress);
                range1 = sheet1.get_Range("A1", downAddress1);
                object[,] values = (object[,])range.Value2;
                //object[,] values1 = (object[,])(range.Value2+range1.Value2);
                
 
                for (int i = 2; i <= values.GetLength(0); i++)
                {
                    for (int j = 1; j <= values.GetLength(1); j++)
                    {
                        //Здесь исключение
                        ((Range)sheet1.Cells[j, i + values.GetLength(0)]).Value2 = values[i, j].ToString();
                        progressBar2.Maximum = values.GetLength(0) * values.GetLength(1);
                        progressBar2.Value = i * j;
                    }
                }
                
                book1.Save();
            }
            catch (Exception e1)
            {
 
            }
            finally
            {
                range = null;
                sheet = null;
                if (book != null)
                    book.Close(false, Missing.Value, Missing.Value);
                book = null;
                if (app != null)
                    app.Quit();
                app = null;
 
                range1 = null;
                sheet1 = null;
                if (book1 != null)
                    book1.Close(false, Missing.Value, Missing.Value);
                book1 = null;
                if (app1 != null)
                    app1.Quit();
                app1 = null;
            }
        }
Подскажите пожалуйста, что я неправильно здесь делаю. За ответы заранее благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2010, 22:59
Ответы с готовыми решениями:

Объединение двух файлов с возможностью последующего разделения
Я объединяю два файла в один при помощи FileStream. Как мне определить где заканчивается один файл и начинается другой.

Чтение данных из .xls файлов, защищенных от редактирования
Необходимо прочитать данные из файлов Excel (*.xls), у которых установлена &quot;Защита структуры книги от редактирования&quot;. Пробовал...

Загрузка файлов xls на сервер
Добрый день коллеги. Столкнулся с такой проблемой. Моему сайту необходимо обменивать информацией с 1C:Предприятием через *.xls файлы. На...

3
8 / 8 / 1
Регистрация: 20.07.2010
Сообщений: 22
23.11.2010, 15:43
Может стоит делать в csv формате? И Excel будет открывать, и вся задача сведется к одной строке.

File.AppendAllText(f_file, File.ReadAllText(s_file));
1
22 / 22 / 3
Регистрация: 20.10.2010
Сообщений: 82
23.11.2010, 16:19  [ТС]
Спасибо. Попробую.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
23.11.2010, 21:28
range1 = range1.get_End(XlDirection.xlToRight);
range1 = range1.get_End(XlDirection.xlDown);


get_End - берет максимальный диапазон листа. Используй UsedRange

Два экземпляра Excel.Application - нет нужды запускать - можно один. Workbook-и будут разные.

А копировать ячейкт лучше с помощью методов Range:
Copy

и PasteSpecial

Добавлено через 8 минут
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
        #region Копирование одного листа в конец другого
        public static void excelCopyFooter(Excel._Worksheet src, Excel._Worksheet dest, int rowDest, int colDest, bool deleteSrc)
        {
            if (rowDest<1 || colDest<1)
                throw new Exception("Не правильно задан параметры (rowDest, colDest)");
            string s = src.UsedRange.get_Address(true, true,Excel.XlReferenceStyle.xlA1,Missing.Value,Missing.Value);
            s = "$A$1"+s.Substring(s.IndexOf(':'));
 
            Excel.Range oRng = src.get_Range(s,Missing.Value);
            Excel.Range oRng2 = dest.get_Range(dest.Cells[rowDest,colDest], dest.Cells[rowDest + oRng.Rows.Count, colDest + oRng.Columns.Count]);
            oRng.Copy(Missing.Value);
            oRng2.PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteAll,
                                  Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
                                  false, false);
            for (int i=0; i<oRng.Rows.Count; i++)
            {
                oRng = src.get_Range("A"+(i+1)+":A"+(i+1),Missing.Value);
                oRng2 = dest.get_Range("A"+(rowDest+i)+":A"+(rowDest+i),Missing.Value);
                double high = (double) oRng.EntireRow.RowHeight;
                oRng2.EntireRow.RowHeight = high; 
            }
            if (deleteSrc)
                src.Delete();
        }
        #endregion
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2010, 21:28
Помогаю со студенческими работами здесь

Создать страницу, на которую будут подгружаться данные из файлов формата .xls
Всем привет. Есть необходимость создать страницу (портал на sharepoint), на которую будут подгружаться данные из файлов формата .xsl. ...

Объединение двух файлов
Даны два двоичных файла с числами. Получить новый файл, в котором на четных местах будут стоять компоненты, которые стоят на четных местах...

Объединение двух файлов XML по ключам
Есть два файла XML: zap.xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;dataroot&gt; &lt;ZAP&gt; &lt;N_ZAP&gt;1&lt;/N_ZAP&gt; ...

Генерация файлов .doc из .xls
Доброго времени суток. Такая проблема приключилась. Нужно написать программное средство для генерации файлов .doc из .xls. Пока я...

Объединение файлов xls из каталога в один файл/таблицу
Добрый вечер. Подскажите, пожалуйста, как можно реализовать следующее: В папке есть файлы xls неограниченное количество каждый раз (от 1...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru