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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
uses ComObj; //Очистка StringGrid. Здесь, прежде чем удалить строки, их следует очистить. //Это связано с особенностями TStringGrid. При удалении, строки могут быть //не удалены, а спрятаны. И при добавлении новых строк будут появляться ранее //скрытые строки вместе с записанным в них текстом. //Удобнее очищать таблицу по столбцам (так как, чаще всего, их меньше, чем строк). //Но в данном случае, чтобы не затрагивать шапку таблицы, очистка выполнена по строкам. procedure ClearSg(aSg : TStringGrid); var i : Integer; begin for i := aSg.FixedRows to aSg.RowCount - 1 do aSg.Rows[i].Clear; aSg.RowCount := aSg.FixedRows + 1; end; //Оформление шапки таблицы. procedure TForm1.FormCreate(Sender: TObject); var Sg : TStringGrid; begin Sg := StringGrid1; Sg.Cells[0, 0] := '№'; Sg.Cells[1, 0] := '№ строки'; Sg.Cells[2, 0] := 'Фамилия'; Sg.Cells[3, 0] := 'Имя'; Sg.Cells[4, 0] := 'Отчество'; Sg.Cells[5, 0] := 'Свойство'; end; //Поиск. procedure TForm1.Button1Click(Sender: TObject); const //Группа констант XlFindLookIn. //Искать только в комментариях, прикреплённых к ячейкам. xlComments = -4144; //Искать только в тексте формул. xlFormulas = -4123; //Искать только в значениях ячеек. xlValues = -4163; //Группа констант XlLookAt. //Искомый текст может быть частью строки или всей строкой. xlPart = 2; //Искомый текст может быть только всей строкой. xlWhole = 1; //Группа констант XlSearchOrder. xlByColumns = 2; //Искать по столбцам. xlByRows = 1; //Искать по строкам. var exApp, exBook, exSheet, exRng, exCell : Variant; sTemplate, sAddress : String; i, Row : Integer; Sg : TStringGrid; Od : TOpenDialog; begin Od := OpenDialog1; //OpenDialog1 уже должен быть на форме. if Od.InitialDir = '' then Od.InitialDir := ExtractFilePath( ParamStr(0) ) + 'files'; if not Od.Execute then Exit; if not FileExists(Od.FileName) then begin MessageBox(0, 'Файл с указанным именем не найден. Действие отменено.', 'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL); Exit; end; sTemplate := Edit1.Text; if STemplate = '' then begin MessageBox(0, 'Не задан искомый текст. Действие отменено.', 'Внимание!', MB_OK + MB_ICONWARNING + MB_APPLMODAL); Exit; end; exApp := CreateOleObject('Excel.Application'); exApp.Visible := True; exBook := exApp.WorkBooks.Open(FileName:=Od.FileName); //Первый лист в рабочей книге. exSheet := exBook.WorkSheets[1]; //Используемый на листе диапазон. exRng := exSheet.UsedRange; //Номер нижней строки в используемом диапазоне. Row := exRng.Row + exRng.Rows.Count - 1; //Определяем диапазон поиска - это второй лист на листе в пределах //используемого диапазона. exRng := exSheet.Range[exSheet.Cells[3, 2], exSheet.Cells[Row, 2]]; //Поиск ячееек. Sg := StringGrid1; ClearSg(Sg); Row := Sg.FixedRows - 1; i := 0; VarClear(exCell); //LookIn:=xlValues - ищем только в значениях ячеек. //LookAt:=xlPart - искомый тект может быть частью строки или всей строкой. //MatchCase:=False - поиск не зависит от регистра букв. exCell := exRng.Find(What:=STemplate, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False); if not VarIsClear(exCell) then begin sAddress := exCell.Address; repeat inc(i); Inc(Row); //Если требуется, добавляем строку в StringGrid. if Row = Sg.RowCount then Sg.RowCount := Succ(Row); //Запись в StringGrid сведений о найденном тексте. Sg.Cells[0, Row] := IntToStr(i); Sg.Cells[1, Row] := IntToStr(exCell.Row); Sg.Cells[2, Row] := exCell.Text; Sg.Cells[3, Row] := exCell.Offset[0, 1].Text; Sg.Cells[4, Row] := exCell.Offset[0, 2].Text; Sg.Cells[5, Row] := exCell.Offset[0, 3].Text; exCell := exRng.FindNext(After:=exCell); until exCell.Address = sAddress; end; if i = 0 then ShowMessage('Ни одного соответствия не найдено.'); //Если требуется, закрываем рабочую книгу. //exBook.Close; //Если требуется, выходим из Excel. //exApp.Quit; end; procedure TForm1.Button2Click(Sender: TObject); begin ClearSg(StringGrid1); end; |
Форум программистов Vingrad
Модераторы: MetalFan |
Поиск: |
|
Организация поиска текста в файле Excel |
Опции темы |
Dukalys |
|
||
Новичок Профиль Репутация: нет
|
День добрый. Подскажите каким инструментом Delphi можно организовать поиск в Excel (2007), желательно с примером. Поиск должен осуществляться ТОЛЬКО по столбцу A Excel, при этом, при нахождении нужного, необходимо записывать данные текущей строки из ячеек B, C в переменные/массив (неважно). P.S. Перерыл кучу материала ( в том числе книг), нашёл следующее — На вашем форуме почитал темы интересные про работу с Excel, но тем с подробным решением данной задачи так и не нашёл. Это сообщение отредактировал(а) Dukalys — 6.9.2010, 20:55 |
||
|
|||
Данкинг |
|
||
Yersinia pestis Профиль
Репутация: 5
|
Ну, проходи циклом по листу и ищи, что нужно. Способ медленный, но верный. ——————— There’s nothing left but silent epitaphs. |
||
|
|||
okkonst |
|
||
Новичок Профиль
Репутация: нет
|
а еще лучше — запиши макрос, который бы делал то, что тебе нужно (имеется ввиду — нажми «запись макроса» и соверши нужные действия), а сгенеренный код транслируй в дельфи. Там же отличный поиск есть… |
||
|
|||
Данкинг |
|
||
Yersinia pestis Профиль
Репутация: 5
|
Согласен, это ещё лучше: я сиё предположил, но не стал пока озвучивать. ——————— There’s nothing left but silent epitaphs. |
||
|
|||
Dukalys |
|
||
Новичок Профиль Репутация: нет
|
Ребят спасиб. С макросами я ещё не работал, если честно то даже ммм не представляю что придётся делать. можете это описать как-то. как придётся транслировать … А что касается цикла с проверкой каждой ячейки совпадает ли значение (true) то это наверное долго — в файле Excel 200 000 строк. и перебирать в цикле и обращаться к каждой ячейке это жёстко. P.S. Возможно ли все данные их Excel как-то по-умному рассовать по массивам в Дельфи ? (получается 3 столбца(массива) of String по 200 000) так чтобы вначале программы это заняло секунд 15-20 или меньше. Мне кажется что потом в итоге это съэкономит кучу времени и сил. спасибо за ответы. Это сообщение отредактировал(а) Dukalys — 7.9.2010, 06:44 |
||
|
|||
Albinos_x |
|
||||
Evil Skynet Профиль
Репутация: 15
|
выделяется найденная ячейка координаты можно получить дав команды в стиле:
——————— «Кто владеет информацией, тот владеет миром» |
||||
|
|||||
Dukalys |
|
||
Новичок Профиль Репутация: нет
|
Попробовал … Выдержки из первоисточника (книги): 1. «Если задана область ячеек и получена ссылка на неё, то количество столбцов будет определяться свойством Count коллекции Columns объекта Range, а количество строк — свойством Count коллекции Rows объекта Range». Доступ ко всем строкам и столбцам листа рабочей книги предоставляют коллекции Rows и Columns объекта ActiveSheet — активного листа рабочей книги. 2. «Мы определились, что ячейка всегда определяется объектами Range или Cells» Такая многозначность + отсутствие в Delphi предввода методов, свойств (Excel. пусто) для работы с Excel меня загоняет в тупик.
Во всех эдитах значение = 1 (реальное расположение ПРАВИЛЬНО НАЙДЕННОЙ И ВЫДЕЛЕННОЙ ячейки = ‘B3’=(2,3)) Методом подбора — получить какое либо свойство из FindRange (типа Row) так и не получилось. Выкладываю пример программы — теста, с которой работаю. за основу взята криво написанная (в том числе и мной) программа из нета и неудачно адаптирована под поиск координат ячейки. прога прикреплена. P.S. есть у когонить идеи по этому поводу ??? Я в нете коечто нарыл — Ссылко Похоже от туда можно коечто выдернуть, через 2 часика проверю и отпишусь. Это сообщение отредактировал(а) Dukalys — 8.9.2010, 13:28 Присоединённый файл ( Кол-во скачиваний: 8 ) |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
сделай так, это самый простой вариант:
——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
Dukalys |
|
||||||
Новичок Профиль Репутация: нет
|
Оргомное спасибо код работает !!! Ребят а вот смотрите заметил какую особенность при выполнении метода «Find» для Cells и для Range
Выделяет правильную ячейку 3,2
Выделяет 4 ячейку вместо третьей и по выше приведённых свойствам возвращает 4,2 ну наверно можно просто -1 делать от значения Row ? или это особенность какаято ? Это сообщение отредактировал(а) Dukalys — 8.9.2010, 14:59 |
||||||
|
|||||||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
Это если запускать в любой последовательности??? ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
Dukalys |
|
||
Новичок Профиль Репутация: нет
|
Несовсем догоняю что имеете ввиду здесь про последовательность (начало поиска — с начала документа или конца ?). результат поиска с начала документа — искомой строки, ссылается на последующую строку, вродебы всё время … |
||
|
|||
Albinos_x |
|
||
Evil Skynet Профиль
Репутация: 15
|
хм… у тебя в приложенном проекте, если не ошибаюсь, было 2 кнопки, где реализовано 2-мя способами поиск, вот я и спрашиваю в какой последовательности запускаешь… ——————— «Кто владеет информацией, тот владеет миром» |
||
|
|||
Deeptown12 |
|
||
Новичок Профиль Репутация: нет
|
|
||
|
|||
|
Правила форума «Delphi: ActiveX/СОМ/CORBA» | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
I’ve written the following procedure in my project to replace tags with values in Excel from Delphi program. It replaces all tags on all sheets
OutF — is a Excel Ole object, Slabel — is a tag to be replaced, SValue — is a value to replace the tag.
For example
OutF := CreateOleObject('Excel.Application' );
......
ExcelOutStr(OutF,'<MY_USER_NAME>','Value for MY User Name');
And here is the procedure:
procedure ExcelOutStr(OutF:Variant;SLabel,SValue:String);
var i,j:integer;
begin
try
OutF.DisplayAlerts := false;
//To place a string with linebreaks into one Cell
SValue:=StringReplace(SValue,#13#10,#10,[rfReplaceAll, rfIgnoreCase]);
for j:=1 to OutF.Sheets.Count do
begin
OutF.WorkSheets[j].Select;
if length(SValue)<250 then
begin
OutF.Cells.Replace(What:=Slabel, Replacement:=SValue, LookAt:=2,SearchOrder:=1, MatchCase:=False);
end
else
begin
//Excel .replace fails on string with length >250 so replace it in few steps
i:=1;
while i<=length(SValue) do
begin
if i+200-1<length(SValue) then
OutF.Cells.Replace(What:=Slabel, Replacement:=Copy(SValue,i,200)+SLabel, LookAt:=2,SearchOrder:=1, MatchCase:=False)
else
OutF.Cells.Replace(What:=Slabel, Replacement:=Copy(SValue,i,200), LookAt:=2,SearchOrder:=1, MatchCase:=False);
i:=i+200;
end;
end;
end;
OutF.WorkSheets[1].Select;
except
on E : Exception do ShowMessage('Error: Lablel ['+SLabel+'] '+E.Message);
end;
end;
|
|
|
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Соблюдайте общие правила форума
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как «свернуть» программу в трей.
3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры — внедрение в удаленное адресное прстранство)
… (продолжение следует) …
Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки — бан.
Мат в разделе — бан на три месяца…
Полезные ссылки:
MSDN Library FAQ раздела Поиск по разделу Как правильно задавать вопросы
Выразить свое отношение к модераторам раздела можно здесь: Rouse_, Krid
Поиск в Excel нужной строки
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Люди подскажите код для поиска строки в Excel. Допустим у меня строка OrgName содержит имя организации и я ее сравниваю со строками в Excel и если совпадение есть, то нужно показать эту строку в Excel. |
vet |
|
Full Member Рейтинг (т): 16 |
Берем переменную Excel из предыдущего твоего топика:
try Excel.Cells.Find(OrgName).Select; except end;
Если ячейка с текстом OrgName найдена, то она будет выделена, если нет — возникнет исключение, поэтому заключаем поиск в try … except.
Cells.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, SearchFormat) |
nqwe |
|
А как можно найти значение по пересечению двух строки и столбца и потом записатьв Edit ? Сообщение отредактировано: nqwe — 01.04.08, 02:30 |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Система, Windows API
- Следующая тема
[ Script execution time: 0,0287 ] [ 16 queries used ] [ Generated: 13.04.23, 22:37 GMT ]