|
|
|
v7: Сохранение в .xlsx | ☑ | ||
|---|---|---|---|---|
|
0
vladko
27.10.25
✎
14:52
|
Привет всем. До сих пор поддерживаю самописную конфигурацию на 7.7. Для сохранения больших отчетов используется инструмент сохранения в таблицы XLS от Che Burashka. А есть ли решение, чтобы сохранять сразу в XLSX?
|
|||
|
1
Злопчинский
27.10.25
✎
15:04
|
есть, поройся там на ИС
что-то типа "в эксель одной строкой" . и то, что ты упомянул в (0) - ему сто лет в обед (но все равно спасибо что юзаешь ее ;-) можно перехватить "при сохранении" и сохранять через табличный документ йокселя |
|||
|
2
maxab72
27.10.25
✎
15:00
|
можно через excel. соединиться ним по com.
|
|||
|
3
Злопчинский
27.10.25
✎
15:05
|
https://infostart.ru/1c/tools/1026032/
Внешняя компонента, умеет сохранять таблицы в формате xlsx, html и PDF. При загрузке перехватывает штатное интерактивное и программное сохранение в Excel, HTML и TXT. В диалоге выбора файла заменяет вариант выбора ".xls" на ".xlsx" и ".txt" на "PDF" |
|||
|
4
Злопчинский
27.10.25
✎
15:06
|
сохраняй в xls, а расширение делай xlsx
$-) для тех кто обрабатывает эксель интерактивно - разницы не будет ;-) |
|||
|
5
vladko
27.10.25
✎
15:10
|
(2) как вариант - надо обдумать :)
|
|||
|
6
Злопчинский
27.10.25
✎
15:10
|
тут еще вякого полезного/неочевидного по мелочи
https://forum.dorex.pro/index.php?topic=191.0 |
|||
|
7
vladko
27.10.25
✎
15:11
|
(3) - хорошее решение, надо будет присмотреться и скорее всего приобрести
|
|||
|
8
vladko
27.10.25
✎
15:15
|
Спасибо за помощь!
|
|||
|
9
Sserj
27.10.25
✎
15:17
|
(7) Приобрести конечно полезно. Но там же в истории изменений последним пунктом сказано. Так как не пользуется популярностью забирайте все как есть:
https://github.com/DmitryDreytser/v7Moxel |
|||
|
10
vladko
27.10.25
✎
15:42
|
(9) Премного благодарен!
|
|||
|
11
Garykom
гуру
27.10.25
✎
15:55
|
||||
|
12
vladko
27.10.25
✎
16:34
|
Скачал исходники по ссылке из (9).
При попытке запустить register.cmd пишет, что нет в папке v7Moxel.dll :( Кто-нибудь можете прислать эту ДЛЛку на 73z2bpwehynq@mail.ru ? |
|||
|
13
Bigbro
27.10.25
✎
16:34
|
я большие отчеты сохранял в mxl а потом файл конвертором переводил в xlsx
намного быстрее получалось чем xls выгружать. |
|||
|
14
Sserj
27.10.25
✎
16:45
|
(12) Это же гитхаб, там есть ссылка Releases.
качаешь последний релиз Release.v0.12.zip, там в архиве все есть. https://github.com/DmitryDreytser/v7Moxel/releases |
|||
|
15
craxx
27.10.25
✎
17:40
|
(0) Лет этак 12 назад пользовался Йокселем.
После в 7.7 не работал. https://forum.infostart.ru/forum28/topic182580/ |
|||
|
16
vladko
27.10.25
✎
18:26
|
(14) Спасибо. Буду знать :)
|
|||
|
17
MWWRuza
гуру
28.10.25
✎
22:59
|
У меня, как-то так:
Процедуры/Функции в глобальном модуле// *************************ФункцииДляСокраненияВ_EXEL-2007****************
Функция ПодготовитьСтрокуКПечати(лСтрока)
лРез = СокрЛП(лСтрока);
лРез = СтрЗаменить(лРез,"'","");
Возврат лРез;
КонецФункции
Функция ЭксельADO_Подключиться(лПутьКФайлу, ЧитЗаг = 0) Экспорт
Если ЧитЗаг = 0 Тогда
СтрокаПодключения = "
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source='" + лПутьКФайлу + "';
|Extended Properties=""Excel 12.0 xml; HDR=YES"";";
Иначе
СтрокаПодключения = "
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source='" + лПутьКФайлу + "';
|Extended Properties=""Excel 12.0 xml; HDR=NO"";";
КонецЕсли;
Попытка
// Создаем соединение
ConnectionXLSX = СоздатьОбъект("ADODB.Connection");
ConnectionXLSX.Open(СтрокаПодключения);
CommandXLSX = СоздатьОбъект("ADODB.Command");
CommandXLSX.ActiveConnection = ConnectionXLSX;
CommandXLSX.CommandType = 1;
Исключение
Сообщить("Ошибка подключения к файлу Excel: " + ОписаниеОшибки());
Возврат 0;
КонецПопытки;
Возврат 1;
КонецФункции
Процедура ЭксельADO_Отключиться() Экспорт
Состояние("Запись файла");
CommandXLSX = 0;
Попытка
ConnectionXLSX.Close();
Исключение
КонецПопытки;
ConnectionXLSX = 0;
КонецПроцедуры
Функция СоздатьТаблицуСКолонками(ТЗ, ИмяЛиста, БезЗаголовков = 0) Экспорт // Добавлен параметр БезЗаголовков
СчКол = 0;
СтрДанных = "";
Если (ТЗ.КоличествоСтрок() = 0) И (БезЗаголовков = 1) Тогда
Возврат 0;
КонецЕсли;
Для СчКол = 1 По ТЗ.КоличествоКолонок() Цикл
Тип = "";
Размер = "";
Точн = "";
Заг = "";
ТЗ.ПолучитьПараметрыКолонки(СчКол, Тип, Размер, Точн, Заг);
Если БезЗаголовков = 1 Тогда
Заг = СокрЛП(ТЗ.ПолучитьЗначение(1, СчКол));
КонецЕсли;
Если Тип = "Число" Тогда
Если ПустоеЗначение(Точн) = 0 Тогда
Если Точн > 0 Тогда
ТипКол = "float";
Иначе
ТипКол = "int";
КонецЕсли;
Иначе
ТипКол = "int";
КонецЕсли;
Иначе
ТипКол = "char(" + Размер + ")";
КонецЕсли;
СтрДанных = СтрДанных + "[" + Заг + "] " + ТипКол + ", ";
КонецЦикла;
СтрДанных = СокрЛП(СтрДанных);
ДлинаСтрДанных = СтрДлина(СтрДанных);
СтрДанных = Лев(СтрДанных, ДлинаСтрДанных - 1);
СтрКоманды = "CREATE TABLE [" + ИмяЛиста + "] (" + СтрДанных + ")";
CommandXLSX.CommandText = СтрКоманды;
CommandXLSX.Execute();
Возврат 1;
КонецФункции
Процедура ЭксельADO_ПечатьСтрок(ТЗ, ИмяЛиста, БезЗаголовков = 0, ЕстьШабл = 0) Экспорт
Перем НазваниеКолонки, ШиринаКолонки, ТипПеременной, ДлинаПеременной,ФорматСтроки;
Если ТЗ.КоличествоСтрок() = 0 Тогда
Возврат;
КонецЕсли;
ВсегоСтрок = ТЗ.КоличествоСтрок();
СчСтр = 0;
СтарПроц = 0;
Состояние("Идет вывод файла Excel, ожидайте...");
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
СчСтр = СчСтр + 1;
Если СчСтр = 1 Тогда
Если ЕстьШабл = 0 Тогда
СоздатьТаблицуСКолонками(ТЗ, СокрЛП(ИмяЛиста), БезЗаголовков);
Если БезЗаголовков = 1 Тогда
Продолжить;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ВывСтр = СчСтр;
ПроцентВыполнения = Окр(ВывСтр / ВсегоСтрок * 100);
Если СтарПроц <> ПроцентВыполнения Тогда
ТекстСостояния = Шаблон("Вывод в файл Excel: [ПроцентВыполнения]% ([СчСтр]/[ВсегоСтрок])");
Состояние(ТекстСостояния);
СтарПроц = ПроцентВыполнения;
КонецЕсли;
лСписокЗначенийКолонок = СоздатьОбъект("СписокЗначений");
лСтрокаПараметров = "";
Для НомерКолонки = 1 По ТЗ.КоличествоКолонок() Цикл
ИдентификаторКолонки = ТЗ.ПолучитьПараметрыКолонки(НомерКолонки,ТипПеременной,ДлинаПеременной,,НазваниеКолонки,ШиринаКолонки,ФорматСтроки);
Если ШиринаКолонки <> -1 Тогда
ЗначениеЯчейки = ТЗ.ПолучитьЗначение(СчСтр,НомерКолонки);
Если ТипПеременной = "Число" Тогда
Если ДлинаПеременной = 1 Тогда
лСтрокаПараметров = лСтрокаПараметров + "'" + ?(ЗначениеЯчейки = 0,"ОК", "Ошибка") + "', ";
Иначе
ПечЗначение = Формат(ЗначениеЯчейки, ФорматСтроки);
лСтрокаПараметров = лСтрокаПараметров + ПечЗначение + ", ";
КонецЕсли;
ИначеЕсли ТипПеременной = "Документ" Тогда
Попытка
ПечЗначение = ЗначениеЯчейки.НомерДок;
Исключение
ПечЗначение = "";
КонецПопытки;
лСписокЗначенийКолонок.ДобавитьЗначение();
лСтрокаПараметров = лСтрокаПараметров + "'" + ПодготовитьСтрокуКПечати(ПечЗначение) + "', ";
ИначеЕсли ТипПеременной = "Дата" Тогда
ПечЗначение = ?(ПустоеЗначение(ЗначениеЯчейки) = 1, "", Формат(ЗначениеЯчейки,"Д ДДММГГГГ"));
лСтрокаПараметров = лСтрокаПараметров + "'" + ПечЗначение + "', "
ИначеЕсли ТипПеременной = "Строка" Тогда
ПечЗначение = СокрЛП(ЗначениеЯчейки);
лСтрокаПараметров = лСтрокаПараметров + "'" + ПодготовитьСтрокуКПечати(ПечЗначение) + "', ";
Иначе
ПечЗначение = ЗначениеЯчейки;
лСтрокаПараметров = лСтрокаПараметров + "'" + ПодготовитьСтрокуКПечати(ПечЗначение) + "', ";
КонецЕсли;
КонецЕсли;
КонецЦикла;
лСтрокаПараметров = Лев(лСтрокаПараметров, СтрДлина(лСтрокаПараметров) - 2); //убираем последнюю запятую
CommandXLSX.CommandText = "INSERT INTO [" + ИмяЛиста+ "$] VALUES (" + лСтрокаПараметров + ")";
CommandXLSX.Execute();
КонецЦикла;
КонецПроцедуры
Функция Excel2007вТЗ(Файл) Экспорт
Рез = ЭксельADO_Подключиться(СокрЛП(Файл), 1); // второй параметр - читать заголовки
Коннект = ConnectionXLSX;
axCatalog = СоздатьОбъект("ADOX.Catalog");
axCatalog.ActiveConnection = ConnectionXLSX;
ListName = axCatalog.Tables.Item(0).Name;
Коннект.CursorLocation = 3; // х.з. за чем, но без этого не верно определяет количество строк на листе...
ТекстЗапроса = "SELECT * FROM [" + ListName + "]";
RS = СоздатьОбъект("ADODB.Recordset");
RS.Open(ТекстЗапроса, Коннект);
Если (RS.EOF = 1) ИЛИ (RS.BOF = 1) Тогда
Сообщить("Нет строк в документе Excel!");
// Закрытие объектов.
RS.Close();
ConnectionXLSX.Close();
RS = 0;
ConnectionXLSX = 0;
КонецЕсли;
КолвоКолонокExcel = RS.Fields.Count;
ТЗ = СоздатьОбъект("ТаблицаЗначений");
СчКол = 0;
Для СчКол = 1 По КолвоКолонокExcel Цикл
ИмяКол = СокрЛП(RS.Fields.Item(СчКол - 1).value);
ПозДвоеточия = Найти(ИмяКол, ":");
Если ПозДвоеточия > 0 Тогда
ИмяКол = Лев(ИмяКол, ПозДвоеточия - 1);
КонецЕсли;
ИмяКол = СтрЗаменить(ИмяКол, "-", "");
ТЗ.НоваяКолонка(ИмяКол);
КонецЦикла;
RS.MoveNext();
КолвоСтрокExcel = RS.RecordCount + 1;
НомерСтроки = 0;
Пока RS.EOF() = 0 Цикл
НомерСтроки = НомерСтроки + 1;
ТЗ.НоваяСтрока();
СчКол = 0;
Для СчКол = 1 По КолвоКолонокExcel Цикл
ТЗ.УстановитьЗначение(НомерСтроки, СчКол, RS.Fields.Item(СчКол - 1).Value);
КонецЦикла;
RS.MoveNext(); // СледующаяСтрока.
КонецЦикла;
// Закрытие объектов.
RS.Close();
ConnectionXLSX.Close();
RS = 0;
ConnectionXLSX = 0;
Возврат ТЗ;
КонецФункции
// Конец********************ФункцииДляСокраненияВ_EXEL-2007****************Вызываю на сохранение: //Делаем заполнение ТЗ на основе полученных данных Если ЭксельADO_Подключиться(ИмяФайлаЭксель) = 0 Тогда Предупреждение("Ошибка подключения к Excel-файлу!",30); Возврат 0; КонецЕсли; Потом в цикле по ТЗ: ЭксельADO_ПечатьСтрок(ТЗ, "Данные", Сч); На чтение: ТЗ = Excel2007вТЗ(ОткрФайл); Да, немного замороченные функции работы через ADO в ГМ... Но, без вских ВК и т.п... Работает - мгновенно. И использовать просто. |
|||
|
18
MWWRuza
гуру
28.10.25
✎
22:49
|
Это программно. А Интерактивно, из меню печати - как в (1)... Но, это у меня больше для PDF используется, типа сразу любую ПФ сохраняю в PDF. Работает, давно и хорошо.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |