|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
||||||
.NET 2.x Работа с xlsx файлами11.09.2017, 08:30. Показов 8287. Ответов 38
Добрый день!
Столкнулся с довольно интересной проблемой и решил спросить тут. Что есть на входе: папка с *.xlsx файлами и папка с одним xlsx файлом. Необходимо для каждого файла из первой папки создать лист в документе из второй папки и скопировать всё содержимое туда. С excel из c# раньше не работал, поэтому это прямо таки настоящий вызов для меня. Пожалуйста, подскажите, чего почитать, в какую сторону смотреть? На данный момент имеется такой код:
0
|
||||||
| 11.09.2017, 08:30 | |
|
Ответы с готовыми решениями:
38
OpenXml работа с .xlsx Работа с файлами в формате .doc, .docx, .xls, .xlsx
|
|
52 / 50 / 26
Регистрация: 15.06.2009
Сообщений: 390
|
|
| 15.09.2017, 14:06 | |
|
EVG-1980, насколько я понимаю, CSV не умеет хранить стили ячеек, ширины столбцов и т. д. Потому и неприемлем во многих случаях.
0
|
|
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
|
| 15.09.2017, 15:07 [ТС] | |
|
Тут ещё возник вопрос, можно ли как-то выбрать следующую пустую ячейку в столбце? Захотелось также дополнить код, чтобы на первый лист в книге-сборщике записывались названия тех книг, которые добавляю на новые листы.
0
|
|
|
52 / 50 / 26
Регистрация: 15.06.2009
Сообщений: 390
|
|||||||||||
| 16.09.2017, 00:21 | |||||||||||
|
Anexi, как вариант, можно узнать номер последней ячейки с данными в выбранном столбце и прибавить единицу:
Другой вариант:
0
|
|||||||||||
|
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
|
||||||
| 16.09.2017, 15:43 | ||||||
|
ещё вариант нахождения последней заполненной ячейки в столбце А (как пример)
P.S. Он ведёт поиск заполненной ячейки снизу вверху, это лучше, чем сверху вниз
0
|
||||||
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
|||||||||||
| 18.09.2017, 08:57 [ТС] | |||||||||||
|
Pavel55, Skorp24, опять то же самое, когда пытаюсь сделать так
Когда делаю по способу
0
|
|||||||||||
|
52 / 50 / 26
Регистрация: 15.06.2009
Сообщений: 390
|
||
| 18.09.2017, 10:10 | ||
|
0
|
||
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
|
| 18.09.2017, 10:16 [ТС] | |
|
Skorp24, так VS выдаёт исключение
The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG)
0
|
|
|
52 / 50 / 26
Регистрация: 15.06.2009
Сообщений: 390
|
||||||
| 18.09.2017, 10:37 | ||||||
|
Anexi,
xlShtName точно ненулевой? Добавлено через 2 минуты И в row правду возвращает мой способ?
0
|
||||||
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
||||||||
| 18.09.2017, 11:00 [ТС] | ||||||||
0
|
||||||||
|
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
|
|||||||||||
| 18.09.2017, 11:08 | |||||||||||
|
Надо либо так
то есть смотря какой объект вы применяете - Range или Cells, от этого и нужно отталкиваться как именно писать адрес ячейки Range["A1"].Value = "что-то" или Cells[номер_строки, номер_столбца].Value = "что-то"
0
|
|||||||||||
|
52 / 50 / 26
Регистрация: 15.06.2009
Сообщений: 390
|
||
| 18.09.2017, 11:21 | ||
|
0
|
||
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
||||||
| 19.09.2017, 16:50 [ТС] | ||||||
|
Вообще не понимаю, что делаю не так... xlShtName точно не пустой(проверкой выводится на TextBox на форме), файл Excel имеет данные в ячейке A1, и всё равно первый прогон цикла выдаёт 1048577.
Выложу код полностью, может где-то не так объявляю. Кликните здесь для просмотра всего текста
0
|
||||||
|
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
|
|
| 19.09.2017, 17:26 | |
|
Всё правильно, 1-й прогон всегда будет вам выдавать строку 1048577 так как вы используете End[Excel.XlDirection.xlDown].
Вам об этом говорили выше. Я вам дал вариант как избежать этого. Но вы всё равно решили использовать неподходящий для вас вариант. Что такое End[Excel.XlDirection.xlDown] - это сочетание клавиш Ctrl+стрелочка вниз. Попробуйте на пустом листе, вставить текст в ячейку А1, поставить на неё курсор и нажать Ctrl+стрелка вниз. Куда вы переместитесь? Правильно, в ячейку А1048577. Это и делает ваш код. Вам надо использовать вариант int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row +1; //первая пустая ячейка в столбца А а потом xlSht.Range["A" + row].Value = xlShtName; P.S. xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row; - означает встать на ячейку А1048577 и нажать клавишу Ctrl+стрелка вверх
1
|
|
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
||
| 20.09.2017, 12:45 [ТС] | ||
|
Pavel55, спасибо большое за разъяснения, теперь понятно что делают эти функции
Также хочу спросить, как правильно определить Excel.WorkBook.Cells[].End? У меня почему-то выдаёт ошибку на .End
0
|
||
|
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
|
|
| 20.09.2017, 14:02 | |
|
Anexi, У вас в самом верху программы должна быть такая строка
using Excel = Microsoft.Office.Interop.Excel;
0
|
|
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
|
| 20.09.2017, 14:51 [ТС] | |
|
Pavel55, есть такая
0
|
|
|
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
|
|
| 20.09.2017, 17:56 | |
|
А вы подключили COM библиотеки?
Microsoft Office XX.X Object Library (где ХХ.Х версия установленного офиса, у меня, например, 15.0) и Microsoft Excel XX.X Object Library (где ХХ.Х версия установленного офиса, у меня, например, 15.0) это в меню "Проект" - "Добавить ссылку..."
0
|
|
|
191 / 180 / 114
Регистрация: 28.07.2013
Сообщений: 610
|
||||||
| 20.09.2017, 18:07 | ||||||
|
Anexi, Pavel55, должно так работать:
1
|
||||||
|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
|
| 26.09.2017, 18:51 [ТС] | |
|
Всем спасибо, всё получилось
Если вдруг кому-то понадобится выкладываю проект целиком. Теперь буду пробовать сделать подобное в OpenXML, благо документации много ) Ещё раз всем спасибо за помощь!
0
|
|
| 26.09.2017, 18:51 | |
|
Помогаю со студенческими работами здесь
39
Как работать с файлами doc, docx,xlsx Xls и Xlsx библиотеки и компоненты для работы с файлами Есть ли какой-нибудь модуль для работы с XLSX файлами? Работа с xlsx Быстрая работа с xlsx Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
|
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 Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|