Delphi6 MsOffice
Здравейте всички Кажете ми къде (и какво) да намеря информация за работа с Word и Excel. А именно: 1.Изпратете няколко реда текст от Delphi. 2.Поставете ги на желаните координати (низ, знак). 3.Променете шрифта на текста, получен в Word. 4.Изградете таблица (трябва да има няколко клетки с различни цветове). 5.Запазете този документ (*.doc). 6.Транс прехвърлете таблицата в Excel, въз основа на която изградете стълбовидна диаграма (бар)
тук са всички точки, които трябва да изпълня. Проблемът ми е, че не знам откъде да започна (какво да чета). След това мисля, че много точки ще изчезнат сами.
Здравейте Александър Симатов.
AS> Кажете ми къде (и какво) да намеря информация за работа с Word и Excel. [цензурирано] AS> тук са всички точки, които трябва да изпълня. Имам проблем в AS> че не знам откъде да започна (какво да чета). След това предполагам AS> много елементи ще изчезнат сами. Това, с което тази конференция ме забавлява, е завидното постоянство на едни и същи въпроси. Информация по този въпрос можете да намерите: 1. От архивите на тази конференция. 2. В широките простори на интернет. Примери за връзки, които могат да помогнат: google.com, yandex.ru. А на сайтове като sources.ru такава информация може да бъде открита дори без търсачка. 3. Но хората упорито следват най-дългия път: да се опитат да намерят някой, който в момента на четене на такава "молба" няма какво друго да направи, освен да й отговори . Сега няма какво да правя, затова ще дам прости примери за работа с word и excel.
използва excel2000, word2000, варианти и т.н.; Да, можете също да обвиете тези конструкции: Word2000, Word97, var RecCount, ColCount:Integer; WorkBk : _WorkBook; WorkSheet : _WorkSheet; BufferGrid :Variant; XLApp:TExcelApplication; begin XLApp:=TExcelApplication.Create(nil); XLApp.ConnectKind:=ckNewInstance;
CoInitialize(нула); // това може да не е необходимо, ако нещо във вашия код вече е извикало тази процедура преди. XLApp.Connect;
опитайте XLApp.WorkBooks.Add(xlWBatWorkSheet,0); WorkBk := XLApp.WorkBooks.Item[1]; WorkSheet := WorkBk.WorkSheets.Get_Item(1) като _WorkSheet; WorkSheet.Name := 'Тест';
// В excel е по-добре да вмъкнете данни чрез масив като този. Работата с всяка клетка и пълненето на данни като Range['A1','A1'].Value:='123' в нея е твърде дълго. Ясно е, че параметрите RecCount и ColComt трябва да бъдат определени предварително.
BufferGr > // Попълване на BufferGrid със стойности, нищо сложно, всичко е тривиално, нормална работа с масива BufferGr.
//След това можете да поставите данните в excel. Това се прави по следния начин: Worksheet.Range['A1',Worksheet.Cells.Item[RecCount+1,ColCount]].Value := BufferGrid;
//Това е само пример за форматиране, начертайте граници, задайте размер на шрифта . Worksheet.Range['A1',Worksheet.Cells.Item[RecCount+1,ColCount]].Borders. LineStyle:=xlContinuous; Worksheet.Range['A1',Worksheet.Cells.Item[RecCount+1,ColCount] ].Font.Size:= 12;
//Избиране на всички клетки WorkSheet.Cells.Select; //Задаване на подравняването в клетките WorkSheet.Cells.HorizontalAlignment := xlHAlignLeft; //font WorkSheet.Cells.Font.Name:='Times New Roman'; //Извикване на ширини на колони за автоматично побиране, за да пасне на съдържанието WorkShe et.Cells.EntireColumn.AutoFit; // Премахваме общата селекция, като просто позиционираме курсора върху първата клетка. WorkSheet.Range['A1','A1'].Select; finally //Това може да се направи в самото начало. Тогава в интерактивен режим има шанс да имате време да видите как стеПрограмата управлява ексел. [усмивка] XLApp.Visible[0] := True; //Надявам се, че това има смисъл. BufferGr >XLApp.Disconnect; XLApp.Free; end;
И така, сега малко за думата.
//Само дефиниране на константа за нов ред const CRLF=#13#10; var WordApp: TWordApplication; Doc:_Document; Tbl:Table;
begin WordApp:=TWordApplication.Create(nil); try Doc:=WordApp.Documents.Add(EmptyParam, EmptyParam); //Пример за добавяне на пагинация WordApp.Selection.Sections.Last.Footers.Item(1).PageNumbers.Add(EmptyParam, EmptyParam);
//Пример за форматиране: с Doc.Paragraphs do begin Item(Count).Alignment:=wdAlignParagraphCenter; ^^^^^^^^^^^ //Подчертаната конструкция означава, че последният параграф ще бъде "форматиран", защото Doc.Parsgraphs.Count е общият брой абзаци в документа. Можете също да се обърнете към номера на абзаца. Например: Doc.Paragraphs.Item(1).la-la-la препращате към несъществуващ обект (параграф) дума ще ругае мръсно. Прави се изключение. Ясно е, че делфи компилаторът няма да предупреди за такива потенциално опасни ситуации.
//Пример за добавяне на таблица: Tbl:=Doc.Tables.Add(Doc.Paragraphs.Item(2).Range,3,4); с Tbl do begin Range.Font.Size:=12; Rows.Item(1).Range.Font.Bold:=1; Rows.Item(1).Range.Font.Size: =1 0; // Пример за попълване на клетка от таблица Cell(1,1).Range.InsertAfter('test'); end; finally WordApp.Visible := True; WordApp.Disconnect; WordApp.Free; end; end;
Така че дръжте се. Дадох ви някои малки примери, но можете сами да разберете останалото, ако желаете. Най-добрият начин да разберете "и как да оцветите линията в зелено. " и т.н. е използването на автозаписмакроси word'a, excel'ya. Включете записа на макроси, направете "линията зелена", след това вижте какво записва малкото софтуерно чудо. Вие избирате обектите и командите, от които се нуждаете, и ги използвате във вашия Delphi проект. Може да има някои тънкости в тяхната "преносимост" от VBA към вашето приложение, но те са елиминирани поради метода на почти научното мушкане, последвано от натрупването на малко опит.
Здравей Роман Благодаря ти. Вашата информация беше много полезна. Имам малък въпрос, който не мога да намеря в мрежата или в помощните страници: Как да чета от Word и да напиша таблица в Delphi?
Здравейте Александър Симатов.
Пишете в Delphi - четете строго определен *.doc (създаден е от друг бутон в тази програма). Определено ще има 3 реда текст, празен ред, ЕДНА таблица. Не трябва да има нищо друго. Хвърлете таблицата за четене, например, в StringGrid. Така че и аз не мога да разбера критериите. как да преминете през файла, за да срещнете таблицата (измерението е известно) и да я прочетете?
Здравей Роман Съжалявам. Ще попитам още нещо. Няма да го правя отново. Имам проблем само със създаването на диаграма. Дори не със създаването, а със задаване на диапазон от клетки с данни. Не можах да намеря пример никъде, но не мога да го пренасоча от BASIC:
Трябва да направите нещо подобно: Charts.Add ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B2:B22"), PlotBy:= _ xlColumns ActiveChart.Location Where:=xl LocationAsObject, Name:="Eeno1" С ActiveChart .HasTitle = True .ChartTitle.Characters.Text = "10 елемента" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Characters .Text = "Homep" .Axes(xlValue, xlPrimary).HasTit le = True .Axes(xlValue,xlPrimary).AxisTitle.Characters.Text = "Area" End With
Ето какво направих: var MyExcel: Variant; MyExcel.Charts.Add.ChartType := xlColumnClustered; //обвива празна диаграма (точно типът, от който се нуждая). Работи. как да пренапиша този ред в Delphi?: ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B2:B22"), PlotBy:= _ xlColumns
Здравейте Александър Симатов.
AS> Съжалявам. Ще попитам още нещо. Няма повече. AS> Единственият ми проблем е със създаването на графиката. AS> Дори не със създаване, а с посочване на диапазона от клетки с данни. AS> Никъде не намерих пример, но не мога да пренасоча от BASIC:
AS> Трябва да направите нещо подобно: [цензурирано] AS> Ето какво направих: AS> var MyExcel: Variant; AS> MyExcel.Charts.Add.ChartType := xlColumnClustered; ^^^^^^^ Защо вариант? На този етап всичко е доста трудно въведено. AS> //това покрива празна диаграма (точно типът, от който АЗ AS> се нуждая). Върши работа. как да пренапиша този ред в Delphi?: AS> ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B2:B22"), AS> PlotBy:= _ xlColumns Нямам delphi или office на моя fido компютър. Ще се захвана за работа - ще погледна.
AS>> var MyExcel: Variant; AS>> MyExcel.Charts.Add.ChartType := xlColumnClustered; RK> ^^^^^^^ RK> Защо вариант? На този етап всичко е много строго въведено. Отгоре има още 20-30 реда, работещи с excel. В примерите, които прочетох, се използва вариант. Не спорих :) Работи. как да пренапиша този ред в Delphi?: AS>> ActiveChart.SetSourceData AS>> Източник:=Листове("Лист1").Диапазон("B2:B22"), AS>> PlotBy:= _xlColumns RK> На "фидош компютъра" нямам нито делфи, нитоофис. Пристъпване към работа - RK> Ще разгледам. Благодаря ви..
Здравей Александр! Събота, 13 ноември 2004 г., 08:47 ч., Александър Симатов написа на Роман Канигин: AS>>> var MyExcel: Variant; AS>>> MyExcel.Charts.Add.ChartType := xlColumnClustered; RK>> ^^^^^^^ RK>> Защо вариант? На този етап всичко е доста трудно въведено. AS> По-горе има още 20-30 реда, работещи с Excel. AS> В примерите, които прочетох, се използва вариант. Не спорих :) AS> Върши работа. как да пренапиша този ред в delphi?: AS>>> ActiveChart.SetSourceData AS>>> Източник:=Листове("Лист1").Диапазон("B2:B22"), AS>>> PlotBy:= _xlColumns RK>> Нямам delphi или office на моя fidosh компютър. Стигнете до RK>> работа - ще видя. AS> Благодаря ви... Здравейте. Можете ли да ми кажете как да вмъкна диаграма в Word или Excel? :) По-конкретно, трябва да вмъкнете точкова диаграма с гладки линии и да добавите линия на тренда. Как да посочите клетките, от които да вземете данни за чертане и как да посочите размера и местоположението, в които да вмъкнете диаграмата? Благодаря.
Здравейте Александър Симатов.
RK>> Защо вариант? На този етап всичко е доста трудно въведено. AS> По-горе има още 20-30 реда, работещи с Excel. AS> В примерите, които прочетох, се използва вариант. Не спорих :) AS> Върши работа. как да пренапиша този ред в delphi?: AS>>> ActiveChart.SetSourceData AS>>> Източник:=Листове("Лист1").Диапазон("B2:B22"), AS>>> PlotBy:= _xlColumns RK>> Нямам delphi или office на моя fidosh компютър. Стигнете до RK>> работа - ще видя. AS> Благодаря ти... Погледнах.
//Тази функция генерира произволни стойности в даденотодиапазон. Използвах го за попълване на таблици с произволни стойности. Изисква randomize да бъде извикан. Имам това извикване и в двата случая (excel, word), е достатъчно само веднъж, например на OnCreate на главната форма.
функция Rnd (Min,Max : integer) : integer; begin Max:=(Max+1)-Min; Result:=Random(Max)+Min; end;
XLApp.WorkBooks.Add(xlWBatWorkSheet,0); WorkBk := XLApp.WorkBooks.Item[1]; WorkSheet := WorkBk.WorkSheets.Get_Item(1) като _WorkSheet;
//Попълнете диапазона (A1:B10) с произволни стойности. За i:=1 до 10 направете begin s:='A'+IntToStr(i); Worksheet.Range[s,s].Value := RND(1,100); s:='B'+IntToStr(i); Worksheet.Range[s,s].Valu e := RND(1,1 00); край;
//Тази конструкция с твърдо писане не работи. Дали не съм стигнал до дъното на true, или нещо друго. //WorkBk.charts.Add(EmptyParam,EmptyParam,1,xl3DColumnClustered,LOCAL_USER_DEFA ULT); // Ето как заобиколих проблема. Във вашия пример обаче техниката е подобна . Chart:=OleVariant(XLApp.Charts).Add; //Посочен е типът на диаграмата. Chart.ChartType:=xl3DColumnClustered; //Това е начинът, по който се посочва диапазонът от стойности на източника на данни. Това, за което попитахте. Има и друга опция: преди да добавите диаграма, изберете желания диапазон WorkSheet.Range['A1','B10'].Select и след това добавете диаграмата. Excel изчислява, че диаграмата трябва да се базира на избрания диапазон. Chart.SetSourceData(WorkSheet.Range['A1','B10']); finally XLApp.Visible[0] := True; XLApp.Disconnect; XLApp.Free; end; end;
//А сега относно четенето на таблица от word. Много е просто. procedure TForm1.LrButton2Click(Sender: TObject); var WordApp:TWordApplication; Doc:_Document; UnitHomeKey:OleVariant; Tbl,ReadTable:Table; i,j,RecCount,ColCount:integer; s,SubStr:string; begin WordApp:=TWordApplication.Create(nil); try Doc: =WordApp.Docu ments.Add(EmptyParam, EmptyParam); WordApp.Selection.TypeText('Здравей свят!'+CRLF+CRLF);
RecCount:=10; ColCount:=3; Tbl:=Doc.Tables.Add(Doc.Paragraphs.Item(2).Range,RecCount,ColCount); Randomize; //Попълване на таблицата с произволни числови стойности. с Tbl do For i:=1 to RecCount do for j:=1 to ColCount do C ell(i ,j).Range.InsertAfter(IntToStr(RND(1,100)));
//И ето как се чете съществуваща таблица. В този случай е ясно, че таблицата в word вече съществува, но ако отворите "неизвестен" файл, тогава би било добра практика да добавите проверка дали изобщо има таблици в този файл. (Разбира се, има свойство ala Doc.Tables.Count) В този случай ние просто четем първата таблица във файла. ReadTable:=Doc.Tables.Item(1); s: = ''; с ReadTable do begin for i:=1 to Rows.Count do begin for j:=1 to Columns.Count do begin //Всички тези жестове са необходими, за да се представят прочетените данни в четлив (разбираем за "око") формат. SubStr:=Cell(i,j).Range.Text; S ystem .Delete(SubStr,Length(SubStr)-1,2); s:=s+SubStr+#9; end; System.Delete(s,Length(s),1); s:=s+CRLF; end; end;
Мисля, че отговорих на поставените въпроси.