diff --git a/docx/TSDocxDocument.tsf b/docx/TSDocxDocument.tsf index 2d52781..7bf53c3 100644 --- a/docx/TSDocxDocument.tsf +++ b/docx/TSDocxDocument.tsf @@ -13,6 +13,8 @@ private full_name_; tables_; paragraphs_; + tables_of_contents_; + inline_shapes_; params_; // 存一些全局参数 @@ -591,10 +593,10 @@ Begin file_name_ := name; full_name_ := fullname; collection_ := collection; - tables_ := new TSDocxTables(self.Application, self.Creator, self); - tables.Init(docx_); - paragraphs_ := new TSDocxParagraphs(self.Application, self.Creator, self); - paragraphs_.Init(docx_); + tables_ := nil; + paragraphs_ := nil; + tables_of_contents_ := nil; + inline_shapes_ := nil; params_ := array(); End; @@ -678,17 +680,40 @@ End; Function TSDocxDocument.ReadTables(index); Begin + if ifnil(tables_) then + begin + tables_ := new TSDocxTables(self.Application, self.Creator, self); + tables_.Init(docx_); + end return ifnil(index) ? tables_ : tables.Item(index); End; Function TSDocxDocument.ReadParagraphs(index); Begin + if ifnil(paragraphs_) then + begin + paragraphs_ := new TSDocxParagraphs(self.Application, self.Creator, self); + paragraphs_.Init(docx_); + end return ifnil(index) ? paragraphs_ : paragraphs_.Item(index); End; Function TSDocxDocument.ReadTablesOfContents(); Begin - tables_of_contents_obj := new TSDocxTablesOfContents(self.Application, self.Create, self); - tables_of_contents_obj.Init(docx_); - return tables_of_contents_obj; + if ifnil(tables_of_contents_) then + begin + tables_of_contents_ := new TSDocxTablesOfContents(self.Application, self.Create, self); + tables_of_contents_.Init(docx_); + end + return tables_of_contents_; +End; + +Function TSDocxDocument.ReadInlineShapes(); +Begin + if ifnil(inline_shapes_) then + begin + inline_shapes_ := new TSDocxInlineShapes(self.Application, self.Create, self); + inline_shapes_.Init(docx_); + end + return inline_shapes_; End; diff --git a/docx/TSDocxInlineShape.tsf b/docx/TSDocxInlineShape.tsf new file mode 100644 index 0000000..6f56d79 --- /dev/null +++ b/docx/TSDocxInlineShape.tsf @@ -0,0 +1,125 @@ +Type TSDocxInlineShape = Class(TSVbaBase) + +public + Function Init(docx, trun); + Function Apply(); + +private + docx_; + trun_; + base_; + +public + // Methods + Function ConvertToShape(); + Function Delete(); + Function Reset(); + Function Select(); + + // Properties + property AlternativeText read ReadAlternativeText write WriteAlternativeText; + property Borders read ReadBorders; + property Chart read ReadChart; + property Field read ReadField; + property Fill read ReadFill; + property Glow read ReadGlow; + property GroupItems read ReadGroupItems; + property HasChart read ReadHasChart; + property HasSmartArt read ReadHasSmartArt; + property Height read ReadHeight write WriteHeight; + property HorizontalLineFormat read ReadHorizontalLineFormat; + property Hyperlink read ReadHyperlink; + property IsPictureBullet read ReadIsPictureBullet; + property Line read ReadLine; + property LinkFormat read ReadLinkFormat; + property LinkFormat read ReadLinkFormat; + property LockAspectRatio read ReadLockAspectRatio write WriteLockAspectRatio; + property OLEFormat read ReadOLEFormat; + property PictureFormat read ReadPictureFormat; + property Range read ReadRange; + property Reflection read ReadReflection; + property ScaleHeight read ReadScaleHeight write WriteScaleHeight; + property ScaleWidth read ReadScaleWidth write WriteScaleWidth; + property Script read ReadScript; + property Shadow read ReadShadow; + property SmartArt read ReadSmartArt; + property SoftEdge read ReadSoftEdge; + property TextEffect read ReadTextEffect; + property Title read ReadTitle write WriteTitle; + property Type read ReadType; + property Width read ReadWidth write WriteWidth; + Function WriteWidth(value); + Function ReadWidth(); + Function ReadType(); + Function WriteTitle(value); + Function ReadTitle(); + Function ReadTextEffect(); + Function ReadSoftEdge(); + Function ReadSmartArt(); + Function ReadShadow(); + Function ReadScript(); + Function WriteScaleWidth(value); + Function ReadScaleWidth(); + Function WriteScaleHeight(value); + Function ReadScaleHeight(); + Function ReadReflection(); + Function ReadRange(); + Function ReadPictureFormat(); + Function ReadOLEFormat(); + Function WriteLockAspectRatio(value); + Function ReadLockAspectRatio(); + Function ReadLinkFormat(); + Function ReadLine(); + Function ReadIsPictureBullet(); + Function ReadHyperlink(); + Function ReadHorizontalLineFormat(); + Function WriteHeight(value); + Function ReadHeight(); + Function ReadHasSmartArt(); + Function ReadHasChart(); + Function ReadGroupItems(); + Function ReadGlow(); + Function ReadFill(); + Function ReadField(); + Function ReadChart(); + Function ReadBorders(); + Function WriteAlternativeText(value); + Function ReadAlternativeText(); + +End; + +// ============== 实现 ================= // +Function TSDocxInlineShape.Init(docx, trun); +Begin + docx_ := docx; + trun_ := trun; + base_ := 12700; +End; + +Function TSDocxInlineShape.Apply(); +Begin + trun_.Update(); +End; + +// Properties +Function TSDocxInlineShape.WriteHeight(value); +Begin + cy := value * base_; + trun_.Drawing.WInline.cy := cy; + trun_.Drawing.WInline.Graphic.GraphicData.Pic.spPr.XFrm.Ext.CY := cy; +End; +Function TSDocxInlineShape.ReadHeight(); +Begin + return trun_.Drawing.WInline.Value("cy") / base_; +End; + +Function TSDocxInlineShape.WriteWidth(value); +Begin + cx := value * base_; + trun_.Drawing.WInline.cx := cx; + trun_.Drawing.WInline.Graphic.GraphicData.Pic.spPr.XFrm.Ext.CX := cx; +End; +Function TSDocxInlineShape.ReadWidth(); +Begin + return trun_.Drawing.WInline.Value("cx") / base_; +End; diff --git a/docx/TSDocxInlineShapes.tsf b/docx/TSDocxInlineShapes.tsf new file mode 100644 index 0000000..3cbe418 --- /dev/null +++ b/docx/TSDocxInlineShapes.tsf @@ -0,0 +1,117 @@ +Type TSDocxInlineShapes = Class(TSVbaBase) + +public + Function Init(docx); + Function Operator[](index); + + Function SerializeInlineShapes(); + Function FindInlineShapePosition(node); + +private + docx_; + inline_shapes_; + document_; + +public + // Methods + Function AddChart2(Style, Type, Range, NewLayout); + Function AddHorizontalLine(FileName, Range); + Function AddHorizontalLineStandard(Range); + Function AddOLEControl(ClassType, Range); + Function AddOLEObject(ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Range); + Function AddPicture(FileName, LinkToFile, SaveWithDocument, Range); + Function AddPictureBullet(FileName, Range); + Function AddSmartArt(Layout, Range); + Function AddWebVideo(EmbedCode, VideoWidth, VideoHeight, PosterFrameImage, Url, Range); + Function Item(Index); + Function New(Range); + + // Properties + property Count read ReadCount; + Function ReadCount(); + +End; + +// ============== 实现 ================= // +Function TSDocxInlineShapes.Init(docx); +Begin + docx_ := docx; + inline_shapes_ := array(); + document_ := self.Parent; +End; + +Function Operator TSDocxInlineShapes.[](index); +Begin + inline_shape_obj := new TSDocxInlineShape(self.Application, self.Creator, self.Parent); + inline_shape_obj.Init(docx_, inline_shapes_[index - 1]); + return inline_shape_obj; +End; + +Function TSDocxInlineShapes.SerializeInlineShapes(); +Begin + paragraphs := document_.Paragraphs; + num := paragraphs.Count; + for i:=1 to num do + begin + paragraph := paragraphs.Item(i); + node := paragraph.Object(); + if ifObj(node) then + begin + run := node.FirstChildElement("w:r"); + while ifObj(run) do + begin + drawing := run.FirstChildElement("w:drawing"); + if ifObj(drawing) then + begin + trun := TOfficeObj("TRun"); + trun.Init(run); + inline_shapes_[length(inline_shapes_)] := trun; + end + run := run.NextElement("w:r"); + end + end + end +End; + +// Methods +Function TSDocxInlineShapes.AddPicture(FileName, LinkToFile, SaveWithDocument, Range); +Begin + if not ifBinary(FileName) then raise "TSVBA::Parameter LinkToFile must be in binary."; + picture := TOfficeObj("TPicture"); + picture.Image := FileName; + if ifObj(Range) then + begin + paragraph := Range.InsertNewParagraph(); + pic := docx_.AddPicture(picture, paragraph.Object()); + document_.Paragraphs.AddParagraph(paragraph.Index(), pic.Root()); + paragraph.Range.Clear(true); + self.SerializeInlineShapes(); + run := pic.Root().FirstChildElement("w:r"); + trun := TOfficeObj("TRun"); + trun.Init(run); + end + else begin + last := document_.Paragraphs.Item(document_.Paragraphs.Count); + pic := docx_.AddPicture(picture, last.Object()); + document_.Paragraphs.AddParagraph(nil, pic.Root()); + run := pic.Root().FirstChildElement("w:r"); + trun := TOfficeObj("TRun"); + trun.Init(run); + inline_shapes_[length(inline_shapes_)] := trun; + end + inline_shape_obj := new TSDocxInlineShape(self.Application, self.Creator, self.Parent); + inline_shape_obj.Init(docx_, trun); + return inline_shape_obj; +End; + +Function TSDocxInlineShapes.Item(Index); +Begin + return self[Index]; +End; + +// Properties +Function TSDocxInlineShapes.ReadCount(); +Begin + return length(inline_shapes_); +End; + diff --git a/docx/TSDocxParagraph.tsf b/docx/TSDocxParagraph.tsf index 3773c90..8ef8c3c 100644 --- a/docx/TSDocxParagraph.tsf +++ b/docx/TSDocxParagraph.tsf @@ -3,6 +3,7 @@ Type TSDocxParagraph = Class(TSDocxParagraphFormat) public Function Init(docx, paragraph, index); Function Object(); + Function Index(); private paragraph_; // TOfficeObj("TParagraph") @@ -63,6 +64,11 @@ Begin return paragraph_; End; +Function TSDocxParagraph.Index(); +Begin + return index_; +End; + // Methods Function TSDocxParagraph.Next(Count); Begin diff --git a/docx/TSDocxParagraphs.tsf b/docx/TSDocxParagraphs.tsf index 72c8981..c71b4ab 100644 --- a/docx/TSDocxParagraphs.tsf +++ b/docx/TSDocxParagraphs.tsf @@ -7,7 +7,8 @@ public Function ParseTable(root, arr, lastNode); Function FindNewParagraphPosition(findNode, direction); - Function AddParagraph(findNode, newNode, direction); + Function AddParagraph(pos, newNode);overload; + Function AddParagraph(findNode, newNode, direction);overload; Function AddTableToParagraphs(findNode, tTable); Function DeleteParagraph(findNode); @@ -23,8 +24,8 @@ public Function DecreaseSpacing(); Function IncreaseSpacing(); Function Indent(); - Function IndentCharWidth(Count); - Function IndentFirstLineCharWidth(Count); + Function IndentCharWidth(_Count); + Function IndentFirstLineCharWidth(_Count); Function Item(Index); Function OpenOrCloseUp(); Function OpenUp(); @@ -36,8 +37,8 @@ public Function Space1(); Function Space15(); Function Space2(); - Function TabHangingIndent(Count); - Function TabIndent(Count); + Function TabHangingIndent(_Count); + Function TabIndent(_Count); // Properties property AddSpaceBetweenFarEastAndAlpha read ReadAddSpaceBetweenFarEastAndAlpha write WriteAddSpaceBetweenFarEastAndAlpha; @@ -220,15 +221,21 @@ Begin return pos; End; -Function TSDocxParagraphs.AddParagraph(findNode, newNode, direction); +Function TSDocxParagraphs.AddParagraph(pos, newNode);overload; Begin - pos := self.FindNewParagraphPosition(findNode, direction); + if ifnil(pos) then pos := length(paragraphs_); if pos = length(paragraphs_) then lastnode_ := newNode; for i:=length(paragraphs_) downto pos do paragraphs_[i] := paragraphs_[i-1]; obj := TOfficeObj("TParagraph"); obj.Init(newNode); paragraphs_[pos] := obj; +End; + +Function TSDocxParagraphs.AddParagraph(findNode, newNode, direction);overload; +Begin + pos := self.FindNewParagraphPosition(findNode, direction); + self.AddParagraph(pos, newNode); return pos; End; diff --git a/docx/TSDocxRange.tsf b/docx/TSDocxRange.tsf index 38cd594..155621c 100644 --- a/docx/TSDocxRange.tsf +++ b/docx/TSDocxRange.tsf @@ -6,8 +6,8 @@ public Function AddParagraph();overload; Function AddParagraph(direction);overload; Function AddTable(numRows, numColumns); + Function InsertNewParagraph(); Function Clear(deleteAll); - Function InsertPara(); private Function CopyRunFormat(sourceRun, destRun); @@ -361,7 +361,7 @@ Begin return document_.Paragraphs.Item(pos + 1); End; -Function TSDocxRange.InsertPara(); +Function TSDocxRange.InsertNewParagraph(); Begin case collapse_ of TSDocxEnumerations.wdCollapseStart(): @@ -555,7 +555,7 @@ Begin case Type of TSDocxEnumerations.wdColumnBreak(): begin - paragraph_obj := self.InsertPara(); + paragraph_obj := self.InsertNewParagraph(); if collapse_ = TSDocxEnumerations.wdCollapseStart() then paragraph_obj := paragraph_obj.Next(1); obj := paragraph_obj.Object(); run := obj.PrependRun(); @@ -574,8 +574,8 @@ Begin TSDocxEnumerations.wdPageBreak(): begin - paragraph_obj := self.InsertPara(); - paragraph_obj := self.InsertPara(); + paragraph_obj := self.InsertNewParagraph(); + paragraph_obj := self.InsertNewParagraph(); paragraph_obj.Format.Alignment := TSDocxEnumerations.wdAlignParagraphLeft(); paragraph_obj.Format.WidowControl := true; paragraph_obj.Format.Apply(); @@ -609,7 +609,7 @@ End; Function TSDocxRange.InsertParagraph(); Begin - self.InsertPara(); + self.InsertNewParagraph(); End; Function TSDocxRange.InsertParagraphAfter(); diff --git a/docx/TSDocxTablesOfContents.tsf b/docx/TSDocxTablesOfContents.tsf index 4eecead..7b2f911 100644 --- a/docx/TSDocxTablesOfContents.tsf +++ b/docx/TSDocxTablesOfContents.tsf @@ -31,7 +31,7 @@ End; // Methods Function TSDocxTablesOfContents.Add(Range, UseHeadingStyles, UpperHeadingLevel, LowerHeadingLevel, UseFields, TableID, RightAlignPageNumbers, IncludePageNumbers, AddedStyles, UseHyperlinks, HidePageNumbersInWeb, UseOutlineLevels); Begin - paragraph := Range.InsertPara(); + paragraph := Range.InsertNewParagraph(); if ifnil(UpperHeadingLevel) then UpperHeadingLevel := 1; if ifnil(LowerHeadingLevel) then LowerHeadingLevel := 9; docx_.AddTableContent(paragraph.Object(), UpperHeadingLevel, LowerHeadingLevel);