Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Denis
Зарегистрирован: 01.06.2011 Сообщения: 39
|
Добавлено: Ср Сен 19, 2012 15:24 Заголовок сообщения: |
|
|
эт означает что без вариантов и вытащить значения таким способом не получится? |
|
Вернуться к началу |
|
|
Mike Большой шоколадный орден
Зарегистрирован: 07.04.2011 Сообщения: 255
|
Добавлено: Ср Сен 19, 2012 16:33 Заголовок сообщения: |
|
|
Да вот не знаю, если честно... |
|
Вернуться к началу |
|
|
Denis
Зарегистрирован: 01.06.2011 Сообщения: 39
|
Добавлено: Ср Сен 19, 2012 16:58 Заголовок сообщения: |
|
|
Ладно, буду думать иные варианты
Спасибо |
|
Вернуться к началу |
|
|
Lidiya
Зарегистрирован: 17.10.2011 Сообщения: 9
|
Добавлено: Вт Сен 25, 2012 11:36 Заголовок сообщения: |
|
|
Добрый день!
А у меня при выполнении данного кода выдает ошибку
Nemoxur писал(а): | Код:
Alias last_row as Long;
execute xOcxFree(*);
ALIAS FileToOpen = @@xFile(Dlgopen "","",1,"Worksheet Files (*.xls)|*.xls||; *.xls","Открыть файл для импорта") AS string;
IF FileToOpen == '' THEN error;
ADODB.Connection as AutoCon;
ADODB.Recordset as AutoSet;
Excel.Application as Excel;
AutoCon.Open('@@xUtil{dsq}');
AutoSet.MaxRecords = 0;
AutoSet.CursorLocation = 1;
Excel.Workbooks.Open('FileToOpen');
Excel.Worksheets(1).Activate;
Execute xSql{$
DELETE FROM user_imp_excel
};
execute xocx{
last_row = Excel.ActiveSheet.Cells.SpecialCells(11).Row;
};
Execute xocx{
AutoSet.Open('user_imp_excel',:AutoCon,0,3,2);
};
local vb.Connection==&AutoCon;
local vb.DestTable==&AutoSet;
local vb.Excel==&Excel;
local vb.last=last_row;
vb{
For r = 1 To last
DestTable.AddNew
DestTable("str1") = Excel.ActiveSheet.Cells(r,1)
DestTable("str2") = Excel.ActiveSheet.Cells(r,2)
DestTable("str3") = Excel.ActiveSheet.Cells(r,3)
DestTable("str4") = Excel.ActiveSheet.Cells(r,4)
DestTable("str5") = Excel.ActiveSheet.Cells(r,5)
DestTable("str6") = Excel.ActiveSheet.Cells(r,6)
DestTable.MoveNext
Next
DestTable.UpdateBatch
};
AutoSet.Close;
AutoCon.Close;
Excel.Workbooks.Close;
execute xOcxFree(AutoSet,AutoCon,Excel);
RETURN Импорт был произведен успешно!;
browser{select str1,str2,str3,str4,str5,str6 from user_imp_excel;}; |
сама ошибка:
"Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB."
ругается именно на DestTable("str1") = Excel.ActiveSheet.Cells(r,1).
Кто-нибудь может помочь? |
|
Вернуться к началу |
|
|
zhenya17
Зарегистрирован: 04.02.2009 Сообщения: 190 Откуда: Кемерово
|
Добавлено: Пт Сен 28, 2012 13:29 Заголовок сообщения: |
|
|
Mike писал(а): | Вот оно что...
Ну сори тогда, я по сути гадал, так как проверить у меня не на чем =) | Хоть бы кофейную гущу использовал. Может, толку бы больше было |
|
Вернуться к началу |
|
|
Spartak
Зарегистрирован: 18.03.2010 Сообщения: 184
|
Добавлено: Вт Фев 26, 2013 08:40 Заголовок сообщения: |
|
|
Можно так попробовать:
Excel.Application as Excel;
vb{
Dim Ex
Set Ex = GetObject(, "Excel.Application")
Dim Sh
Set Sh = Ex.ActiveSheet
};
return @@vb{Sh.Cells(2,2).Value}; |
|
Вернуться к началу |
|
|
Green
Зарегистрирован: 20.09.2013 Сообщения: 32
|
Добавлено: Вс Дек 29, 2013 13:02 Заголовок сообщения: |
|
|
Я вот так делаю, норм работает)
vb.(:i){(i);
numtab = sh.cells(i, 2 ).value
fio = sh.cells(i, 3 ).value
dtb = sh.cells(i, 5 ).value
pay1 = sh.cells(i, 8 ).value
pay2 = sh.cells(i, 9 ).value
pay3 = sh.cells(i, 10).value
pay4 = sh.cells(i, 11).value
pay5 = sh.cells(i, 12).value
pay6 = sh.cells(i, 13).value
pay7 = sh.cells(i, 15).value
pay8 = sh.cells(i, 16).value
pay9 = sh.cells(i, 17).value
}; --vb
alias numtab == vb.numtab;
alias fio == vb.fio;
alias dtb == vb.dtb;
alias pay1 == vb.pay1;
alias pay2 == vb.pay2;
alias pay3 == vb.pay3;
alias pay4 == vb.pay4;
alias pay5 == vb.pay5;
alias pay6 == vb.pay6;
alias pay7 == vb.pay7;
alias pay8 == vb.pay8;
alias pay9 == vb.pay9; |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 181 Откуда: Санкт-Петербург
|
Добавлено: Пт Дек 09, 2022 10:25 Заголовок сообщения: |
|
|
Всё же метод считывания данных через ODBC DSN имеет ряд существенных недостатков:
1. Ограничения по формату, только xls определенных версий, xlsx вообще не понимает
2. Имя листа задается жестко
3. Надо каждому пользователю настраивать ODBC DSN for_xls или другой
Я для себя использую метод:
Код: | let FileName = '@@xFile(dlgopen ,"",0x8000c,"MS Excel Files (*.xls*)|*.xls*","Выберите файл ")';
if 'FileName' == '' then error;
con;
Excel.Application as Excel;
Excel.Visible=false;
Excel.Workbooks.Open(FileName[""]);
VB {
Dim Ex
Dim Sh
Set Ex = GetObject(,"Excel.Application")
Set Sh = Ex.Worksheets(1)
dim n
dim f1
dim f2
dim f3
dim f4
dim f5
dim f6
};
Con Считываем данные из Excel;
alias vb.n:=2;
while {0 == 0} then
{
vb {
f1 = Sh.Cells(n,1).Text
f2 = Sh.Cells(n,4).Text
f3 = Sh.Cells(n,5).Text
f4 = Sh.Cells(n,6).Text
f5 = Sh.Cells(n,7).Text
f6 = Sh.Cells(n,8).Text
n = n + 1
};
alias _str1 == VB.f1; --Num_tab
alias _str2 == VB.f2; -- вид
alias _str3 == VB.f3; -- тип
alias _str4 == VB.f4; -- с
alias _str5 == VB.f5; -- по
alias _str6 == VB.f6; -- коммент
if rtrim(_str1['']) = '' and rtrim(_str2['']) = '' and rtrim(_str3['']) = ''
and rtrim(_str4['']) = '' and rtrim(_str5['']) = '' and rtrim(_str6['']) = '' then goto _out;
};
|
Проглатываются любые Excel-файлы. xls, xlsx, xlsm, xlt*
Обращение к листу как по номеру, так и по имени.
Но, к сожалению, в базовых объектах в таком виде он почему-то не применяется. |
|
Вернуться к началу |
|
|
superjek
Зарегистрирован: 04.04.2022 Сообщения: 28
|
Добавлено: Пт Дек 09, 2022 17:33 Заголовок сообщения: |
|
|
1) Странно, у нас xlsx проглатывает. Видимо зависит от используемого драйвера
2) Пользователи работают на терминале, настроили один раз системный DSN - у всех все работает.
3) скорость импорта через ODBC быстрее на больших файлах.
4) Если нормальный Excel - не нужно конвертировать из строки в типы данных. Но нормальный он не всегда
Из минусов - на некоторых Excel драйвер с ума сходит и по кругу данные загружает, пока в ошибку не выпадет. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 181 Откуда: Санкт-Петербург
|
Добавлено: Пт Дек 09, 2022 17:36 Заголовок сообщения: |
|
|
XLSX теперь тоже открывается, драйвер доустановил.
Я, собственно, не против такого метода. Да и достаточно много импортов в рабочей базе, заточенных под for_xls.
Не устраивает по большей части только одно: Нельзя обращаться к листу книги по его номеру.
Код: | Execute xLogin
{Open {DSN=for_xls;UID=1;PWD=1;},
scan #ss
SELECT *
FROM [filename].[График$] NO_HINT
execute
{ ... };
|
Можно ли обойти это, не меняя метод работы с excel-файлом? |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|