1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
1 | |
Excel. Вставка строки с разделителями25.01.2016, 14:10. Показов 2322. Ответов 17
Метки нет (Все метки)
Здравствуйте!
Есть задача, сделать программку, которая формирует отчет. Сейчас я реализовал так, что каждая ячейка заполняется из динамического массива отдельно. А хочется, чтобы формировалась строка с разделителями #9 и ограничителем строк #13#10, а потом эта сформированная строка-таблица вставлялась бы на нужный лист excel. Но при xl.ActiveWorkbook.ActiveSheet.Range['A1:A1']:= str вся строка вставляется в указанную ячейку и значение обрамлено двойными кавычками(в строке формул). Пробовал через clipboard и задуманное получается. Но очень не хочется работать через буфер винды, т.к. составление отчета может занять несколько часов, в течение которых пользователь может пользоваться буфером и запороть отчет. Как можно вставить сформированную строку, как таблицу?
0
|
25.01.2016, 14:10 | |
Ответы с готовыми решениями:
17
Работа с Excel. Суть: Если номер строки в Excel четный тогда объеденяем эту ячейку с последующей. вставка строки Вставка строки Вставка строки, Excel |
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
25.01.2016, 15:04 | 2 |
Сообщение было отмечено boscher как решение
Решение
Сначала данные надо записать в вариантный массив, а затем этот массив целиком, одним действием, передать по нужным координатам на лист MS Excel.
Пример, как это делается: Экспорт StringGrid в Excel
1
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
25.01.2016, 15:22 [ТС] | 3 |
Спасибо!
Но по скорости получится тоже самое, что и заполнение из динамического массива. Нужно просто сделать вставку в ячейку без обрамления значения в кавычки, чтобы эксель учел char(9) и char(13) для перехода в другую ячейку. Таким способом можно выиграть кучу времени... Попробуйте вставить строку с разделителями char(9) и char(13) непосредственно в ячейку и просто встав на ячейку и вы поймете о чем я.
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
25.01.2016, 15:59 | 4 |
Нет - скорость будет на порядок выше. Причём, чем больше данных, тем больше будет выигрыш в скорости - в пользу использования вариантного массива.
Добавлено через 3 минуты Использование вариантного массива - это самый быстрый способ передачи данных в MS Excel.
1
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
26.01.2016, 16:48 [ТС] | 5 |
Почему может не закрываться Excel после использования этой функции? Он исчезает из процессов только после закрытия приложения.
Закрываю excel так: XL.ActiveWorkbook.Close; XL.Application.Quit; Эти операции никак не влияют на созданный ранее процесс...
0
|
4918 / 2786 / 855
Регистрация: 04.10.2012
Сообщений: 10,148
|
||||||
26.01.2016, 17:04 | 6 | |||||
boscher,
0
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
26.01.2016, 17:35 [ТС] | 7 |
Не помогло. Процесс висит, пока не закроешь приложение...
В функции ничего отвязывать не нужно? Добавлено через 18 минут Переделал функцию в процедуру и все стало ок. Может это из-за result'a функции?
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|||||||||||
27.01.2016, 08:07 | 8 | ||||||||||
Надо обнулить переменные, содержащие ссылки на интерфейсы. В этом случае интерфейсы будут освобождены и не будут удерживать в памяти связанные с ними объекты COM-сервера (это объекты MS Excel, в данном случае). Если переменные интерфейсов объявлены на локальном уровне (процедуры, функции, методы), то перед выходом управления из этого уровня, происходит их автоматическое обнуление и, как следствие - освобождение связанных интерфейсов. Если такие переменные объявлены на глобальном уровне, то для того, чтобы освободить интерфейсы до завершения программы, надо самостоятельно в нужном месте программы выполнить их обнуление.
Пример для случая, когда используются глобальные переменные. В программе надо стараться избавляться от использования глобальных переменных.
1
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
||||||
27.01.2016, 10:56 [ТС] | 9 | |||||
Немного изменил ваш код.
Получилась процедура с локальными переменными. В процедуре эксель сделал невидимым и отключил показ ошибок. В конце добавил сохранение в файл и закрытие книги и самого экселя. В таком виде программа при каждом нажатии кнопки создает процесс эксель, который закрывается только при закрытии самой программы. Пробовал и с видимым экселем и включенными ошибками. Результат тот же. Кажется, проблема в сохранении в файл...
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
||||||
27.01.2016, 12:55 | 10 | |||||
Судя по коду, COM-сервер MS Excel должен выгрузиться...
Там проблема может быть, только, если при сохранении возникло исключение. В этом случае последующие команды по выходу из MS Excel не будут выполнены. Для проверки. Прикладывают проект, где всё работает, как положено - COM-сервер MS Excel выгружается при выходе управления из метода TForm1.Button1Click(). В случае исключения при сохранении файла, окно MS Excel показывается и включается режим показа предупреждений.
1
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
27.01.2016, 13:28 [ТС] | 11 |
Спасибо! Но даже с вашим примером остается процесс excel. Проверял на нескольких ПК с разными версиями экселя(2010, 2013). Исключения при сохранении не возникали... Наверное, придется остановиться на версии с процедурой SgToExcel. Единственное неудобства при этом - форматирование диапазона...
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
27.01.2016, 13:40 | 12 |
Вообще-то, тот код, который я выложил - "железный". Т. е., использовался в разных ситуациях на разных компах - нигде такой проблемы никогда не возникало. Там и по теории не должно оставаться занятости COM-сервера.
Предлагаю для проверки в местных условиях запустить приложенные здесь программы, как есть - без перекомпиляции - прямо EXE файлы, которые лежат в архивах. Одна версия - для MS Office 1997-2003, вторая - для MS Office 2007 и выше. Коды отличаются только в строке № 97: расширение файла для MS Office 2003 - ".xls", для MS Office 2007 - ".xlsx".
0
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
27.01.2016, 13:52 [ТС] | 13 |
Ваши exe отрабатывают правильно, а вот созданный в моем rad xe7 почему-то нет.
В чем может быть проблема? Может знакомая ситуация была?
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
27.01.2016, 13:56 | 14 |
Почему в Delphi XE7 такая ситуация - не знаю... Вечером сегодня, когда до дома доберусь - проверю в одной из XE версий. Отпишусь о результатах.
1
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
27.01.2016, 16:36 [ТС] | 15 |
Кажется, что проблема тут - exCell.
Если указать диапазон в формате ['A1', 'F10'], то все ок. Если в формате [xl.cells[1,1], xl.cells[10,10]], то беда
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
28.01.2016, 13:33 | 16 |
Запустил программу, скомпилированную в Delphi XE7 - в самом деле, при каждом нажатии кнопки создаётся новый экземпляр COM-сервера MS Excel. И эти экземпляры выгружаются только при завершении программы. Видимо, баг, какой-то в этой версии...
1
|
1 / 1 / 1
Регистрация: 25.01.2016
Сообщений: 62
|
|
28.01.2016, 13:43 [ТС] | 17 |
Спасибо за все =)
Пока извращаюсь с Range['A1', 'F' + inttostr(y)]. Работает...
1
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
28.01.2016, 13:52 | 18 |
Понятно. Похоже на то, что в каких-то ситуациях, при передаче интерфейсов в качестве параметров, неверно работает подсчёт ссылок (на эти интерфейсы). В результате счётчик интерфейса оказывается не нулевой и интерфейс не выгружается. Соответственно - не выгружается связанный с ним COM-сервер...
0
|
28.01.2016, 13:52 | |
28.01.2016, 13:52 | |
Помогаю со студенческими работами здесь
18
Вставка скопированой строки в Excel Автоматическая вставка даты изменений строки в Excel Вставка элементов строки массива на лист Excel Из excel в txt с разделителями Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи | |||||
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
|
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
|
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
|
Параллельное программирование: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование
Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
|
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
|
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке
В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
|
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
|
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins
В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
|
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang
Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
|
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
|
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
|
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
|