Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
.NET 2.x

Работа с xlsx файлами

11.09.2017, 08:30. Показов 8243. Ответов 38

Студворк — интернет-сервис помощи студентам
Добрый день!
Столкнулся с довольно интересной проблемой и решил спросить тут.
Что есть на входе: папка с *.xlsx файлами и папка с одним xlsx файлом. Необходимо для каждого файла из первой папки создать лист в документе из второй папки и скопировать всё содержимое туда. С excel из c# раньше не работал, поэтому это прямо таки настоящий вызов для меня. Пожалуйста, подскажите, чего почитать, в какую сторону смотреть? На данный момент имеется такой код:
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
using System;
using System.IO;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using System.Collections.Generic;
 
namespace xlsxcopy_wf
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        #region кнопки
        private void BtnChooseFolder_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dlg = new FolderBrowserDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                FolderTextBox.Text = dlg.SelectedPath;
            }
        }
 
        private void BtnChooseFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
                FileTextBox.Text = dlg.FileName;
        }
        #endregion
        private void BtnCopy_Click(object sender, EventArgs e)
        {
            string folder = FolderTextBox.Text;
            string[] files = Directory.GetFiles(folder, "*.xlsx");
 
            Microsoft.Office.Interop.Excel.Application excelapp = new Microsoft.Office.Interop.Excel.Application();
            foreach (var s in files)
            {
                excelapp.Visible = true;
                excelapp.Workbooks.Open(s);
                int row = 1;
                List<List<string>> maping = new List<List<string>>();
                Worksheet currentSheet = (Worksheet)excelapp.Workbooks[1].Worksheets[1];
                while (currentSheet.get_Range("A" + row).Value2 != null)
                {
                    List<string> tempList = new List<string>();
                    for (char column = 'A'; column < 'J'; column++)
                    {
                        Range cell = currentSheet.get_Range(column + row);
                        tempList.Add(cell != null ? cell.Value2.ToString() : "");
                    }
                    maping.Add(tempList);
                    row++;
                }
            }
 
        }
    }
}
То есть вроде как размапил и скопировал, а что с этим теперь делать и правильно ли делаю непонятно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2017, 08:30
Ответы с готовыми решениями:

OpenXml работа с .xlsx
Привет, как в данном коде сделать так, чтобы ячейки рисовались с автоподбором ширины столбца (чтобы все данные влезали в ширину ячейки), а...

Работа с файлами в формате .doc, .docx, .xls, .xlsx
Добрый день! Подскажите, есть ли какая-то альтернатива COM-объектам для извлечения текста из форматов .doc, .docx, .xls, .xlsx? ...

Работа с файлами xlsx
Код: import xlrd, xlwt file_obj = input('Введите путь к файлу: ') #/Users/markgurianov/Downloads/TMRCA.xlsx base_index...

38
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
11.09.2017, 09:34
*.csv - самый простой и быстрый способ работы с exel
1
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
11.09.2017, 10:36
Цитата Сообщение от EVG-1980 Посмотреть сообщение
*.csv - самый простой и быстрый способ работы с exel
Ой, как же не всегда. Как я с ним намучался в своё время.
Это и неправильно проставлены символы разрыва, особенно когда есть похожие символы в самом тексте ячейки, и непонятное обрезание символов переноса во время преобразования екселем в .csv файл.
Уж лучше тогда писать макросы в самом файле, который будет собирать кашу из разных файлов.
1
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
11.09.2017, 12:52  [ТС]
Цитата Сообщение от hoolygan Посмотреть сообщение
Уж лучше тогда писать макросы в самом файле, который будет собирать кашу из разных файлов.
Т.е. гораздо легче будет макрос сделать?
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
11.09.2017, 14:00
Не уверен.
Я не работаю с екселем посредством Interop. Либо через OleDB, либо через обертку, сделанную девекспресом. При этом я не работаю с ячейками, а работаю с таблицами, которые потом одним махом заливаю в файл, т.е. датасет => файл с постраничной разбивкой таблиц. А компонента уже заполняет всё за меня. Но это специфика купленной на работе компоненты, в Вашем случае, Вы, собственно и написали макрос, который построчно работает с каждой ячейкой, поэтому и предположил, что одинаково, а может и проще - не нужно отдельную программу писать ради такой операции.
0
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
11.09.2017, 15:50
Anexi, используйте библиотеку EpPlus. Бесплатное решение для работы с xlsx файлами, без всяких СОМ взаимодействий. Даже наличие установленного Excel не требуется. Простая и удобная штуковина. Несколько лет пользуюсь данной библиотекой - ни разу не сталкивался с проблемами.
3
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
11.09.2017, 17:06
я бы посоветовал

1. открыть книгу (Excel файл) в которую будете собирать данные (сборщик)
2. по очереди открывать книги (файлы Excel) из которых будете брать данные (файл источник)

а перенос данных делать копированием всего листа. Т.е. копируете целый лист из файла источника в файл сборщик. Думаю так будет быстрее, чем бегать по ячейкам.
2
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
12.09.2017, 08:02  [ТС]
Павлик Морозов, Pavel55, hoolygan,
Спасибо большое за советы, попробую и обязательно отпишусь.
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
12.09.2017, 17:36
Anexi,

Приблизительно вот так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            Excel.Application xlApp = new Excel.Application(); //Excel
            Excel.Workbook xlWB; //рабочая книга - куда будем копировать листы
            Excel.Workbook xlWBTemp; //рабочая книга - откуда будем копировать листы
            Excel.Worksheet xlSht; //лист Excel            
 
            xlWB = xlApp.Workbooks.Open(@"C:\C#\Куда собираем данные.xlsx"); //название файла Excel                                
            xlWBTemp= xlApp.Workbooks.Open(@"C:\C#\Откуда собираем данные.xlsx"); //название файла Excel      
 
            xlSht = xlWBTemp.Worksheets["Лист1"]; //название листа или 1-й лист в книге xlSht = xlWB.Worksheets[1];
            xlSht.Copy(After: xlWB.Worksheets[xlWB.Worksheets.Count]); //копируем лист после всех листов справа
 
            xlWBTemp.Close(false); //закрываем книгу, изменения не сохраняем
            xlApp.Visible = true; //отображаем Excel
            //xlApp.Quit(); //закрываем Excel
0
 Аватар для СвободныйНик
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 610
12.09.2017, 18:12
Anexi, поддерживаю совет Павлика Морозова про EpPlus - работает достаточно быстро и с любой сложностью таблиц и диаграм (примеры), единственное не нашел как выводить на печать.
Павлик Морозов, напиши, если знаешь как вывести на печать используя данную библиотеку.
0
 Аватар для Павлик Морозов
138 / 137 / 42
Регистрация: 26.10.2012
Сообщений: 443
12.09.2017, 20:48
СвободныйНик, из того, что я видел в исходниках библиотеки - никак
1
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
13.09.2017, 13:29  [ТС]
Pavel55, у меня почему-то ругается на строку
C#
1
xlSht = xlWBTemp.Worksheets["Лист1"];
Говорит не может преобразовать объект в лист

Добавлено через 16 секунд
Pavel55, у меня почему-то ругается на строку
C#
1
xlSht = xlWBTemp.Worksheets["Лист1"];
Говорит не может преобразовать объект в лист
0
5 / 6 / 0
Регистрация: 08.06.2017
Сообщений: 32
13.09.2017, 13:44
Anexi, какая версия офиса у вас? Может уже надо
C#
1
xlSht = xlWBTemp.Worksheets.Items["Лист1"];
0
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
13.09.2017, 14:37  [ТС]
FizeG, думаю ошибка где-то в коде у меня, мне VS пишет такую ошибку
Error CS0266 Cannot implicitly convert type 'object' to 'Microsoft.Office.Interop.Excel.Workshee t'. An explicit conversion exists (are you missing a cast?)
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
13.09.2017, 15:43
Anexi, в моём коде переменная xlSht объявлена как Excel.Worksheet xlSht;
А как она объявлена у вас?

C#
1
2
3
Excel.Worksheet xlSht; //лист Excel            
...
xlSht = xlWBTemp.Worksheets["Лист1"];

У вас есть такая строка в самом верху модуля?
C#
1
using Excel = Microsoft.Office.Interop.Excel;

P.S. Можно попробовать вот так xlSht = xlWB.Worksheets[1]; но не рекомендую, т.к. если лист будет вторым по счёту слева, то скопируется другой лист
0
5 / 6 / 0
Регистрация: 08.06.2017
Сообщений: 32
13.09.2017, 16:02
Anexi, прошу прощения, в моем прошлом сообщении одна буква лишняя.)
C#
1
xlSht = xlWBTemp.Worksheets.Item["Лист1"];
Можно попробовать конечно явно:
C#
1
xlSht = (Worksheet) xlWBTemp.Worksheets.Item["Лист1"];
Но вроде и так должно работать.

И да, в юзингах сверху гляньте, а то вдруг там ссылки на сборку нет, хотя по вашему коду в стартовом сообщении видно, что есть.)

Добавлено через 4 минуты
Anexi, на крайняк можно можно сжульничать:
C#
1
var myWorkSheet = (Worksheet) xlWBTemp.Worksheets.Item["Лист1"];
0
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
13.09.2017, 16:37  [ТС]
Pavel55, именно также объявлен лист. Ссылка тоже имеется.
Привожу полный код, который имеется на данный момент.
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
using System;
using System.IO;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
 
namespace xlsxcopy_wf
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
 
            //изначальные данные с текстбоксах
            FolderTextBox.Text = @"C:\Users\user\Documents\test";
            FileTextBox.Text = @"C:\Users\user\Documents\123.xlsx";
        }
        #region кнопки
 
        //кнопка для выбора папки
        private void BtnChooseFolder_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dlg = new FolderBrowserDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                FolderTextBox.Text = dlg.SelectedPath;
            }
        }
 
        //кнопка для выбора файла-сборщика
        private void BtnChooseFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
                FileTextBox.Text = dlg.FileName;
        }
        #endregion
        private void BtnCopy_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp = new Excel.Application(); //Excel
            Excel.Workbook xlWB; //рабочая книга - куда будем копировать листы
            Excel.Workbook xlWBTemp; //рабочая книга - откуда будем копировать листы
            Excel.Worksheet xlSht; //лист Excel
            string folder = FolderTextBox.Text;
            string[] files = Directory.GetFiles(folder, "*.xlsx");
 
            foreach (var s in files)
            {
                xlWB = xlApp.Workbooks.Open(FileTextBox.Text); //название файла Excel                                
                xlWBTemp = xlApp.Workbooks.Open(s); //название файла Excel      
 
                xlSht = xlWBTemp.Worksheets["Лист1"];//Название листа
                xlSht.Copy(After: xlWB.Worksheets[xlWB.Worksheets.Count]); //копируем лист после всех листов справа
 
                xlWBTemp.Close(false); //закрываем книгу, изменения не сохраняем
                xlApp.Visible = true; //отображаем Excel
            }
            xlApp.Quit(); //закрываем Excel
        }
    }
}
0
 Аватар для СвободныйНик
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 610
13.09.2017, 19:32
Anexi, добавь:

C#
1
2
3
4
Excel.Sheets xlShts;
...
xlShts = xlWB.Worksheets;
xlSht = (Excel.Worksheet)xlShts.get_Item("Лист1");
1
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
13.09.2017, 20:32
Да, попробуйте написать так

C#
1
xlSht = (Excel.Worksheet)xlWBTemp.Worksheets["Лист1"];//Название листа
А зачем вы эту строку поставили внутрь цикла?

C#
1
xlApp.Visible = true; //отображаем Excel
чтобы у вас Excel моргал? Эту строку вообще лучше убрать (или комментировать), если вы в конце делаете выход из Excel.

Обычно после всех манипуляций в Excel в конце всей обработки отображают Excel чтобы пользователь видел, что сделано. Но в цикл эту строку не нужно ставить. Это бессмысленно и замедляет работу программы
1
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
14.09.2017, 08:23  [ТС]
СвободныйНик, спасибо, заработало ) Теперь понятно почему ошибка была )
Pavel55, большое спасибо за помощь, для меня работа с Excel в C# это совершенно новый опыт, будем изучать )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2017, 08:23
Помогаю со студенческими работами здесь

Как работать с файлами doc, docx,xlsx
Видел библиотеку ActiveQt, ну там про DOC я даже не понимаю как с ним раьотать, есть мейби пример, кучу времени облегчит ну или есть у...

Xls и Xlsx библиотеки и компоненты для работы с файлами
Кто может посоветовать библиотеку или компоненты для работы с файлами (Xls и Xlsx). Желательно чтобы работать можно было без установки...

Есть ли какой-нибудь модуль для работы с XLSX файлами?
Спасибо большое, за развернутый ответ, теперь буду более детально учить Python. Подскажите пожалуйста, а есть ли какая нибудь библиотека,...

Работа с xlsx
Здравствуйте ув. форумчане. Сразу перейду к делу: Есть форма, в которой я рассчитываю те или иные формулы, которые впоследствии...

Быстрая работа с xlsx
Подскажите, плиз, какой способ работы с xlsx-файлами будет наиболее быстрым? Интересует поиск, удаление, замена (запись). По поводу...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru