Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / HTML, JavaScript, VBScript, CSS Новый топик    Ответить
 Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
Здравствуйте!
Win7,Excel2003

Пытаюсь подключится к файлу как к источнику данных. Пока я точно указываю название листа- все в порядке:
var WshShell = new ActiveXObject( 'WScript.Shell' );
var  connection = new ActiveXObject("ADODB.Connection"),recordset = new ActiveXObject("ADODB.Recordset");
connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" +pppath+"; Persist Security Info=False;Extended Properties=Excel 8.0;");

        var rs = new ActiveXObject("ADODB.Recordset");
        var SQL = "select * from [Лист2$]";
        rs.Open(SQL, connection);
        if(rs.bof)
        {
            document.write('No Data Avaliable');
        } 

Но в реальных файлах могут быть и любые названия, и любые листы( в смысле может не быть Sheet(1) , как бы он не назывался). Как на месте Лист2 написать что-то вроде ActiveSheet? Варианты вида
var SQL = "select * from [ActiveSheet$]";
var SQL = "select * from ActiveSheet";

предсказуемо не срабатывают.
Заранее спасибо за помощь.
11 фев 19, 15:33    [21806537]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7513
IMHO:
https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/openschema-method?view=sql-server-2017
11 фев 19, 17:23    [21806689]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
SQLPowerUser
Member

Откуда: ссылка в профиле
Сообщений: 282
natalitvinenko,

на всякий случай, здесь 2 примера, как получить названия листов Excel
https://stackoverflow.com/questions/1397158/connect-to-excel-with-ado-dont-know-sheet-names
12 фев 19, 15:01    [21807481]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
SQLPowerUser,
проблема ж не в том, что я не могу найти все названия листов. Проблема в том, что я могу использовать файл Экселя только как источник данных. Я не могу в данной ситуации его загрузить, воспользоваться программами, свойствами и чем угодно вообще. Я могу только как вампир - прицепиться, вытащить данные и отвалиться. В реальной ситуации пользования программой я не знаю, какие там будут стоять Excel, какие версии и будут ли стоять вообще. Мой предприятие до войны приложило усилия , чтобы все, что у нас стоит на машинах, было лицензионно по максимуму. В результате у тех, кому не было нужно, стоят продукты типа Libre офиса, чего -то фриварного. Поэтому любая попытка выйти за драйвера, обезпечивающий связь как с базой данных, которые по умолчанию есть или могут быть легко поставлены, чревато тем, что программа просто не сможет работать. Просто сказать: не пашет? да поставь офис,- не получится.
Поэтому пока пришла к выводу, что легче убедить юзеров свои данные, у которых шапка, дизайн и т.п, всегда грузить в заранее розданный файл, на второй странице...ну пусть уже на второй... которого будут формулы, раскидывающие данные по правильным столбцам, а вверху будет правильная шапка из одной строки, для поедания как базы данных. Как-так на сейчас.
12 фев 19, 16:49    [21807643]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 984
natalitvinenko,
очень сомнительный подход использовать excel как морду для заполнения БД
14 фев 19, 10:13    [21809137]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
carrotik
Member

Откуда:
Сообщений: 1398
natalitvinenko,

.. сделайте в шаблоне файла большую кнопку "Сохранить как Excel 2003 XML" ... в этом формате могут сохранять все версии МС Офиса и Опен-Либре Офиса ... а VB Script может работать с XML ...
14 фев 19, 11:36    [21809244]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
waszkiewicz
natalitvinenko,
очень сомнительный подход использовать excel как морду для заполнения БД

Но эта мысля - не моя.
Дальше - больше. Листочек с формулами отменяется. Дано: дикий файл установленного формата, прям оттуда и читать. В связи с чем сразу начинаю гуглить, как принять как базу данных не целый лист, а кусок листа. Потом, при приеме листа в программу выяснилось, что часть текстовых данных она просто не читает. В самом Эксель , при возможности открыть, это борется формулами вида

=""&Лист2222!C7&""

Что делать в программе- не пойму.
18 фев 19, 15:42    [21813190]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7513
Что значит "не читает"? Что за бред, как такое может быть. "Не верю" ( C )

IMHO & AFAIK. Если объяснять аллегориями:

Взять старый инструмент - заржавелый молоток с маркой ODBC, им пытаются забивать шурупы. Шурупы входят тяжело, из дерева летят шепки.

Кто же виноват?

Решать или огранизационно: вместо шурупов использовать гвозди заранее согласованной длины и тольщины. Создать шаблон файла (выложить на скачивание), создать инструкцию по заполнению, если пользователь вместо прямых гвоздей подсовывает гнутые/ржавые гвозьди или шурупы - идет в пешее эротическое путешествие

Или взять современное средство: например Java и Apache POI и сделать свою hand-майд модель шуруповерта, приспособленную для шурупов Вашей марки с автодетектированием: шага резьбы, погнутости, ржавости и так далее....

Всего того же самого наверное можно и через ODBC добиться.... но будет это сложнее (в программирование), крайне медленно (во время выполнения) и скорее всего глукавее (зависит от того, из какой части тела растут верхнии конечности)
18 фев 19, 16:02    [21813248]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
carrotik
Member

Откуда:
Сообщений: 1398
natalitvinenko,

.. а у вас в руках только JScript/VBScript ... ? .. не совсем понятно, что вы называете программой .. если да, и если утвержденный формат файла Excel+2007 (т.е Open Document Format - xlsx), то этот файл можно распаковать архиватором, и получится уже готовый XML, с которым можно работать скриптовым языком текстовыми функциями ... Это, конечно, средневековье, но один раз сделать - потом заработает ...
18 фев 19, 17:17    [21813440]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
Leonid Kudryavtsev,
Про "не читает". В Excel периодически возникает такая зараза, такой глюк, когда стоит в ячейке число, которое вдруг перестает пониматься как число или текст, который отказывается быть текстом. Манипуляции с форматом в таком случае бессмысленны- можно сколько угодно тыкать в числовой или текстовый, не взлетит. Лечится для числа это , например. созданием в другой ячейке формулы вида
=ЯчейкаХ +0
Ну то есть явно ткнуть Excel мордой- это число, слышишь, это -число! И потом уже манипулировать с ним. Для текста шаманские действия выглядят как &"".
При попытке вот такое считать из рекордсета, заполненного данными Excel, оно упорно распознает данные как null. Из одного файла нормально читает, из другого- нет. У меня уже мозги за сегодня поднимаются.
Еще ситуация- дочитывает до определенной строки и все. Всю таблицу брать отказывается, останавливается где-то даже не посередине.
19 фев 19, 16:52    [21814556]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7513
natalitvinenko
Про "не читает". В Excel периодически возникает такая зараза, такой глюк, когда стоит в ячейке число, которое вдруг перестает пониматься как число или текст, который отказывается быть текстом...


Проблема с форматом в Excel сталкивался, но обычно они объясняются вполне обычными вещами (например кто-то non break space пробел (или другой символ) в числовую ячейку забил, на экране не видно, а ячейка стала текстовая; с датами/страками тоже весело бывает, когда число или строчку вида 20.03 Excel "внезапно" начинает считать 20 марта etc..etc...)
19 фев 19, 17:48    [21814649]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
Изопропил
Member

Откуда:
Сообщений: 31028
jet - не лучшее средство для импорта данных из Excel
19 фев 19, 19:45    [21814792]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
hVostt
Member

Откуда:
Сообщений: 15267
Изопропил
jet - не лучшее средство для импорта данных из Excel


Зато быстрое. Но самое быстрое, что я видел в своей жизни, и способное переваривать такие эксели, на которых другие решения вешают намертво машину, это продукт от Aspose.
19 фев 19, 22:01    [21814928]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
Попыталась применить IMEX=1. IMEX=1 помогает частично:-) В одном столбце все наладилось(а были null), в двух других пишет нули- а там цифири.
connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" +pppath+"; Persist Security Info=False;Extended Properties='Excel 8.0;HDR=YES;IMEX=1';");


И дурацкий вопрос. Если название листа с пробелами, как писать запрос?
Вот так понятно
var SQL = "select * from [Лист2$C6:S5000]";

А если лист называется "Шото и шото"? Варианты
var SQL = "select * from [Шото и шото$C6:S5000]";
var SQL = "select * from ['Шото и шото'$C6:S5000]";
var SQL = "select * from [[Шото и шото]$C6:S5000]";

не сработали.
20 фев 19, 16:50    [21815595]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
natalitvinenko
Попыталась применить IMEX=1. IMEX=1 помогает частично:-) В одном столбце все наладилось(а были null), в двух других пишет нули- а там цифири.

Нашла решение этой проблемы, вот - https://jingyangli.wordpress.com/2009/02/13/imex1-revisit-and-typeguessrows-setting-change-to-0-watch-for-performance/
Скопирую сюда
When we import mixed type data in a column from excel to SQL server, we may have issues with losing some data. We can set IMEX=1 to allow the incoming column allow mixed data types based on the Registry setting ImportMixedTypes to Text. However, there is a default setting for Excel to Guess Data Type of a column, the default value is 8.(The ISAM driver by default looks at the first eight rows and from that sampling determines the datatype.) We can change this value to 0 to force Excel to check all values in the column to choose the data type for the column.

Here is the registry setting we need to check:

Type Regedit from Run… command:

Under entries

Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows
Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/ImportMixedTypes

Change:
TypeGuessRows: 0 —-Check all column values before choosing the appropriate data type.ImportMixedTypes: Text —-import mixed-type columns as text.

Connection string:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\data\Book1.xls;Extended Properties="EXCEL 8.0;IMEX=1;HDR=YES";

–Or:

SELECT * FROM OPENROWSET(‘Microsoft.Jet.OLEDB.4.0’, ‘Excel 8.0;IMEX=1;HDR=YES;Database=C:\data\Book1.xls;’, ‘select * from [Sheet1$]’)

We are using IMEX=1, the Import Mode, in the connection string to apply the registry setting.

PS:

The possible settings of IMEX are: 0,1,2.

(0 is Export mode 1 is Import mode 2 is Linked mode (full update capabilities))





http://support.microsoft.com/kb/194124

http://support.microsoft.com/kb/189897
21 фев 19, 15:36    [21816519]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7513
hVostt
Зато быстрое....

Не верю ( C )

Нечему там быть быстрым.
А если действительно, по бизнесу, в одной колонке может быть "мешанина". Например табличка с группировками, подзаголовками (merge cells) и итогами. Я даже не представляю, как с помощью plain SELECT'а такие данные можно будет разпарсить.

natalitvinenko
Нашла решение этой проблемы, вот - https://jingyangli.wordpress.com/2009/02/13/imex1-revisit-and-typeguessrows-setting-change-to-0-watch-for-performance/
Скопирую сюда

Спасибо.
21 фев 19, 16:41    [21816596]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
hVostt
Member

Откуда:
Сообщений: 15267
Leonid Kudryavtsev
Не верю ( C )

Нечему там быть быстрым.


работа с данными vs работа с DOM деревом. действительно, чему там быть быстрым ))


Leonid Kudryavtsev
А если действительно, по бизнесу


требования нужны. а то дойдёт так до того, что "по бизнесу" там могут быть джипеги.
21 фев 19, 22:02    [21816893]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
Изопропил
Member

Откуда:
Сообщений: 31028
hVostt,

Excel 2003, откуда там DOM дерево?
21 фев 19, 22:56    [21816913]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
hVostt
Member

Откуда:
Сообщений: 15267
Изопропил
hVostt,

Excel 2003, откуда там DOM дерево?


точняк я путаю с excel'97
21 фев 19, 23:05    [21816918]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
Продолжаю отвечать на свои вопросы:-)
natalitvinenko
И дурацкий вопрос. Если название листа с пробелами, как писать запрос?
Вот так понятно
var SQL = "select * from [Лист2$C6:S5000]";

А если лист называется "Шото и шото"? Варианты
var SQL = "select * from [Шото и шото$C6:S5000]";
var SQL = "select * from ['Шото и шото'$C6:S5000]";
var SQL = "select * from [[Шото и шото]$C6:S5000]";

не сработали.


Долго я смеялась и теперь рассказываю как анекдот- вообще никаких ограничителей ставить не надо:-)
var SQL = "select * from [Шото и шото$C6:S5000]";

Все - таки вот этот вариант прошел.
1 мар 19, 10:05    [21822443]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к Excel- файлу из jscript - если имя листа неизвестно.  [new]
natalitvinenko
Member

Откуда: Донецк
Сообщений: 734
natalitvinenko
natalitvinenko
Попыталась применить IMEX=1. IMEX=1 помогает частично:-) В одном столбце все наладилось(а были null), в двух других пишет нули- а там цифири.

Нашла решение этой проблемы, вот - https://jingyangli.wordpress.com/2009/02/13/imex1-revisit-and-typeguessrows-setting-change-to-0-watch-for-performance/
Скопирую сюда
When we import mixed type data in a column from excel to SQL server, we may have issues with losing some data. We can set IMEX=1 to allow the incoming column allow mixed data types based on the Registry setting ImportMixedTypes to Text. However, there is a default setting for Excel to Guess Data Type of a column, the default value is 8.(The ISAM driver by default looks at the first eight rows and from that sampling determines the datatype.) We can change this value to 0 to force Excel to check all values in the column to choose the data type for the column.
.....

http://support.microsoft.com/kb/194124

http://support.microsoft.com/kb/189897


Вдогонку сама себе- вдруг у кого такое будет. Это работает только на файлы xls, на xlsx это не поможет в чистом виде. Я еще дополнительно по реестру полазила и заменила в слове TypeGuessRows 8 на 0, там еще два места, иначе драйвер Microsoft.ACE.OLEDB.12.0 не воспримет изменений и продолжит ограничиваться 8 столбцами.
30 мар 19, 17:31    [21847901]     Ответить | Цитировать Сообщить модератору
Все форумы / HTML, JavaScript, VBScript, CSS Ответить