Имя: Пароль:
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
то вроде заработало. (но почемуто только после переустановки.. чото наш админ неправильно поставил сначала))


Всве спасибо!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший