|
|
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Подключаюсь к Excel через 1с. В книге Excel содержится примерно 100 000 ячеек, которые содержат текст "_name_". Мне необходимо найти эти ячейки и для каждой установить определенное значение. Сейчас я делаю это следующим образом, поиск в цикле: Ячейка = Страница.Cells.Find("_name_"); В итоге получается нереально долго и чем дальше мы обходим цикл тем поиск замедляется, по замеру производительности этот небольшой кусок кода составляет 97% всего времени. Подскажите как решить проблему и увеличить скорость поиска? Есть ли у кого-нибудь примеры на "ADO"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 06:03 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Как воспользоваться методом Find в RecordSet? RecordSet = Новый COMОбъект("ADODB.RecordSet"); НайденнаяЯчейка = RecordSet.Find("3364YD-YE"); !!! Ошибка при вызове метода Find, что я делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 09:17 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
RecordSet.Find просто перемещает указатель рекордсета на нужную строку. На самом деле надо просто попробовать сделать UPDATE для всего файла, открыв его через ADO. Но тут неясно, что такое "установить определенное значение" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 10:39 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Shocker.ProRecordSet.Find просто перемещает указатель рекордсета на нужную строку. На самом деле надо просто попробовать сделать UPDATE для всего файла, открыв его через ADO. Но тут неясно, что такое "установить определенное значение" У меня есть книга excel ячейки которых заполнены текстом типа "_name_a1", "_name_a2",... "_name_an". Сейчас я ищу текст "_name_" и для найденной ячейки устанавливаю имя "a1", "a2",... "an", а текст очищаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 10:58 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Ну тогда, если это возможно по структуре файла, надо выполнить запрос типа Код: sql 1. это будет самый быстрый способ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:05 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
А, стоп, плохо прочитал. То есть именно ИМЯ для ячейки устанавливается? тогда тут через ADO не сделаешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:06 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
ZixxxВ итоге получается нереально долго и чем дальше мы обходим цикл тем поиск замедляется, по замеру производительности этот небольшой кусок кода составляет 97% всего времени.тут может проблема в том, что поиск КАЖДЫЙ раз идет по всему файлу? Может вообще отказаться от поиска, а тупо пройтись циклом по ячейкам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:07 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Думаю, пример файла (строк на 100) никому не повредит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:16 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
В файлике небольшая выборка, которая еще не обработана. Ячейки, например которые содержат текст "_name_" им будет задано имя которое идет после "_name_", а сам текст будет очищен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:27 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Например, ячейка содержащая текст: _name__C_N_4b35a34e.6838.4fe1.92e9.55453a70e97b_C_3d273d36.3331.4dd5.af15.f781f131edd3_V_4e115265.2211.42de.bc59.7d7deec26cde_T_d0d43c5c.554d.11e1.b4a5.1c6f65d75e95 после обработки будет иметь имя: _C_N_4b35a34e.6838.4fe1.92e9.55453a70e97b_C_3d273d36.3331.4dd5.af15.f781f131edd3_V_4e115265.2211.42de.bc59.7d7deec26cde_T_d0d43c5c.554d.11e1.b4a5.1c6f65d75e95 ...а текст у ячейки будет очищен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:28 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
ZixxxВ файлике небольшая выборка, которая еще не обработаная думаю,ч то если выкинуть поиск из цикла и сделать просто перебор ячеек, будет быстрее. Макроса в файле не нашел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:29 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Shocker.ProZixxxВ файлике небольшая выборка, которая еще не обработаная думаю,ч то если выкинуть поиск из цикла и сделать просто перебор ячеек, будет быстрее. Макроса в файле не нашел Макроса нет в файлике, у меня порядок следующий: 1. 1с формирует табличный документ, заполняет его необходимыми данными 2. Сохраняет табличный документ как книгу xls (1c не умеет сохранять имена ячеек поэтому есть 3 пункт) 3. Открывает его и начинает преобразовывать xls. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:46 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
То есть макрос написан на стороне 1С? Как он его обрабатывает? Через COM? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:48 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Я бы попробовал что-то такое Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:53 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Shocker.ProТо есть макрос написан на стороне 1С? Как он его обрабатывает? Через COM? Файл = ПолучитьИмяВременногоФайла(".xls"); ТабличныйДокумент.Записать(Файл, ТипФайлаТабличногоДокумента.XLS); Попытка; Эксель = Новый COMОбъект("Excel.Application"); Исключение Сообщить("Не удалось инициализировать Excel, ошибка: " + ОписаниеОшибки() + ""); Возврат; КонецПопытки; РабочаяКнига = Эксель.Workbooks.Open(Файл); Страница = РабочаяКнига.Worksheets(1); Порядок = 0; Пока Истина Цикл Порядок = Порядок + 1; Состояние("Преобразование имен: " + Порядок + ""); Ячейка = Страница.Cells.Find("_name_"); Если Ячейка = Неопределено Тогда Прервать; КонецЕсли; Ячейка.Name = СтрЗаменить(Ячейка.Value, "_name_", ""); Ячейка.Value = ""; КонецЦикла; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:53 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Как я и думал - поиск каждый раз идет по всему листу. Либо надо указать дополнительные параметры поиска, чтобы искал от определенной позиции. Либо попробуйте мой код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 11:55 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Shocker.ProКак я и думал - поиск каждый раз идет по всему листу. Либо надо указать дополнительные параметры поиска, чтобы искал от определенной позиции. Либо попробуйте мой код. Попробовать обойти все ячейки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 12:03 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
ZixxxShocker.ProКак я и думал - поиск каждый раз идет по всему листу. Либо надо указать дополнительные параметры поиска, чтобы искал от определенной позиции. Либо попробуйте мой код. Попробовать обойти все ячейки? Зачем все? Только те, где предположительно есть нужные данные. Иначе потратится много лишнего времени ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 12:04 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, в массиве гораздо быстрее будет. Ведь, изначально, всё дело в скорости ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 12:39 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Выделение памяти под массив в сто тыщ строк тоже немало времени и ресурсов займет. В принципе, действительно, если есть возможность, надо вообще не перебирать ячейки, а прямо на стороне 1С работать с коллекцией Names, ведь данные выгружаются из 1С, следовательно там уже есть все данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 12:52 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Shocker.ProВыделение памяти под массив в сто тыщ строк тоже немало времени и ресурсов займет. В принципе, действительно, если есть возможность, надо вообще не перебирать ячейки, а прямо на стороне 1С работать с коллекцией Names, ведь данные выгружаются из 1С, следовательно там уже есть все данные. Согласен, но на выходе из 1с у меня есть *.mxl в нем есть ячейка имя у которой "FFF", максимум что я могу сделать это открыть этот *.mxl в excel, но имя у ячейки будет R2C2. Если же открыть этот файл в 1с то имя для ячейки установлено "FFF". Т.е. оно храниться в файла *.mxl но в excele не интерпретируется. Файлик для примера во вложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 20:54 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Zixxxно на выходе из 1сно это на выходе, а ведь эти данные берутся из 1С, почему бы не брать их непосредственно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2012, 21:17 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Shocker.ProZixxxно на выходе из 1сно это на выходе, а ведь эти данные берутся из 1С, почему бы не брать их непосредственно? Я их и беру непосредственно из 1с и они у меня есть в бланке заказа который сформирован в 1с, далее мне его нужно сохранить. Сохранить я его могу, например в mxl тогда имена останутся, а если я сохраню бланк в xls то имена не сохраняются. Поэтому, еще в момент формирования бланка в 1с, я ячейкам задаю определенный текст, который в дальнейшем мне и нужно перенести в имена ячеек. Если бы 1с могла сохранить сформированный бланк в xls с сохранением имен ячеек, или хотя бы excel умел правильно читать mxl, я был бы просто счастлив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2012, 05:30 |
|
||
|
Excel. Cells.Find...
|
|||
|---|---|---|---|
|
#18+
Zixxx, Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. > В книге Excel содержится примерно 100 000 ячеек, которые содержат текст "_name_". Мне необходимо ... ... еще 80 000 ячеек, которые содержат текст "_formula_" ... ... еще 10 000 ячеек, которые содержат текст "_if_" ... Реализация бредовая, ИМХО. И не спасут никакие замены поиска на перебор и использование массивов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2012, 06:15 |
|
||
|
|

start [/forum/topic.php?fid=61&msg=37781828&tid=2175733]: |
0ms |
get settings: |
8ms |
get forum list: |
24ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
145ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 222ms |
| total: | 513ms |

| 0 / 0 |
