#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.
Комментариев нет:
Отправить комментарий