Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Как на основе таблички сделать график в документе Word?

#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.

Комментариев нет:

Отправить комментарий