![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
Добрый день....
Есть такая проблемка... данные требуется передавать в Excel... с OLE работаю впервые, поэтому строго не судите - просто выдрал текст из FAQ форума... Вот он... var ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData : Variant; BeginCol, BeginRow, i, j : integer; RowCount, ColCount : integer; begin BeginCol := 1; BeginRow := 5; RowCount := 100; ColCount := 50; ExcelApp := CreateOleObject('Excel.Application'); информации ExcelApp.Application.EnableEvents := false; Workbook := ExcelApp.WorkBooks.Add; ArrayData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant); for I := 1 to RowCount do for J := 1 to ColCount do ArrayData[I, J] := J * 10 + I; Cell1 := WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol]; Cell2 := WorkBook.WorkSheets[1].Cells[BeginRow + RowCount - 1, BeginCol + ColCount - 1]; Range := WorkBook.WorkSheets[1].Range[Cell1, Cell2]; Range.Value := ArrayData; ExcelApp.Visible := true; Автор Кулюкин Олег Взято с сайта http://www.delphikingdom.ru/ Все прекрасно подошло (с маленькими изменениями, естественно)... Вопрос - в Excel выводится строка целиком и пользователю приходится расширять колонки самостоятельно, как организовать перенос данных (чтоб строка расширилась сама). Детские варианты типа #13 не прошли... ![]() |
|||
|
||||
StayAtHome |
|
|||
![]() Домосед ![]() ![]() Профиль Группа: Участник Сообщений: 456 Регистрация: 26.1.2004 Где: Украина Репутация: 1 Всего: 16 |
Попробуй
Вообще, стоит покопаться в Excel VBA. |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
А вот не сработало ...
|
|||
|
||||
Georg4 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 961 Регистрация: 2.11.2002 Репутация: 0 Всего: 10 |
Как всегда в таких случаях, все что знаю :
Чтобы работать с Excel из Delphi cуществует два основнфх пути. Первый - это создание его как COM объект. Таким же образом можно работать и с Word, Access, Outlook(не Express) и многими другими программами. Исходный код: var Excel, WorkBook, Sheet: Variant; begin Excel := CreateOleObject('Excel.Application'); Excel.WorkBooks.Open(FileName,False); WorkBook := Excel.WorkBooks.Item[1]; Sheet := Workbook.Sheets.Item[3]; Sheet.Cells[1,2]:='ASDFG'; Sheet.Cells[2,2]:=230; Все объекты и методы Офиса можно посмотреть в help'е Офиса. Второй способ (для таблицы Excle) это подключение через DAO(Data Active Objects) или ODBC. Автор ответа: Fantasist Чтобы использовать только стандартные компоненты давайте попробуем работать с Excel через ADO. Это не самый быстрый и далеко не первый по возможностям метод (DAO работает на порядок быстрее и предоставляет куда больше возможностей), но ADO компоненты входят в стандартную поставку 5 и 6 Дельфи. Итак заходим в Панель управления Windows, идем в свойства ODBC, делаем DSN используя Excel драйвер, не забываем указать в свойствах на файл Excel. Закрываем ODBC, открываем Дельфи. Ставим на форму ADOConnection. Идем в ConnectionString - строим строку подключения - надо выбрать только ODBC провайдер и на следующей вкладке указать сделанный DSN, остальные опции в большинстве случаев можно оставить как есть. Строка получена. Кстати ее можно вообще упростить до вида: "DSN=MyDsn". Теперь вам доступны листы файла как таблицы а весь файл как база данных. Подключаем ADOQuery к ADOConnection. Cоздаем таблицу, т.е. новый лист - путем запуска следующей квери: SQL: Create Table MyTable1 ( Field1 varchar(20), Field2 varchar(10) ) Снова переходим в дизайн - ставим на форму ADOTable, указываем как Connection наш компонент с ADOConnection, теперь если кликнуть на свойстве TableName - вы сможете увидеть в списке сделанную нами таблицу "MyTable1". Соедините таблицу с DBGrid - убедитесь что работа с таблицей в Excel мало отличается от работы с другими базами данных. Есть замечательный цикл книг: Word2000 для разработчика (я сам разбирался по ней, хорошая книжка) Excel2000 для разработчика (тоже) В книгах подробно описано как и макросы запускать как управлять объектами Office много примеров (правда на VB for App, но все легко переносится) Запуск Microsoft Excel Используя раннее связывание Перед тем, как вы сможете использовать этот метод, вам необходимо импортировать библиотеку типов Excel. var IExcel: Excel8_TLB.Application_; IU: IUnknown; ... NewInstance := true; // false в случае, если хотите использовать уже запущенный NewInstance := NewInstance or (not SUCCEEDED( GetActiveObject(Excel8_TLB.CLASS_Application_, nil, IU) ) ); if NewInstance then IExcel := CreateComObject(Excel8_TLB.CLASS_Application_) as Excel8TLB._Application else IExcel := IU; Внимание - хорошая практика! При объявлении интерфейсных переменных и предопределенных констант из импортированной библиотеки типов указывайте имя модуля, в котором они находятся. Используя компоненты Delphi 5 Delphi 5 содержит более удобный механизм импорта библиотек типов с поддержкой событий и прекрасной генерацией ко-классов: var Excel: Excel97.TExcelApplication; ... NewInstance := true; Excel := TExcelApplication.Create(Self); if NewInstance then Excel.ConnectKind := ckNewInstance else Excel.ConnectKind := ckRunningOrNew; Excel.Connect; Для использования уже запущенного экземпляра Excel, если он существует, установите свойство ConnectKind TExcelApplication в ckRunningOrNew, или в ckRunningInstance, если вы не хотите создавать новый экземпляр, если Excel не запущен. Внимание - хорошая практика! Тестируйте свои приложения только с NewInstance := true. Используйте GetActiveObject или ckRunningInstance (для Delphi5) только в случае полной уверенности в коде, который будет выполняться после, иначе при экспериментировании вы можете потерять уже открытые, но еще не сохраненные книги. Как только Microsoft Excel загружен, вы можете подключать остальные компоненты, например TExcelWorkbook, используя их методы ConnectTo: var Workbook: TExcelWorkbook; ... Workbook.ConnectTo(Excel.ActiveWorkbook); Примечание: Рабочая книга или рабочий лист должны быть открыты перед тем, как вы сможете к ним подключиться! В разделе "Работа с Workbook" приведен код, как это сделать. Для запуска Excel используйте только компонент TExcelApplication, не советуем пытаться осуществить это с помощью других компонентов. По крайней мере в некоторых инсталляциях, попытка вызова метода Connect (не метода ConnectTo!) Workbook или Worksheet приведет к возникновению исключения. Используя позднее связывание Автоматизация с использованием библиотеки типов (раннее связывание) намного проще и быстрее, поэтому избегайте позднего связывания (без использования библиотеки типов) везде, где только возможно. Однако, если обойтись без позднего связывания действительно невозможно, вот код для создания процесса Excel: var Excel: OLEVariant; ... try Excel := GetActiveOleObject('Excel.Application'); except Excel := CreateOleObject('Excel.Application'); end; LCID В модуле Excel8 _TLB (Excel97 для Delphi5) во многих свойствах и методах вы можете встретить параметр или индекс lcid. Теоретически, в MSDN написано: "Indicates that the parameter is a locale ID (LCID)". Одни (Чарльз Калверт) предлагают в качестве его использовать 0, как идентификатор языка по умолчанию, другие - результат функции GetUserDefaultLCID. В некоторых случаях, чаще в связке Windows 2000 + Excel 2000, оба решения не проходят. Причем, выдается сообщение о попытке "использовать библиотеку старого формата..." Поэтому, рекомендуем в качестве lcid использовать значение константы LOCALE_USER_DEFAULT. Например, вот так: const xlLCID := LOCALE_USER_DEFAULT; Отображение Excel Используя раннее связывание Многие считают, что IExcel.Visible[xlLCID] := true будет достаточно, однако правильнее делать так: if Assigned(IExcel) then begin // а если он не создан? IExcel.Visible[xlLCID] := true; if IExcel.WindowState[xlLCID] = TOLEEnum(Excel8_TLB.xlMinimized) then IExcel.WindowState[xlLCID] := TOLEEnum(Excel8_TLB.xlNormal); IExcel.ScreenUpdating[xlLCID] := true; end; Зачем такие сложности: · xlMinimized: Попытайтесь отобразить уже запущенный, а затем минимизированный Excel простым Visible[xlLCID] := true и вы все поймете - Visible[xlLCID] := true просто переводит фокус в Excel, но не восстанавливает размеры его окна. · ScreenUpdating: Данное свойство отвечает за перерисовку окон Microsoft Excel. Попробуйте отобразить Excel (Visible[xlLCID] := true), выполняющийся в "скрытом" режиме - основное окно Excel показывается, однако клиентская область остается по-прежнему скрытой. Используя позднее связывание if not VarIsEmpty(Excel) then begin // а если он не создан? Excel.Visible := true; if Excel.WindowState = TOLEEnum(Excel8_TLB.xlMinimized) then Excel.WindowState := TOLEEnum(Excel8_TLB.xlNormal); Excel.ScreenUpdating := true; end; Скрытие Excel Если вы хотите убрать процесс Excel из Панели задач, но оставить его в памяти, чтобы не тратить время на повторную загрузку, это можно сделать вот так: Используя раннее связывание if Assigned(IExcel) then begin IExcel.Visible[xlLCID] := false; end; Используя позднее связывание if not VarIsEmpty(Excel) then begin Excel.Visible := false; end; Закрытие Excel Испольуя раннее связывание if Assigned(IExcel) then begin if (IExcel.Workbooks.Count > 0) and (not IExcel.Visible[xlLCID]) then // не закрывайте не свои книги begin IExcel.WindowState[xlLCID] := TOLEEnum(Excel8_TLB.xlMinimized); IExcel.Visible[xlLCID] := true; Application.BringToFront; end else IExcel.Quit; IExcel := nil; // см. Хорошая практика end; Зачем столько кода? Зачем столько кода? Вы не запускали новый процесс, вы "законнектились" к уже существовавшему. В нем была открыта книга. Если оставить только присваивание в nil, то существовавший процесс не будет выгружен (он же существовал до запуска вашего приложения), но будет, возможно, спрятан от пользователя с его открытой книгой. Используя компоненты Delphi 5 if Assigned(Excel) then begin if (Excel.Workbooks.Count > 0) and (not Excel.Visible[xlLCID]) then // не закрывайте не свои книги begin Excel.WindowState[xlLCID] := TOLEEnum(Excel97.xlMinimized); Excel.Visible[xlLCID] := true; Application.BringToFront; end else Excel.Quit; FreeAndNil(Excel); end; В Delphi 5 вы работаете уже не с интерфейсом напрямую, а с экземпляром класса TExcelApplcation. Это настоящий экземпляр класса, освободить который просто необходимо. Поэтому вместо присваивания в nil - FreeAndNil. Используя позднее связывание if not VarIsEmpty(Excel) then begin if (Excel.Workbooks.Count > 0) and (not Excel.Visible) then // не закрывайте не свои книги begin Excel.WindowState := Excel97.xlMinimized; Excel.Visible := true; Application.BringToFront; end else Excel.Quit; Excel := UnAssigned; end; Внимание - хорошая практика! Процесс Excel останется в памяти, скрыто выполняясь, до тех пор, пока вы не освободите все ваши указатели на любые, использованные вами, интерфейсы Excel. Отсоедините все компоненты, присвойте всем интерфейсным переменным nil и установите все переменные типа variant в Unassigned, чтобы избежать этого. Открытие существующей книги Используя раннее связывание var IWorkbook: Excel8TLB._Workbook; Filename: string; ... Filename := 'C:\Test.xls'; IWorkbook := IExcel.Workbooks.Open(Filename, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, false, xlLCID); Вот как описан метод Open в импортированной библиотеке типов: function Open(const Filename: WideString; UpdateLinks: OleVariant; ReadOnly: OleVariant; Format: OleVariant; Password: OleVariant; WriteResPassword: OleVariant; IgnoreReadOnlyRecommended: OleVariant; Origin: OleVariant; Delimiter: OleVariant; Editable: OleVariant; Notify: OleVariant; Converter: OleVariant; AddToMru: OleVariant; lcid: Integer): Workbook; safecall; Что вам из всего этого может понадобиться: · FileName Имя открываемого файла, желательно с полным путем, иначе Excel будет искать этот файл в каталоге по умолчанию; · AddToMru True - если необходимо запомнить файл в списке последних открытых файлов; · IgnoreReadOnlyRecommended Если файл рекомендован только для чтения, то при открытии Excel выдает соответствующее предупреждение. Чтобы его игнорировать, передайте в качестве данного параметра True. Используя позднее связывание При позднем связывании не нужно указывать все дополнительные параметры или LCID, можно просто написать вот так: var Workbook: OLEVariant; ... Workbook := Excel.WorkBooks.Open('C:\Test.xls'); Примечание: Если вы хотите получше узнать метод Open, например, как с его помощью открывать файлы текстовых форматов с разделителями, воспользуйтесь "пишущим" плеером VBA. Запишите макросы, а затем поправьте их по необходимости. Создание новой книги Используя раннее связывание var IWorkbook: Excel8_TLB._Workbook; ... IWorkbook := IExcel.Workbooks.Add(EmptyParam, xlLCID); Передача в качестве первого параметра EmptyParam означает, что будет создана новая книга с количеством пустых листов, выставленным по умолчанию. Если в первом параметре вы передадите имя файла (с полным путем, иначе поиск осуществляется в каталоге по умолчанию), этот файл будет использован как шаблон для новой книги. Вы можете также передать одну из следующих констант: xlWBATChart, xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet, или xlWBATWorksheet. В результате будет создана новая книга с единственным листом указанного типа. Внимание - важно! Excel не может держать открытыми несколько книг с одинаковыми названиями, даже если они лежат в разных каталогах, поэтому при создании файла по шаблону добавляет к имени файла новой книги номер (шаблон "test.xls" - новый файл "test1.xls"). Используя позднее связывание При позднем связывании не нужно указывать дополнительные параметры или LCID, можно просто написать вот так: var Workbook: OLEVariant; ... Workbook := Excel.WorkBooks.Add; или Workbook := Excel.WorkBooks.Add('c:\template.xls'); Если вы не используете библиотеку типов, но хотите использовать какую-то из констант, упомянутых выше, вы можете определить их в вашем коде: const xlWBATChart = $FFFFEFF3; xlWBATExcel4IntlMacroSheet = $00000004; xlWBATExcel4MacroSheet = $00000003; xlWBATWorksheet = $FFFFEFB9; Закрытие книги Используя раннее связывание var SaveChanges: boolean; ... SaveChanges := True; IWorkbook.Close(SaveChanges, EmptyParam, EmptyParam, xlLCID); Если в качестве параметра SaveChanges вы передадите EmptyParam, Excel задаст вопрос, сохранять ли рабочую книгу. Второй параметр позволяет вам определить имя файла, а третий указывает, нужно ли отправлять книгу следующему получателю. Используя позднее связывание При позднем связывании нет необходимости указывать дополнительные параметры, поэтому вы можете просто написать: Workbook.Close(SaveChanges := True); или Workbook.Close; Добавление имени в рабочую книгу Используя раннее связывание var IName: Excel8_TLB.Name; ... IName := IWorkbook.Names.Add('AddedName', '=Лист1!$A$1:$D$3', EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); Первый параметр - новое имя, второй - область, на которую ссылается имя. Если третий параметр - False, имя будет скрытым, и не будет появляться в диалогах "Определить имя" или "Перейти к" Используя позднее связывание var Name: OLEVariant; ... Name := Workbook.Names.Add('AddedName', '=Лист1!$A$1:$D$3') Примечание: Обратите внимание на использование абсолютной адресации в параметре RefersTo (знак $). Добавление макроса в рабочую книгу Вы можете изменять код Excel VBA во время выполнения, записывая напрямую в модуль кода редактора Excel VBA, добавляя или удаляя строки и события. Важным объектом здесь является CodeModule (хитро упрятанный глубоко в недра справки по VBA). Его объявление можно найти в файле VBIDE97.pas. Пример, как его можно использовать: uses VBIDE8_TLB; ... var LineNo: integer; ICodeModule: VBIDE8_TLB.CodeModule; ... ICodeModule := IWorkbook.VBProject.VBComponents.Item('ЭтаКнига').CodeModule; LineNo := ICodeModule.CreateEventProc('Activate', 'Workbook'); CodeModule.InsertLines(LineNo + 1, ' Range("A1").Value = "Книга открыта!"'); А вот так можно добавить новый модуль: var IModule: VBIDE8_TLB.VBComponent; ... IModule := IWorkbook.VBProject.VBComponents.Add( TOLEEnum(VBIDE8_TLB.vbext_ct_StdModule) ); IModule.Name :='MyModule1'; ,поместить в него новую процедуру VBA: IModule.CodeModule.AddFromString('PUBLIC SUB MySub1()'#13'Msgbox "Hello, World!"'#13'End sub'#13); и запустить эту процедуру OLEVariant(Excel).Run('MyModule1.MySub1'); Получение конкретного листа книги Используя раннее связывание var ISheet: Excel8_TLB._Worksheet; ... ISheet := IWorkbook.Worksheets.Item['Лист1'] as Excel8_TLB._Worksheet; Коллекция Worksheet подобна всем остальным коллекциям из Excel TLB. В ней вы можете удалять листы, вставлять новые, изменять их порядок. Лучший способ узнать, как это сделать - справка по Excel VBA. Вот, например, обход всех листов книги: var IWorksheets: Excel8_TLB.Worksheets; ... IWorksheets := IWorkbook.Worksheets; for i := 1 to IWorksheets.Count do begin ISheet := IWorksheets.Item[i] as Excel8_TLB._Worksheet; ISheet.Range['A1', 'B5'].Value := 'Я здесь!'; end; Используя позднее связывание var Worksheet: OLEVariant; ... Worksheet := Workbook.Worksheets.Item(1); Примечание: Рекомендуем всегда и везде работать с ячейками и областями (Range) в контексте их листа, получив предварительно интерфейс на этот лист. От использования свойств ActiveSheet и ActiveWorkbook желательно совсем отказаться, разве что за исключением каких-то особых случаев. Сделать лист активным (будет доступен через ActiveSheet) Используя раннее связывание Обращаться к листу можно либо по его названию, либо по номеру в коллекции: (IWorkbook.Worksheets.Item['Лист1'] as Excel8TLB._Worksheet).Activate(xlLCID); или (IWorkbook.Worksheets.Item[1] as Excel8TLB._Worksheet).Activate(xlLCID); Используя позднее связывание Workbook.Worksheets.Item(1).Activate; Способы обращения к ячейкам Возможно использование различных способов обращения к ячейкам от привычного в Excel Cells(x,y) до коллекции Names. Приведем некоторые из них на примере чтения данных из ячейки "A2" листа "Лист1" (имя "TestCell"): var Value: OLEVariant; ISheet: Excel8_TLB._Worksheet; ... ISheet := IWorkbook.Worksheets.Item['Лист1'] as Excel8_TLB._Worksheet; try //различные способы Value := ISheet.Cells.Item[2, 1].Value; Value := ISheet.Range['A2', EmptyParam].Value; Value := ISheet.Range['TestCell', EmptyParam].Value; Value := IWorkbook.Names.Item('TestCell', EmptyParam, EmptyParam).RefersToRange.Value; finally ISheet := nil; end; Чтение данных из нескольких ячеек (области) Наиболее просто чтение данных из области A1:B5 можно осуществить вот так: var Values: OLEVariant; ISheet: Excel8_TLB._Worksheet; IRange: Excel8_TLB.Range; ... ISheet := IWorkbook.Worksheets.Item['Лист1'] as Excel8TLB._Worksheet; IRange := ISheet.Range['A1', 'B5']; Values := IRange.Value; Для получения в массиве значений всех ячеек из используемой области на листе (прямоугольная область, заключенная между "A1" и "правой нижней непустой" ячейками), в предыдущем примере можно написать следующее: IRange := ISheet.UsedRange[xlLCID]; Передача данных в Еxcel Существует масса способов передать данные в Excel, начиная с DDE и заканчивая обычным присваиванием (типа Cell.Value := NewValue ). Рассмотрим наиболее простые из них. В одну ячейку ISheet := IExcel.ActiveSheet as Excel8_TLB._Worksheet; ISheet.Range['A1', 'A1'].Value := 'Delphi & Microsoft Excel'; ISheet.Range['B1', 'B1'].Value := 42; Данные в группу ячеек ISheet.Range['C3', J42'].Formula := '=RAND()'; Вы можете обращаться к ячейкам листа по номеру строки и столбца или через переменные, подобно этому: var Row, Col: integer; ... ISheet.Cells.Item[1, 1].Value := 'текст в ячейку A1'; ISheet.Cells.Item[Row, Col].Value := 'куда-то еще'; Внимание - подробнее здесь! Если вы хотите подробно изучить данную тему и ее тонкости, прочтите статью "По волнам интеграции... III" Поиск данных на листе Пример поиска и выделения красным всех ячеек, содержащих строку (или подстроку) "Text" var ISheet: Excel8TLB._Worksheet; UsedRange, Range: OLEVariant; FirstAddress: string; ... ISheet := IWorkbook.Worksheets.Item['Лист1'] as Excel8_TLB._Worksheet; UsedRange := ISheet.UsedRange[xlLCID]; Range := UsedRange.Find(What:='Text', LookIn := xlValues, SearchDirection := xlNext); if not VarIsEmpty(Range) then begin FirstAddress := Range.Address; repeat Range.Interior.ColorIndex := 37; Range := UsedRange.FindNext(After := Range); until FirstAddress = Range.Address; end; Копирование данных Перемещение данных между листами var ISheetSrc, ISheetDst: Excel8_TLB._Worksheet; IRangeSrc, IRangeDst: Excel8_TLB.Range; ... try ISheetSrc := IWorkbook.Worksheets.Item['Лист1'] as Excel8TLB._Worksheet; ISheetDst := IWorkbook.Worksheets.Add(EmptyParam, ISheetSrc, 1, EmptyParam, xlLCID) as _Worksheet; IRangeSrc := ISheetSrc.UsedRange[xlLCID]; IRangeDst := ISheetDst.Cells.Item[1, 1]; IRangeSrc.Copy(IRangeDst); finally IRangeDst := nil; IRangeSrc := nil; ISheetDst := nil; ISheetSrc := nil; end; Метод Copy интерфейса Range принимает в качестве параметра любой другой Range, совпадение размеров источника и получателя необязательно. Примечание: При копировании области убедитесь, что не редактируете ячейку, иначе возникнет исключение "Call was rejected by callee". Через clipboard Использование метода Copy без указания параметра destination скопирует ячейки в буфер обмена Windows: var ISheetSrc, ISheetDst: Excel8_TLB._Worksheet; IRangeSrc, IRangeDst: Excel8_TLB.Range; ... try ISheetSrc := IWorkbook.Worksheets.Item['Лист1'] as Excel8TLB._Worksheet; ISheetDst := IWorkbook.Worksheets.Add(EmptyParam, ISheetSrc, 1, EmptyParam, xlLCID) as _Worksheet; IRangeSrc := ISheetSrc.UsedRange[xlLCID]; IRangeDst := ISheetDst.Cells.Item[1, 1]; IRangeSrc.Copy(EmptyParam); // так кладем в Clipboard ISheetDst.Paste(IRangeDst, EmptyParam, xlLCID); // а вот так достаем оттуда finally IRangeDst := nil; IRangeSrc := nil; ISheetDst := nil; ISheetSrc := nil; end; Вы можете создавать отчеты в Excel примерно вот так: var vExcel, xlvariant: OLEVariant; begin vExcel := CreateOleObject('Excel.Application'); vExcel.Workbooks.Open('BigBook.xls', False); ... vExcel.Cells[1, 1].Value := 124512; vExcel.Cells[1, 2].Value := 'С добрым утром'; vExcel.ActiveSheet.Range['B5:B100'].Select; vExcel.Selection.Columns.AutoFit; ... xlVariant.ActiveSheet.Range[stRange].Select; {Левое} xlVariant.Selection.Borders[7].LineStyle := 1; xlVariant.Selection.Borders[7].Weight := 2; xlVariant.Selection.Borders[7].ColorIndex := -4105; {ВВерх} xlVariant.Selection.Borders[8].LineStyle := 1; xlVariant.Selection.Borders[8].Weight := 2; xlVariant.Selection.Borders[8].ColorIndex := -4105; {Hиз} xlVariant.Selection.Borders[9].LineStyle := 1; xlVariant.Selection.Borders[9].Weight := 2; xlVariant.Selection.Borders[9].ColorIndex := -4105; {Правое} xlVariant.Selection.Borders[10].LineStyle := 1; xlVariant.Selection.Borders[10].Weight := 2; xlVariant.Selection.Borders[10].ColorIndex := -4105; {Вертикаль внутри} xlVariant.Selection.Borders[11].LineStyle := 1; xlVariant.Selection.Borders[11].Weight := 2; xlVariant.Selection.Borders[11].ColorIndex := -4105; ... try xlVariant.Selection.Borders[12].LineStyle := 1; xlVariant.Selection.Borders[12].Weight := 2; xlVariant.Selection.Borders[12].ColorIndex := -4105; except end; ... vExcel.ActiveWorkBook.SaveAs(stNameFile); vExcel.Visible := True; end; А можете и вот так: begin xlReport.Report(true); end; -------------------- Никто и никогда не должен решать одну проблему дважды |
|||
|
||||
December |
|
|||
![]() Antitheorist ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4423 Регистрация: 14.8.2002 Где: Харьков Репутация: 8 Всего: 57 |
Georg4 Ты уже 4-й раз на моей памяти приводишь этот текст. Может, не надо больше? Кто по форуму искал, то его 100% нашёл.
|
|||
|
||||
Georg4 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 961 Регистрация: 2.11.2002 Репутация: 0 Всего: 10 |
Есть такая старая пословица.
Шутка повторенная дважды становится понятнее. Кто-то может и искал, а кто-то не искал. Я не могу лишить людей удовольствия... Хотя, знаешь, ты прав. Нафиг ЕХЕЛ. У меня есть дока по той же теме только с Вордом. Если кому нужно? -------------------- Никто и никогда не должен решать одну проблему дважды |
|||
|
||||
GOS |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 3.10.2003 Репутация: нет Всего: нет |
||||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
Вообщем так, робяты.... Делаете так.... Создаете макрос в Excel.... Делаете ручками все, что надо... После этого лезете в код - и смотрите как это выглядит... И просто переносите код в Delphi... Самый толковый способ...
Спасибо всем за помощь... |
|||
|
||||
Unregistered |
|
|||
Unregistered |
Maverick
Гм... Ну а я что говорил?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |