#delphi #com #ms_word
Я создаю в Word небольшую табличку, а затем мне надо на её основе сделать график.
Я нашел как добавить график, но код все время крашится с ошибкой в позиции
w := wrd.ActiveDocument.Shapes.AddOLEObject('MSGraph.Chart.8');
и график создается, но создается не на основе данных в таблице. Как сделать правильно?
procedure TForm1.btn2Click(Sender: TObject);
var
wrd, w, Child: OleVariant;
i: Integer;
StartRange: Variant;
begin
wrd:=CoWordApplication.Create;
wrd.Visible:=true;
wrd.Documents.Add;
wrd.ActiveDocument.Tables.Add(wrd.ActiveDocument.Range(0, 0), 5, 2);
wrd.Visible := True;
For i:=1 to 5 do
begin
wrd.ActiveDocument.Tables.Item(1).Cell(i,1).Range.Text := i;
wrd.ActiveDocument.Tables.Item(1).Cell(i,2).Range.Text := i*i;
end;
w:=wrd.ActiveDocument.Shapes.AddOLEObject('MSGraph.Chart.8');
Child:=w.DiagramNode.Children.AddNode;
for i:=1 to 5 do begin
Child.Children.AddNode;
end;
end;
Ответы
Ответ 1
Сейчас под рукой нет связки Delphi+Office, ответ даю по памяти и своим старым программам. Нет, ошибка у вас идёт в следующей строке, а не там, где вы предполагаете, поскольку код Child:=w.DiagramNode.Children.AddNode; обращается к несуществующему объекту. Чтобы создать диаграмму из имеющихся табличных данных, нужно, фактически, выделить таблицу (очень помогает запись макросов с последующим анализом) и затем применить уже к выделению метод InlineShapes.AddOLEObject. Как-то так: for i:=1 to 5 do begin wrd.ActiveDocument.Tables.Item(1).Cell(i,1).Range.Text := i; wrd.ActiveDocument.Tables.Item(1).Cell(i,2).Range.Text := i*i; end; // Тут кончается ваш код wrd.ActiveDocument.Tables.Item(1).Select; // выбираем вашу таблицу wrd.Selection.InlineShapes.AddOLEObject('MSGraph.Chart.8','',FALSE,FALSE); // вставляем диаграмму по данным таблицы. // Я использую только первые 4 параметра, смотрите сами по ссылке выше, какие и сколько вам нужны Данные вашей таблицы должны были быть скопированы в объект MS Graph. Дальше вы с ними можете работать. Например, так: Doc:=wrd.ActiveDocument; // ну, мне так проще :) Diag:=Doc.InlineShapes.Item(Doc.InlineShapes.Count); // ещё упрощаем доступ, вдруг понадобится доступ к объекту диаграммы в целом Chart:= Diag.OLEFormat.Object; //а теперь только Chart, только хардкор :) Chart.ChartType := 54; // ну, а дальше делаем, что хотим :) Chart.Application.DataSheet.Activate; Chart.Application.DataSheet.Cells.Clear; Chart.ChartArea.Font.Bold := False; Chart.Application.DataSheet.Cells[1, 1].Value :='11'; Разумеется, Doc, Diag и Chart - переменные типа OleVariant.
Комментариев нет:
Отправить комментарий