|
0 / 0 / 1
Регистрация: 28.12.2016
Сообщений: 18
|
||||||
.NET 2.x Работа с xlsx файлами11.09.2017, 08:30. Показов 8377. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|