Список листов *.xls "нестандартно"

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Список листов *.xls "нестандартно"

Сообщение SergT » 16.10.2007 (Вт) 22:00

Доброе время суток всем жителям форума.
Вопрос мой может показаться дурацким, но...
Как получить список имен листов xls файла (~ 3Mb), который лежит в локальной сети, НЕ ИСПОЛЬЗУЯ :
1) New Excel.Application
2) DAO

На компе не установлен MS Ofice. Подключение через DAO выдает ошибку, если другой юзер открыл файл для редактирования.

Получить список листов, собственно, могу вручную - открыв файл xls блокнотом. Там все имена лежат в конце файла. Хотел получить это через Open for input #1, но , к своему стыду, получил фигу.
Очень надеюсь на вашу помощь.
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Список листов *.xls "нестандартно"

Сообщение SSecurity » 16.10.2007 (Вт) 22:09

SergT писал(а):Получить список листов, собственно, могу вручную - открыв файл xls блокнотом. Там все имена лежат в конце файла. Хотел получить это через Open for input #1, но , к своему стыду, получил фигу.
Очень надеюсь на вашу помощь.


А ты попробуй через OPEN .. For BINARY as 1 если конечно тебя прильщает такой вариант.
(в пременную MyVal забираешь где-то 10 -20 кБ с конца ищешь текст Worksheets, все после отрезаешь, оно не нужно ... и все что ДО осталось анализируешь в пределах 1 кБ :)) можешь из переменной сразу MyVal = Replace(MyVal, chr(0),"")

Второй вариант через ADO. Также как ты можешь создать DSN для файла точно также коннектишься и перебираешь его листочки :)

С Уважением,
Сергей
Последний раз редактировалось SSecurity 16.10.2007 (Вт) 22:17, всего редактировалось 1 раз.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Re: Список листов *.xls "нестандартно"

Сообщение SergT » 16.10.2007 (Вт) 22:14

SSecurity писал(а):А ты попробуй через BINARY если конечно тебя прильщает такой вариант.

Попробую, но никогда таким не пользовался

SSecurity писал(а):Второй вариант через ADO. Также как ты можешь создать DSN для файла точно также коннектишься и перебираешь его листочки :)

Думаю, что проблема с доступом останется, когда кто-то редактирует файл :(
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 16.10.2007 (Вт) 22:23

КОД ПОДПРАВИЛ



Код: Выделить всё

Dim MyVal as String * 20000
FileName = "C:\Test.xls"
X = FileLen(FileName)
Open FileName For BINARY as #1
  GET #1, X - len(myVal), myVal
Close
PP = Instr(1,myVal, "Worksheet")
if PP = 0 then
  msgbox "надо кусок больше забирать"
else
  'урезали до воркшита
  myVal2 = left$(myVal,PP-1)
  'тут уже обрабатываешь выковыривая удобчитаемые слова
  'у меня где-то за 5 тыс символов до конца он встречается
 
end if
Последний раз редактировалось SSecurity 16.10.2007 (Вт) 22:31, всего редактировалось 1 раз.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 16.10.2007 (Вт) 22:29

Спасибо, завтра испробую. Задача облегчается(?) тем, что я всегда(?) знаю имя первого листа :D
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 19.10.2007 (Пт) 9:01

Собственно, начало описания листов можно найти по комбинации:
Код: Выделить всё
sDelim = Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0) & Chr(0)

v1 = InStr(1, Str1, Chr(11) & sDelim & Chr(11) & sDelim & _
Chr(11) & sDelim & Chr(11) & sDelim & Chr(30) & Chr(16), vbTextCompare)
If v1 <> 0 Then Str1 = Mid(Str1, v1)

... а окончание по:
Код: Выделить всё
v1 = InStr(1, Str1, Chr(12) & Chr(16) & Chr(2), vbTextCompare)

Как только нашли начало, то сразу после Chr(16) (Если смотреть как Asc())-цифра, означающая кол-во листов.

Но далее - такой гимор! Делители между именами могут быть разными(в зависимости от написания имени и еще чего-то). A еще Chr(0) - проблема для текстового отображения.
Я просмотрел множество файлов, с разным кол-вом листов, и понял, что с наскоку это не одолеть. Мне повезло, что интересующие меня файлы однотипны и я знаю название первого листа. Далее ищу Chr(7) или Chr(8) . НО ДОВЕРИЯ к такой схеме - нет!

Если у кого-то есть мысли по теме, поделитесь пожалуйста!
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 19.10.2007 (Пт) 10:00

SergT
а через ADO можно?

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 19.10.2007 (Пт) 21:44

Блин! Хороший форум, но первое письмо не прошло! Попытка №2

kibernetics писал(а):SergT
а через ADO можно?

Нельзя
Идея- отказаться от связей с Excel. Вот Экзешник. Потестируйте, пожалуйста , на разных офисах. Я перепробовал 500 файлов на Office 2000 - работал адекватно. Если найдете несоответствие, пожалуйста, пришлите в личку файл без данных! Если не найдете несоответствия, выложу исходник. Пока не могу, стыдно за бардак в коде. Сам многое не понимаю :)

Если идея "прокатит", выложу exe для чтения Excel файлов, без установленного Excel (на VS FlexGrid8)

Добавлено позже:
На другом компе уже нашел несоответствия. Попробую исправит после 21 октября!
Вложения
SheetsNames.rar
(689.47 Кб) Скачиваний: 46


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, YaCy [Bot], Yandex-бот и гости: 72

    TopList