Имя: Пароль:
1C
1С v8
записать Excel через ADO число. (с сохранением числового формата)
,
0 EuVod
 
29.07.14
20:14
как обычно сорри за ламерство - в гугле явно не нашел (

Задача - выгружать поставщику отчетные данные в эксельный (97-2003) файл на разные листы (поэтому не канает сохранение в эксель табличного документа).

Решил записывать прямо в их эксельный шаблон. Делаться все должно на сервере регламентно, экселя там нет. И ставить туда ВК не хочется.

Побую через ADO.

Хоть через объект Command

Command.CommandText = "INSERT INTO [sales$] VALUES ('123','321')";
Command.Execute();

Хоть через объект REcordSet
...
REcordSet.AddNew();
REcordSet.Fields(1).Value = 1*100+1;


вставляет их как текст - ячейки имеют формат "текст" и зелененький треугольник (Число отформатировано как текст бла-бла). А нужно именно числа, чтобы дальше получатель крутил свои сводные таблицы и прочее.

Как это победить.
(пляски с бубном с предварительным форматированием ячеек в шаблоне не помогли.

Кто-нибудь знает более менее извращенный способ это победить?
1 EuVod
 
29.07.14
20:16
пока вырисовывается только такое извращение - в шаблонный исходный файл вставить "затравочную" первую строку данных (под шапкой с заголовками). Там прописать значения нужных форматов. Потом после выгрузки данных эту первую строку удалить... - надеюсь через DELETE оно именно удалит строку с листа (еще не пробовал)
2 EuVod
 
30.07.14
12:40
и так нельзя (((

Произошла исключительная ситуация (Microsoft JET Database Engine): Удаление данных в присоединенной (или связанной) таблице не поддерживается этим драйвером ISAM.

шожеделатьшожемнеделать

таки никто нез нает как через ADO записать в excel данные, чтобы он понял что они числового типа?
3 Jaap Vduul
 
30.07.14
12:51
>>вставляет их как текст - ячейки имеют формат "текст" и зелененький треугольник (Число отформатировано как текст бла-бла).

Ну так ты и вставляешь как текст, одинарные кавычки как бы недвусмысленно на это намекают:
...'123','321'...
4 EuVod
 
30.07.14
12:53
и с кавычками и без таже фигня..

если же перед вставляемыми строками уже есть числовые данные - то одинарные ковычки не препятсвуют тому, чтобы эксель понял что это именно числа.

Т.е. видимо проблема в том, что я не на пустойл ист вставляю - там есть заголвоки строковые и все новые строки вставляются как будто везде текст - т.е. драйвер отрабатывает гляда на значение в предыдущих строках.
засада
ну кто блин обменивается в таких форматах (((
5 Jaap Vduul
 
30.07.14
12:59
(4)
По умолчанию для определения типа столбцов драйвер ISAM сканирует первые 8 строк. Заголовки при этом не учитываются (если в строке подключения не указано HDR=No).
6 DrZombi
 
гуру
30.07.14
13:00
(5) Заполни таблицу через АДО, а уже через ком разрисуй её как душе угодно :)
7 EuVod
 
30.07.14
13:16
если б  у меня был на сервере com я бы сразу через него и заполнял уже, чтоб не париться. Тут не так важна производительность.
8 Ёпрст
 
30.07.14
13:18
(0)
>>VALUES ('123','321')
nen ns cnhjrb dcnfdkztim? f yt xbckf
9 EuVod
 
30.07.14
13:18
(5) вот-вот.. и все бы ничего, если драйвер позволял удалить строки - я б ему подсунул "затровочные", чтобы он правильно типы сделал, а потом бы удалил их. так нет - удалить не получается.. неужели без com никак необойтись
10 EuVod
 
30.07.14
13:19
(8)
ок. делаю так.

Command.CommandText = "INSERT INTO [sales$] VALUES (123,321)";


от этого вообще ничего не меняется
11 Jaap Vduul
 
30.07.14
13:23
(9)
Если у тебя шаблон фиксированный, используй в качестве источника данных не лист, а целевой диапазон ячеек.
12 Ёпрст
 
30.07.14
13:25
можешь через йоксель записать что угодно на любой лист, это всяко проще чем писать запрос с инсертом
13 Serginio1
 
30.07.14
13:25
14 EuVod
 
30.07.14
16:41
(13) чото я наверное туплю, но даже не удаеся создать лист, с жёстко определенным названием:
товар - движение по складу
пробелы и дефис заменяет на нижние подчеркивания.. А без этого нет смысла и во всем дальнейшем. (т.е. в параметры command передать типы колонок создаваемого листа, а имена этих колонок тоже все и с проблемами и запятыми и надо строго соблюсти).

(14) спасибо, инфа классная, но пока не смог приточить ее к этой конкретной задаче.
15 _fvadim
 
30.07.14
16:46
зачем? ado же не для отчётов.
чем com не угодил? и оформление можно поправить и листов сколько нужно сделать.
16 _fvadim
 
30.07.14
16:47
про отсутствие экселя не дочитал :(
17 _fvadim
 
30.07.14
16:52
а если данные выгружать на отдельный лист и в шаблон вкорячить хитрый макрос, который при открытии будет рассовывать данные по шаблону и удалять лист с данными?
18 EuVod
 
30.07.14
17:00
(17) какая-то жосткая схема ))

файлик-то открывать уже никто не будет - он будет уходить по электронке злым нехорошим людям, которые хотят чтоб все у них было красиво...
19 Serginio1
 
30.07.14
17:02
(14) Ты можешь создать таблицу, а затем переименовать.
20 EuVod
 
30.07.14
17:06
(19) переименовать чем? (я ведь не могу средствами ADO менять имена таблиц и полей)?
21 Serginio1
 
30.07.14
17:14
(20) Можно через excel.application
22 _fvadim
 
30.07.14
17:16
(18) вооот, он открывает и, как по волшебству, пустой отчёт заполняется циферками :)
23 _fvadim
 
30.07.14
17:17
* он - злой нехороший людь
24 Serginio1
 
30.07.14
17:17
Например через Worksheets(i).Name
http://www.sql.ru/forum/1089569/pereimenovanie-listov-v-excel-po-poryadku
25 _fvadim
 
30.07.14
17:18
(24) да нету там экселя
26 EuVod
 
30.07.14
17:48
вырисовалась такая дебильная схема:

в их шаблон под строкой с заголовками прописываю затравочную строку с данными в нужных форматах. recordset это хавает и "правильно" определяет типы. Прописываю из своего набора дынные начиная со второй строки данных (т.е. с 3й строки на листе),

а в затравочной строке просто через свойства
REcordSet.MoveFirst();   REcordSet.MoveNext(); - это встал на затравочную строку (1я это заголовки)

REcordSet.Fields(i).Value    = Val_i;

и прописываю туда то что нужно. В итоге вроде получаю правильный файл.
брррр
27 Garykom
 
гуру
30.07.14
18:24
(0) и (26) смотри http://habrahabr.ru/post/140352/
какая статейка полезная ))
тока там не пишут в xlsx а читают из него, но кто мешает наоборот писать?

В 1С все для этого есть и XML и ZIP ))

Заодно и перейдете от старого xls на новый xlsx ))
«Ну вы же понимаете! 21 век все-таки! Зачем нам хвататься за старое! Нужно одной ногой стоять в будущем!»

Вот захочется им (заказчикам) не тока таблички а еще и картинки с диаграммами или еще какой изврат типа формул ))
28 Garykom
 
гуру
30.07.14
18:26
(26) Еще вариант поставить вместо платного MS OFFICE бесплатный LibreOffice И работать через него, доков полно по OpenOffice

Это тоже более универсально и если сервак на linux будет работать ))
29 EuVod
 
30.07.14
18:29
(28) да вот отчего-то вообще не хочется ставить на сервер никакого доп.софта. в т.ч. и ОпенФоис
30 Garykom
 
гуру
30.07.14
18:33
(29) ну тогда только (27) или аналог средствами только 1С
31 EuVod
 
30.07.14
18:34
правда щаз какая-то другая трабла... когда сервером отрабатываю
выдает
Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.


хотя если на том же компе в толстом клиенте подключаюсь этой же строкой - то все ок.
что-то на 64 битном серваке не так...
32 EuVod
 
30.07.14
18:35
(27) у них еще не xlsx формат, а старый 2003 офиса...
33 Garykom
 
гуру
30.07.14
18:36
Вообще запись через ado в xls (как и чтение) это очень узкозаточенное решение.

На серваке на linux работать не будет - без wine ))

Ограничение на форматы и вид отчетов.

Т.е. да для скорости можно юзать, но только с большими типовыми данными, когда важны только данные без внешнего вида!
34 Garykom
 
гуру
30.07.14
18:37
(32) Конвертер для 2003 офиса бесплатен из xlsx, причем уверен что стоят уже счас любят в xlsx вместо xls посылать ))
35 Garykom
 
гуру
30.07.14
18:39
(31) ну не поставили ado на сервак, забыли ))
36 EuVod
 
30.07.14
18:45
у них там наверное автоматически формулы наверное собираются ))  в ТЗ грозно требуют!

стоит ado на серваке. запускаю на машине с серваком (даже от имени пользователя от которого 1с сервер запущен) тестовую обработку и с той же строкой подключения все делаю.. а сервак редиска не делает. (
37 EuVod
 
30.07.14
19:24
уже и 32битный ADO поставил и 64 битный, а сервак не хочет.
вот мне непонятно - если клиент подключается, а на этой же машине в серверной процедуре не подключается - это из-за 64-битного 1С сервера?

блин. опять же шожемнеделать
38 EuVod
 
30.07.14
20:07
после переустановки компонент ADO connection заработал, но перестало отрабатывать

REcordSet.Update()

Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC Excel Driver] Syntax error in INSERT INTO statement.
39 EuVod
 
30.07.14
20:14
АААА. блин. это я уже в строках подключения запутался. если сделать

"DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}

то пне апдейтит

а если Provider=Microsoft.ACE.OLEDB.12.0
то вроде заработало. (но почемуто только после переустановки.. чото наш админ неправильно поставил сначала))


Всве спасибо!
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс