|
записать 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 то вроде заработало. (но почемуто только после переустановки.. чото наш админ неправильно поставил сначала)) Всве спасибо! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |