range重新设计

This commit is contained in:
csh 2023-11-29 17:27:34 +08:00
parent 3781bc96e7
commit f0560b2330
28 changed files with 2829 additions and 383 deletions

View File

@ -357,7 +357,7 @@ Begin
End;
// property
// Properties
Function TSDocxApplication.ReadDocuments(Index)
Begin
if ifnil(Index) then return documents_;

View File

@ -118,6 +118,9 @@ Function TSDocxCell.Init(node);overload;
Begin
cell_ := TOfficeObj("tcell");
cell_.Create(node);
tcpr_node := class(TSXml).GetNode(node, "w:tcPr", "first");
tcpr_ := TOfficeObj("TwTcPr");
tcpr_.InitRootNode(tcpr_node);
End;
Function TSDocxCell.GetCell();
@ -418,7 +421,7 @@ End;
Function TSDocxCell.ReadShading();
Begin
shading_obj := new TSDocxShading(self.Application, self.Creator, self);
shading_obj.Init(tcpr_);
shading_obj.Init(tcpr_.Shading);
return shading_obj;
End;
@ -562,12 +565,9 @@ Function TSDocxCell.ReadRange();
Begin
if ifnil(range_) then
begin
pbegin := 0;
pend := 0;
arr := array();
class(TSWdCommon).CalculateRange(table_.Root(), docx_.Body().Root(), GetCell().Root(), false, pbegin, pend, arr);
obj := new TSWdRange(docx_.Body().Root(), GetCell().Root());
range_ := new TSDocxRange(self.Application, self.Creator, self);
range_.Init(pbegin, pend, arr);
range_.Init(docx_, obj);
end
return range_;
End;

View File

@ -1,7 +1,8 @@
Type TSDocxDocument = Class(TSVbaBase)
Uses TSDocxEnumerations;
public
Function Init(docx, name, fullname);
Function Init(docx, collection, name, fullname);
private
collection_;
@ -12,6 +13,7 @@ private
paragraphs_;
public
// Methods
Function AcceptAllRevisions();
Function AcceptAllRevisionsShown();
Function Activate(); // Completed
@ -63,7 +65,7 @@ public
Function PresentIt();
Function PrintOut(Background, Append, Range, OutputFileName, _From, _To, Item, Copies, Pages, PageType, PrintToFile, Collate, FileName, ActivePrinterMacGX, ManualDuplexPrint, PrintZoomColumn, PrintZoomRow, PrintZoomPaperWidth, PrintZoomPaperHeight);
Function PrintPreview();
Function Protect(Type, NoReset, Password, UseIRM, EnforceStyleLock);
Function Protect(_Type, NoReset, Password, UseIRM, EnforceStyleLock);
Function Range(Start, _End);
Function Redo(Times);
Function RejectAllRevisions();
@ -112,6 +114,7 @@ public
Function ViewPropertyBrowser();
Function WebPagePreview();
// Properties
property ActiveTheme read ReadActiveTheme;
property ActiveThemeDisplayName read ReadActiveThemeDisplayName;
property ActiveWindow read ReadActiveWindow;
@ -579,12 +582,12 @@ public
End;
// ============== 实现 ================= //
Function TSDocxDocument.Init(docx, name, fullname);
Function TSDocxDocument.Init(docx, collection, name, fullname);
Begin
docx_ := docx;
file_name_ := name;
full_name_ := fullname;
collection_ := class(Collection).GetInstance('document');
collection_ := collection;
tables_ := new TSDocxTables(self.Application, self.Creator, self);
tables.Init(docx_);
paragraphs_ := new TSDocxParagraphs(self.Application, self.Creator, self);
@ -599,8 +602,18 @@ End;
Function TSDocxDocument.Close(SaveChanges, OriginalFormat, RouteTSDocxDocument)
Begin
[err, msg] := docx_.Save();
if not err then collection_.RemoveCollection(file_name_);
if ifnil(SaveChanges) then SaveChanges := TSDocxEnumerations.wdDoNotSaveChanges();
case SaveChanges of
TSDocxEnumerations.wdDoNotSaveChanges():
collection_.RemoveCollection(file_name_);
TSDocxEnumerations.wdPromptToSaveChanges():
return;
TSDocxEnumerations.wdSaveChanges():
begin
[err, msg] := docx_.Save();
if not err then collection_.RemoveCollection(file_name_);
end
end;
End;
Function TSDocxDocument.Save();
@ -619,13 +632,10 @@ End;
Function TSDocxDocument.Range(Start, _End);
Begin
// Range(0, 1) 左开右闭
node := docx_.Body().Node(); // <body>
total_position := 0;
arr := array();
class(TSWdCommon).SplitRange(node, node, Start, _End, total_position, arr);
// Range[0, 1) 左开右闭
obj := new TSWdRange(docx_.Body().Root(), Start, _End);
range_obj := new TSDocxRange(self.Application, self.Creator, self);
range_obj.Init(Start, _End, arr);
range_obj.Init(docx_, obj);
return range_obj;
End;

View File

@ -35,15 +35,16 @@ End;
// ============== 实现 ================= //
Function TSDocxDocuments.Init();
Begin
collection_ := class(Collection).GetInstance('document');
collection_ := new Collection();
End;
Function TSDocxDocuments.AddDocument(docx, fullname);
Begin
name := ExtractFileName(fullname);
document := new TSDocxDocument(self.Application, self.Creator, self);
document.Init(docx, name, fullname);
document.Init(docx, collection_, name, fullname);
collection_.AddCollection(document, name);
return document;
End;
Function Operator TSDocxDocuments.[](index);
@ -56,12 +57,19 @@ Begin
return collection_.GetActivation();
End;
// function
// Methods
Function TSDocxDocuments.Add(Template, NewTemplate, DocumentType, Visible);
Begin
docx := new TSDocxFile();
docx.NewFile();
AddDocument(docx, collection_.CalNewName("文档"));
return AddDocument(docx, collection_.CalNewName("文档"));
End;
Function TSDocxDocuments.Close(SaveChanges, OriginalFormat, RouteDocument);
Begin
num := self.Count;
for i:=1 to num do
self[i].Close(SaveChanges, OriginalFormat, RouteDocument);
End;
Function TSDocxDocuments.Item(Index);
@ -76,7 +84,7 @@ Begin
docx := new TSDocxFile();
[err, msg] := docx.OpenFile("", FileName, PasswordDocument);
if err then return;
AddDocument(docx, docx.FileName());
return AddDocument(docx, docx.FileName());
End;
Function TSDocxDocuments.Save(NoPrompt, OriginalFormat);
@ -86,7 +94,7 @@ Begin
self[i].Save();
End;
// property
// Properties
Function TSDocxDocuments.ReadCount();
Begin
return collection_.GetCount();

View File

@ -489,6 +489,98 @@ Interface
Function wdLineWidth450pt();
Function wdLineWidth600pt();
// WdLineSpacing
Function wdLineSpace1pt5();
Function wdLineSpaceAtLeast();
Function wdLineSpaceDouble();
Function wdLineSpaceExactly();
Function wdLineSpaceMultiple();
Function wdLineSpaceSingle();
// WdParagraphAlignment
Function wdAlignParagraphCenter();
Function wdAlignParagraphDistribute();
Function wdAlignParagraphJustify();
Function wdAlignParagraphJustifyHi();
Function wdAlignParagraphJustifyLow();
Function wdAlignParagraphJustifyMed();
Function wdAlignParagraphLeft();
Function wdAlignParagraphRight();
Function wdAlignParagraphThaiJustify();
// WdBaselineAlignment
Function wdBaselineAlignAuto();
Function wdBaselineAlignBaseline();
Function wdBaselineAlignCenter();
Function wdBaselineAlignFarEast50();
Function wdBaselineAlignTop();
// WdOutlineLevel
Function wdOutlineLevel1();
Function wdOutlineLevel2();
Function wdOutlineLevel3();
Function wdOutlineLevel4();
Function wdOutlineLevel5();
Function wdOutlineLevel6();
Function wdOutlineLevel7();
Function wdOutlineLevel8();
Function wdOutlineLevel9();
Function wdOutlineLevelBodyText();
// WdReadingOrder
Function wdReadingOrderLtr();
Function wdReadingOrderRtl();
// WdTextboxTightWrap
Function wdTightAll();
Function wdTightFirstAndLastLines();
Function wdTightFirstLineOnly();
Function wdTightLastLineOnly();
Function wdTightNone();
// WdInformation
Function wdActiveEndAdjustedPageNumber();
Function wdActiveEndPageNumber();
Function wdActiveEndSectionNumber();
Function wdAtEndOfRowMarker();
Function wdCapsLock();
Function wdEndOfRangeColumnNumber();
Function wdEndOfRangeRowNumber();
Function wdFirstCharacterColumnNumber();
Function wdFirstCharacterLineNumber();
Function wdFrameIsSelected();
Function wdHeaderFooterType();
Function wdHorizontalPositionRelativeToPage();
Function wdHorizontalPositionRelativeToTextBoundary();
Function wdInBibliography();
Function wdInCitation();
Function wdInClipboard();
Function wdInCommentPane();
Function wdInContentControl();
Function wdInCoverPage();
Function wdInEndnote();
Function wdInFieldCode();
Function wdInFieldResult();
Function wdInFootnote();
Function wdInFootnoteEndnotePane();
Function wdInHeaderFooter();
Function wdInMasterDocument();
Function wdInWordMail();
Function wdMaximumNumberOfColumns();
Function wdMaximumNumberOfRows();
Function wdNumberOfPagesInDocument();
Function wdNumLock();
Function wdOverType();
Function wdReferenceOfType();
Function wdRevisionMarking();
Function wdSelectionMode();
Function wdStartOfRangeColumnNumber();
Function wdStartOfRangeRowNumber();
Function wdVerticalPositionRelativeToPage();
Function wdVerticalPositionRelativeToTextBoundary();
Function wdWithInTable();
Function wdZoomPercentage();
Implementation
// WdConstants enumeration
@ -2311,5 +2403,331 @@ Implementation
return 48;
End;
// WdLineSpacing
Function wdLineSpace1pt5();
Begin
return 1;
End;
Function wdLineSpaceAtLeast();
Begin
return 3;
End;
Function wdLineSpaceDouble();
Begin
return 2;
End;
Function wdLineSpaceExactly();
Begin
return 4;
End;
Function wdLineSpaceMultiple();
Begin
return 5;
End;
Function wdLineSpaceSingle();
Begin
return 0;
End;
// WdParagraphAlignment
Function wdAlignParagraphCenter();
Begin
return 1;
End;
Function wdAlignParagraphDistribute();
Begin
return 4;
End;
Function wdAlignParagraphJustify();
Begin
return 3;
End;
Function wdAlignParagraphJustifyHi();
Begin
return 7;
End;
Function wdAlignParagraphJustifyLow();
Begin
return 8;
End;
Function wdAlignParagraphJustifyMed();
Begin
return 5;
End;
Function wdAlignParagraphLeft();
Begin
return 0;
End;
Function wdAlignParagraphRight();
Begin
return 2;
End;
Function wdAlignParagraphThaiJustify();
Begin
return 9;
End;
// WdBaselineAlignment
Function wdBaselineAlignAuto();
Begin
return 4;
End;
Function wdBaselineAlignBaseline();
Begin
return 2;
End;
Function wdBaselineAlignCenter();
Begin
return 1;
End;
Function wdBaselineAlignFarEast50();
Begin
return 3;
End;
Function wdBaselineAlignTop();
Begin
return 0;
End;
// WdOutlineLevel
Function wdOutlineLevel1();
Begin
return 1;
End;
Function wdOutlineLevel2();
Begin
return 2;
End;
Function wdOutlineLevel3();
Begin
return 3;
End;
Function wdOutlineLevel4();
Begin
return 4;
End;
Function wdOutlineLevel5();
Begin
return 5;
End;
Function wdOutlineLevel6();
Begin
return 6;
End;
Function wdOutlineLevel7();
Begin
return 7;
End;
Function wdOutlineLevel8();
Begin
return 8;
End;
Function wdOutlineLevel9();
Begin
return 9;
End;
Function wdOutlineLevelBodyText();
Begin
return 10;
End;
// WdReadingOrder
Function wdReadingOrderLtr();
Begin
return 1;
End;
Function wdReadingOrderRtl();
Begin
return 0;
End;
// WdTextboxTightWrap
Function wdTightAll();
Begin
return 1;
End;
Function wdTightFirstAndLastLines();
Begin
return 2;
End;
Function wdTightFirstLineOnly();
Begin
return 3;
End;
Function wdTightLastLineOnly();
Begin
return 4;
End;
Function wdTightNone();
Begin
return 0;
End;
// WdInformation
Function wdActiveEndAdjustedPageNumber();
Begin
return 1;
End;
Function wdActiveEndPageNumber();
Begin
return 3;
End;
Function wdActiveEndSectionNumber();
Begin
return 2;
End;
Function wdAtEndOfRowMarker();
Begin
return 31;
End;
Function wdCapsLock();
Begin
return 21;
End;
Function wdEndOfRangeColumnNumber();
Begin
return 17;
End;
Function wdEndOfRangeRowNumber();
Begin
return 14;
End;
Function wdFirstCharacterColumnNumber();
Begin
return 9;
End;
Function wdFirstCharacterLineNumber();
Begin
return 10;
End;
Function wdFrameIsSelected();
Begin
return 11;
End;
Function wdHeaderFooterType();
Begin
return 33;
End;
Function wdHorizontalPositionRelativeToPage();
Begin
return 5;
End;
Function wdHorizontalPositionRelativeToTextBoundary();
Begin
return 7;
End;
Function wdInBibliography();
Begin
return 42;
End;
Function wdInCitation();
Begin
return 43;
End;
Function wdInClipboard();
Begin
return 38;
End;
Function wdInCommentPane();
Begin
return 26;
End;
Function wdInContentControl();
Begin
return 46;
End;
Function wdInCoverPage();
Begin
return 41;
End;
Function wdInEndnote();
Begin
return 36;
End;
Function wdInFieldCode();
Begin
return 44;
End;
Function wdInFieldResult();
Begin
return 45;
End;
Function wdInFootnote();
Begin
return 35;
End;
Function wdInFootnoteEndnotePane();
Begin
return 25;
End;
Function wdInHeaderFooter();
Begin
return 28;
End;
Function wdInMasterDocument();
Begin
return 34;
End;
Function wdInWordMail();
Begin
return 37;
End;
Function wdMaximumNumberOfColumns();
Begin
return 18;
End;
Function wdMaximumNumberOfRows();
Begin
return 15;
End;
Function wdNumberOfPagesInDocument();
Begin
return 4;
End;
Function wdNumLock();
Begin
return 22;
End;
Function wdOverType();
Begin
return 23;
End;
Function wdReferenceOfType();
Begin
return 32;
End;
Function wdRevisionMarking();
Begin
return 24;
End;
Function wdSelectionMode();
Begin
return 20;
End;
Function wdStartOfRangeColumnNumber();
Begin
return 16;
End;
Function wdStartOfRangeRowNumber();
Begin
return 13;
End;
Function wdVerticalPositionRelativeToPage();
Begin
return 6;
End;
Function wdVerticalPositionRelativeToTextBoundary();
Begin
return 8;
End;
Function wdWithInTable();
Begin
return 12;
End;
Function wdZoomPercentage();
Begin
return 19;
End;
End.

View File

@ -1,183 +1,58 @@
Type TSDocxParagraph = Class(TSVbaBase)
Type TSDocxParagraph = Class(TSDocxParagraphFormat)
public
Function Init(body, paragraph, index);
Function Init(docx, paragraph, index);
private
body_;
paragraph_; // TOfficeObj("TParagraph")
index_; // 第N个段落1开始计数
range_;
public
Function CloseUp();
// Methods
Function Indent();
Function IndentCharWidth(Count);
Function IndentFirstLineCharWidth(Count);
Function JoinList();
Function ListAdvanceTo();
Function Next(Count);
Function OpenOrCloseUp();
Function OpenUp();
Function Outdent();
Function OutlineDemote();
Function OutlineDemoteToBody();
Function OutlinePromote();
Function Previous(Count);
Function Reset();
Function ResetAdvanceTo();
Function SelectNumber();
Function SeparateList();
Function Space1();
Function Space15();
Function Space2();
Function TabHangingIndent(Count);
Function TabIndent(Count);
property AddSpaceBetweenFarEastAndAlpha read ReadAddSpaceBetweenFarEastAndAlpha write WriteAddSpaceBetweenFarEastAndAlpha;
property AddSpaceBetweenFarEastAndDigit read ReadAddSpaceBetweenFarEastAndDigit write WriteAddSpaceBetweenFarEastAndDigit;
property Alignment read ReadAlignment write WriteAlignment;
property AutoAdjustRightIndent read ReadAutoAdjustRightIndent write WriteAutoAdjustRightIndent;
property BaseLineAlignment read ReadBaseLineAlignment write WriteBaseLineAlignment;
property Borders read ReadBorders;
property CharacterUnitFirstLineIndent read ReadCharacterUnitFirstLineIndent write WriteCharacterUnitFirstLineIndent;
property CharacterUnitLeftIndent read ReadCharacterUnitLeftIndent write WriteCharacterUnitLeftIndent;
property CharacterUnitRightIndent read ReadCharacterUnitRightIndent write WriteCharacterUnitRightIndent;
property CollapsedState read ReadCollapsedState write WriteCollapsedState;
property CollapseHeadingByDefault read ReadCollapseHeadingByDefault write WriteCollapseHeadingByDefault;
property DisableLineHeightGrid read ReadDisableLineHeightGrid write WriteDisableLineHeightGrid;
property DropCap read ReadDropCap;
property FarEastLineBreakControl read ReadFarEastLineBreakControl write WriteFarEastLineBreakControl;
property FirstLineIndent read ReadFirstLineIndent write WriteFirstLineIndent;
property Format read ReadFormat write WriteFormat;
property HalfWidthPunctuationOnTopOfLine read ReadHalfWidthPunctuationOnTopOfLine write WriteHalfWidthPunctuationOnTopOfLine;
property HangingPunctuation read ReadHangingPunctuation write WriteHangingPunctuation;
property Hyphenation read ReadHyphenation write WriteHyphenation;
property ID read ReadID write WriteID;
property IsStyleSeparator read ReadIsStyleSeparator;
property KeepTogether read ReadKeepTogether write WriteKeepTogether;
property KeepWithNext read ReadKeepWithNext write WriteKeepWithNext;
property LeftIndent read ReadLeftIndent write WriteLeftIndent;
property LineSpacing read ReadLineSpacing write WriteLineSpacing;
property LineSpacingRule read ReadLineSpacingRule write WriteLineSpacingRule;
property LineUnitAfter read ReadLineUnitAfter write WriteLineUnitAfter;
property LineUnitBefore read ReadLineUnitBefore write WriteLineUnitBefore;
property ListNumberOriginal read ReadListNumberOriginal;
property MirrorIndents read ReadMirrorIndents write WriteMirrorIndents;
property NoLineNumber read ReadNoLineNumber write WriteNoLineNumber;
property OutlineLevel read ReadOutlineLevel write WriteOutlineLevel;
property PageBreakBefore read ReadPageBreakBefore write WritePageBreakBefore;
property Range read ReadRange;
property ReadingOrder read ReadReadingOrder write WriteReadingOrder;
property RightIndent read ReadRightIndent write WriteRightIndent;
property Shading read ReadShading;
property SpaceAfter read ReadSpaceAfter write WriteSpaceAfter;
property SpaceAfterAuto read ReadSpaceAfterAuto write WriteSpaceAfterAuto;
property SpaceBefore read ReadSpaceBefore write WriteSpaceBefore;
property SpaceBeforeAuto read ReadSpaceBeforeAuto write WriteSpaceBeforeAuto;
property Style read ReadStyle write WriteStyle;
property TabStops read ReadTabStops write WriteTabStops;
property TextboxTightWrap read ReadTextboxTightWrap write WriteTextboxTightWrap;
property WidowControl read ReadWidowControl write WriteWidowControl;
property WordWrap read ReadWordWrap write WriteWordWrap;
Function WriteWordWrap(value);
Function ReadWordWrap();
Function WriteWidowControl(value);
Function ReadWidowControl();
Function WriteTextboxTightWrap(value);
Function ReadTextboxTightWrap();
Function WriteTabStops(value);
Function ReadTabStops();
Function WriteStyle(value);
Function ReadStyle();
Function WriteSpaceBeforeAuto(value);
Function ReadSpaceBeforeAuto();
Function WriteSpaceBefore(value);
Function ReadSpaceBefore();
Function WriteSpaceAfterAuto(value);
Function ReadSpaceAfterAuto();
Function WriteSpaceAfter(value);
Function ReadSpaceAfter();
Function ReadShading();
Function WriteRightIndent(value);
Function ReadRightIndent();
Function WriteReadingOrder(value);
Function ReadReadingOrder();
Function ReadRange();
Function WritePageBreakBefore(value);
Function ReadPageBreakBefore();
Function WriteOutlineLevel(value);
Function ReadOutlineLevel();
Function WriteNoLineNumber(value);
Function ReadNoLineNumber();
Function WriteMirrorIndents(value);
Function ReadMirrorIndents();
Function ReadListNumberOriginal();
Function WriteLineUnitBefore(value);
Function ReadLineUnitBefore();
Function WriteLineUnitAfter(value);
Function ReadLineUnitAfter();
Function WriteLineSpacingRule(value);
Function ReadLineSpacingRule();
Function WriteLineSpacing(value);
Function ReadLineSpacing();
Function WriteLeftIndent(value);
Function ReadLeftIndent();
Function WriteKeepWithNext(value);
Function ReadKeepWithNext();
Function WriteKeepTogether(value);
Function ReadKeepTogether();
Function ReadIsStyleSeparator();
Function WriteID(value);
Function ReadID();
Function WriteHyphenation(value);
Function ReadHyphenation();
Function WriteHangingPunctuation(value);
Function ReadHangingPunctuation();
Function WriteHalfWidthPunctuationOnTopOfLine(value);
Function ReadHalfWidthPunctuationOnTopOfLine();
Function WriteFormat(value);
Function ReadFormat();
Function WriteFirstLineIndent(value);
Function ReadFirstLineIndent();
Function WriteFarEastLineBreakControl(value);
Function ReadFarEastLineBreakControl();
Function ReadDropCap();
Function WriteDisableLineHeightGrid(value);
Function ReadDisableLineHeightGrid();
Function WriteCollapseHeadingByDefault(value);
Function ReadCollapseHeadingByDefault();
Function WriteCollapsedState(value);
Function ReadCollapsedState();
Function WriteCharacterUnitRightIndent(value);
Function ReadCharacterUnitRightIndent();
Function WriteCharacterUnitLeftIndent(value);
Function ReadCharacterUnitLeftIndent();
Function WriteCharacterUnitFirstLineIndent(value);
Function ReadCharacterUnitFirstLineIndent();
Function ReadBorders(index);
Function WriteBaseLineAlignment(value);
Function ReadBaseLineAlignment();
Function WriteAutoAdjustRightIndent(value);
Function ReadAutoAdjustRightIndent();
Function WriteAlignment(value);
Function ReadAlignment();
Function WriteAddSpaceBetweenFarEastAndDigit(value);
Function ReadAddSpaceBetweenFarEastAndDigit();
Function WriteAddSpaceBetweenFarEastAndAlpha(value);
Function ReadAddSpaceBetweenFarEastAndAlpha();
Function ReadDropCap();
Function WriteFormat(value);
Function ReadFormat();
Function WriteID(value);
Function ReadID();
Function ReadIsStyleSeparator();
Function ReadListNumberOriginal();
Function ReadRange();
End;
// ============== 实现 ================= //
Function TSDocxParagraph.Init(body, paragraph, index);
Function TSDocxParagraph.Init(docx, paragraph, index);
Begin
body_ := body;
paragraph_ := paragraph;
index_ := index;
range_ := nil;
class(TSDocxParagraphFormat).Init(docx, paragraph_.pPr);
End;
// function
// Methods
Function TSDocxParagraph.Next(Count);
Begin
return self.Parent.Item(index + Count);
@ -187,25 +62,25 @@ Function TSDocxParagraph.Previous(Count);
Begin
return self.Parent.Item(index - Count);
End;
// property
Function TSDocxParagraph.ReadBorders(index);
Begin
borders_obj := new TSDocxBordersParagraph(self.Application, self.Creator, self.Parent);
borders_obj.Init(paragraph_);
return ifnil(index) ? borders_obj : borders_obj[index];
End;
// Properties
Function TSDocxParagraph.ReadRange();
Begin
if ifnil(range_) then
begin
pbegin := 0;
pend := 0;
arr := array();
node := body_.Root();
class(TSWdCommon).CalculateRange(node, node, paragraph_.Root(), false, pbegin, pend, arr);
obj := new TSWdRange(docx_.Body().Root(), paragraph_.Root());
range_ := new TSDocxRange(self.Application, self.Creator, self);
range_.Init(pbegin, pend, arr);
range_.Init(docx_, obj);
end
return range_;
End;
Function TSDocxParagraph.ReadFormat();
Begin
return self;
End;
Function TSDocxParagraph.WriteFormat(value);
Begin
self.ReWrite(value);
End;

View File

@ -7,7 +7,7 @@ public
private
docx_;
body_;
lastnode_;
paragraphs_; // TOfficeObj("TParagraph")数组
public
@ -154,9 +154,9 @@ End;
Function TSDocxParagraphs.Init(docx);
Begin
docx_ := docx;
body_ := docx_.Body();
paragraphs_ := array();
SerializeParagraphs(body_.Node());
lastnode_ := nil;
SerializeParagraphs(docx_.Body().Node());
End;
Function TSDocxParagraphs.SerializeParagraphs(root);
@ -170,6 +170,7 @@ Begin
obj := TOfficeObj("TParagraph");
obj.Init(node);
paragraphs_[length(paragraphs_)] := obj;
lastnode_ := node;
end
else if name = "w:tbl" then
begin
@ -185,6 +186,7 @@ Begin
paragraphs_[length(paragraphs_)] := TOfficeObj("TParagraph");
tr := tr.NextElement("w:tr");
end
lastnode_ := node;
end
node := node.NextElement();
End;
@ -193,11 +195,24 @@ End;
Function Operator TSDocxParagraphs.[](index);
Begin
paragraph_obj := new TSDocxParagraph(self.Application, self.Creator, self.Parent);
paragraph_obj.Init(body_, paragraphs_[index], index + 1);
paragraph_obj.Init(docx_, paragraphs_[index], index + 1);
return paragraph_obj;
End;
// function
// Methods
Function TSDocxParagraphs.Add(Range);
Begin
if lastnode_ then
node := docx_.Body().Root().InsertAfterChild(lastnode_, "element", "w:p");
else
node := docx_.Body().Root().InsertFirstChild("element", "w:p");
lastnode_ := node;
obj := TOfficeObj("TParagraph");
obj.Init(node);
paragraphs_[length(paragraphs_)] := obj;
return self.Item(length(paragraphs_) - 1);
End;
Function TSDocxParagraphs.Item(Index);
Begin
return self[Index - 1];
@ -207,3 +222,13 @@ Function TSDocxParagraphs.ReadCount();
Begin
return length(paragraphs_);
End;
Function TSDocxParagraphs.ReadFirst();
Begin
return self.Item(1);
End;
Function TSDocxParagraphs.ReadLast();
Begin
return self.Item(self.Count);
End;

View File

@ -2,16 +2,15 @@ Type TSDocxRange = class(TSVbaBase)
Uses TSDocxEnumerations;
public
Function Init(pbegin, pend, arr);
Function SetRangeArr(arr);
Function SetRangeFont();
Function Init(docx, rangeObj);
Function CopyRunFormat(sourceRun, destRun);
private
range_arr_;
docx_;
range_obj_; // TSWdRange
range_font_; // TSDocxFontRange
begin_;
end_;
paragraph_format_range_; // TSDocxParagraphFormatRange
borders_range_; // TSDocxBordersRange
public
Function AutoFormat();
@ -254,7 +253,7 @@ public
Function ReadItalic();
Function ReadIsEndOfRowMark();
Function ReadInlineShapes();
Function ReadInformation();
Function ReadInformation(Type);
Function WriteID(value);
Function ReadID();
Function ReadHyperlinks();
@ -313,20 +312,16 @@ public
End;
// ============== 实现 ================= //
Function TSDocxRange.Init(pbegin, pend, arr);
Function TSDocxRange.Init(docx, rangeObj);
Begin
range_arr_ := arr;
begin_ := pbegin;
end_ := pend;
docx_ := docx;
range_obj_ := rangeObj;
range_font_ := new TSDocxFontRange(self.Application, self.Creator, self);
range_font_.Init(range_arr_);
End;
Function TSDocxRange.SetRangeArr(arr);
Begin
range_arr_ := arr;
range_font_ := new TSDocxFontRange(self.Application, self.Creator, self);
range_font_.Init(range_arr_);
range_font_.Init(range_obj_);
paragraph_format_range_ := new TSDocxParagraphFormatRange(self.Application, self.Creator, self);
paragraph_format_range_.Init(docx_, range_obj_);
borders_range_ := new TSDocxBordersRange(self.Application, self.Creator, self);
borders_range_.Init(range_obj_);
End;
Function TSDocxRange.CopyRunFormat(sourceRun, destRun);
@ -337,7 +332,8 @@ Begin
class(TSXml).UpdateNode(node, marshal[0]["attribute"], marshal[0]["children"]);
End;
// function
// Methods
// TODO
Function TSDocxRange.InsertAfter(Text);
Begin
paragraph := range_arr_[length(range_arr_)-1]["tparagraph"];
@ -355,6 +351,7 @@ Begin
end
End;
// TODO
Function TSDocxRange.InsertBefore(Text);
Begin
paragraph := range_arr_[0]["tparagraph"];
@ -374,6 +371,7 @@ Begin
end
End;
// TODO
Function TSDocxRange.InsertBreak(Type);
Begin
pf := function(t, c);
@ -440,7 +438,102 @@ End;
Function TSDocxRange.ReadBorders(index);
Begin
borders_obj := new TSDocxBordersRange(self.Application, self.Creator, self);
borders_obj.Init(range_arr_);
return ifnil(index) ? borders_obj : borders_obj.Item(index);
return ifnil(index) ? borders_range_ : borders_range_.Item(index);
End;
Function TSDocxRange.WriteParagraphFormat(value);
Begin
paragraph_format_range_.ReWrite(value);
End;
Function TSDocxRange.ReadParagraphFormat();
Begin
return paragraph_format_range_;
End;
Function TSDocxRange.ReadInformation(Type);
Begin
case Type of
// TSDocxEnumerations.wdActiveEndAdjustedPageNumber():
// TSDocxEnumerations.wdActiveEndPageNumber():
// TSDocxEnumerations.wdActiveEndSectionNumber():
// TSDocxEnumerations.wdAtEndOfRowMarker():
// TSDocxEnumerations.wdCapsLock():
// TSDocxEnumerations.wdEndOfRangeColumnNumber():
// TSDocxEnumerations.wdEndOfRangeRowNumber():
// TSDocxEnumerations.wdFirstCharacterColumnNumber():
// TSDocxEnumerations.wdFirstCharacterLineNumber():
// TSDocxEnumerations.wdFrameIsSelected():
// TSDocxEnumerations.wdHeaderFooterType():
// TSDocxEnumerations.wdHorizontalPositionRelativeToPage():
// TSDocxEnumerations.wdHorizontalPositionRelativeToTextBoundary():
// TSDocxEnumerations.wdInBibliography():
// TSDocxEnumerations.wdInCitation():
// TSDocxEnumerations.wdInClipboard():
// TSDocxEnumerations.wdInCommentPane():
// TSDocxEnumerations.wdInContentControl():
// TSDocxEnumerations.wdInCoverPage():
// TSDocxEnumerations.wdInEndnote():
// TSDocxEnumerations.wdInFieldCode():
// TSDocxEnumerations.wdInFieldResult():
// TSDocxEnumerations.wdInFootnote():
// TSDocxEnumerations.wdInFootnoteEndnotePane():
// TSDocxEnumerations.wdInHeaderFooter():
// TSDocxEnumerations.wdInMasterDocument():
// TSDocxEnumerations.wdInWordMail():
// TSDocxEnumerations.wdMaximumNumberOfColumns():
// TSDocxEnumerations.wdMaximumNumberOfRows():
// TSDocxEnumerations.wdNumberOfPagesInDocument():
// TSDocxEnumerations.wdNumLock():
// TSDocxEnumerations.wdOverType():
// TSDocxEnumerations.wdReferenceOfType():
// TSDocxEnumerations.wdRevisionMarking():
// TSDocxEnumerations.wdSelectionMode():
// TSDocxEnumerations.wdStartOfRangeColumnNumber():
// TSDocxEnumerations.wdStartOfRangeRowNumber():
// TSDocxEnumerations.wdVerticalPositionRelativeToPage():
// TSDocxEnumerations.wdVerticalPositionRelativeToTextBoundary():
TSDocxEnumerations.wdWithInTable():
begin
for i:=0 to length(range_arr_) do
begin
node := range_arr_[i]["parent"];
if node.GetName() <> "w:tbl" then return false;
end
return true;
end
// TSDocxEnumerations.wdZoomPercentage():
end;
End;
Function TSDocxRange.WriteStyle(value);
Begin
paragraph_format_range_.Style := value;
End;
Function TSDocxRange.ReadStyle();
Begin
return paragraph_format_range_.Style;
End;
Function TSDocxRange.WriteText(value);
Begin
range_obj_.Clear();
run := range_obj_.Data[0]["trun"];
if ifObj(run.Root()) then run.SetText(value);
else begin
run := range_obj_.Data[0]["tparagraph"].AppendRun();
run.SetText(value);
range_obj_.Data[0]["trun"] := run;
end
End;
Function TSDocxRange.ReadText();
Begin
txt := "";
prev := range_obj_.Data[0]["tparagraph"];
for i:=0 to length(range_obj_.Data)-1 do
begin
run := range_obj_.Data[i]["trun"];
txt += prev = range_obj_.Data[i]["tparagraph"] ? run.Text() : "\n" + run.Text();
end
return txt;
End;

View File

@ -1,49 +0,0 @@
Type TSDocxShading = Class(TSVbaBase)
Uses TSDocxEnumerations;
public
Function Init(pr);
private
pr_; // xxPr对象比如Cell: tr.tcPr或Paragraph: p.pPr
public
property BackgroundPatternColor read ReadBackgroundPatternColor write WriteBackgroundPatternColor;
property BackgroundPatternColorIndex read ReadBackgroundPatternColorIndex write WriteBackgroundPatternColorIndex;
property ForegroundPatternColor read ReadForegroundPatternColor write WriteForegroundPatternColor;
property ForegroundPatternColorIndex read ReadForegroundPatternColorIndex write WriteForegroundPatternColorIndex;
property Texture read ReadTexture write WriteTexture;
Function WriteTexture(texture);
Function ReadTexture();
Function WriteForegroundPatternColorIndex();
Function ReadForegroundPatternColorIndex();
Function WriteForegroundPatternColor();
Function ReadForegroundPatternColor();
Function WriteBackgroundPatternColorIndex();
Function ReadBackgroundPatternColorIndex();
Function WriteBackgroundPatternColor();
Function ReadBackgroundPatternColor();
End;
// ============== 实现 ================= //
Function TSDocxShading.Init(pr);
Begin
pr_ := pr;
End;
// property
Function TSDocxShading.WriteTexture(texture);
Begin
case texture of
TSDocxEnumerations.wdTextureHorizontal():
begin
pr_.Shading.Val := "thinHorzStripe";
pr_.Update();
end
end;
End;
Function TSDocxShading.ReadTexture();
Begin
End;

View File

@ -209,13 +209,9 @@ Function TSDocxTable.ReadRange();
Begin
if ifnil(range_) then
begin
pbegin := 0;
pend := 0;
arr := array();
root := docx_.Body().Root();
class(TSWdCommon).CalculateRange(root, root, table_.Root(), false, pbegin, pend, arr);
obj := new TSWdRange(docx_.Body().Root(), table_.Root());
range_ := new TSDocxRange(self.Application, self.Creator, self);
range_.Init(pbegin, pend, arr);
range_.Init(docx_, obj);
end
return range_;
End;

View File

@ -2,7 +2,7 @@ Type TSDocxBorderRange = Class(TSDocxBorder)
Uses TSDocxEnumerations;
public
Function Init(arr, borderType);
Function Init(rangeObj, borderType);
private
Function GetBorderObjectByNode(node);
@ -12,9 +12,8 @@ private
Function SplitRun();
private
range_arr_;
range_obj_;
border_type_;
split_flag_;
public
Function WriteVisible(value);override;
@ -36,20 +35,17 @@ End;
// ============== 实现 ================= //
Function TSDocxBorderRange.Init(arr, borderType);
Function TSDocxBorderRange.Init(rangeObj, borderType);
Begin
range_arr_ := arr;
range_obj_ := rangeObj;
border_type_ := borderType;
split_flag_ := false;
class(TSDocxBorder).Init(nil);
End;
Function TSDocxBorderRange.SplitRun();
Begin
if split_flag_ then return;
class(TSWdCommon).SplitRangeRun(range_arr_);
self.Parent.SetRangeArr(range_arr_);
split_flag_ := true;
range_obj_.SplitRangeRun();
self.Parent.SetRangeObj(range_obj_);
End;
Function TSDocxBorderRange.GetBorder(arr, hash);
@ -100,9 +96,10 @@ Function TSDocxBorderRange.CallFunction(fname, value);overload;
Begin
SplitRun();
hash := array();
for i:=0 to length(range_arr_)-1 do
range_arr := rangeObj.GetInfo();
for i:=0 to length(range_arr)-1 do
begin
border := GetBorder(range_arr_[i], hash);
border := GetBorder(range_arr[i], hash);
if ifnil(border) then continue;
pf := FindFunction(fname, border);
pf.Do(value);
@ -112,10 +109,11 @@ End;
Function TSDocxBorderRange.CallFunction(fname);overload;
Begin
hash := array();
range_arr := rangeObj.GetInfo();
ret := nil;
for i:=0 to length(range_arr_)-1 do
for i:=0 to length(range_arr)-1 do
begin
border := GetBorder(range_arr_[i], hash);
border := GetBorder(range_arr[i], hash);
if ifnil(border) then continue;
pf := FindFunction(fname, border);
r := pf.Do();

View File

@ -6,20 +6,20 @@ public
Function GetBorder(index);override;
private
paragraph_; // TOfficeObj("TParagraph")
pr_; // TOfficeObj("TwpPr")
End;
// ============== 实现 ================= //
Function TSDocxBordersParagraph.Init(paragraph);
Function TSDocxBordersParagraph.Init(pr);
Begin
paragraph_ := paragraph;
pr_ := pr;
End;
Function TSDocxBordersParagraph.GetBorder(index);override;
Begin
obj := paragraph_.pPr.Bdr;
obj := pr_.Bdr;
case index of
TSDocxEnumerations.wdBorderBottom():
border := obj.Bottom;

View File

@ -1,11 +1,11 @@
Type TSDocxBordersRange = Class(TSDocxBorders)
public
Function Init(arr);
Function Init(rangeObj);
Function Operator[](index);override;
private
range_arr_;
range_obj_;
public
Function Item(Index);override;
@ -14,15 +14,15 @@ End;
// ============== 实现 ================= //
Function TSDocxBordersRange.Init(arr);
Function TSDocxBordersRange.Init(rangeObj);
Begin
range_arr_ := arr;
range_obj_ := rangeObj;
End;
Function Operator TSDocxBordersRange.[](index);override;
Begin
border_obj := new TSDocxBorderRange(self.Application, self.Creator, self.Parent);
border_obj.Init(range_arr_, index);
border_obj.Init(range_obj_, index);
return border_obj;
End;

View File

@ -3,6 +3,7 @@ Uses TSDocxEnumerations;
public
Function Init(pr);
Function Apply();virtual;
protected
pr_;
@ -161,17 +162,21 @@ Begin
color_ := TSWdColor();
End;
// function
Function TSDocxFont.Apply();virtual;
Begin
pr_.Update("first");
End;
// Methods
Function TSDocxFont.Reset();virtual;
Begin
pr_.Delete();
End;
// property
// Properties
Function TSDocxFont.WriteAllCaps(value);virtual;
Begin
pr_.Caps := value = TSDocxEnumerations.wdToggle() ? _Not(self.Caps) : value;
pr_.Update("first");
End;
Function TSDocxFont.ReadAllCaps();virtual;
Begin
@ -181,7 +186,6 @@ End;
Function TSDocxFont.WriteBold(value);virtual;
Begin
pr_.Bold := value = TSDocxEnumerations.wdToggle() ? _Not(self.Bold) : value;
pr_.Update("first");
End;
Function TSDocxFont.ReadBold();virtual;
Begin
@ -191,7 +195,6 @@ End;
Function TSDocxFont.WriteBoldBi(value);virtual;
Begin
pr_.BoldBi := value = TSDocxEnumerations.wdToggle() ? _Not(self.BoldBi) : value;
pr_.Update("first");
End;
Function TSDocxFont.ReadBoldBi();virtual;
Begin
@ -204,7 +207,6 @@ Begin
if ifnil(color) then pr_.Root().DeleteChild("w:color");
else begin
pr_.Color := color;
pr_.Update("first");
end
End;
Function TSDocxFont.ReadColorIndex();virtual;
@ -224,7 +226,6 @@ End;
Function TSDocxFont.WriteContextualAlternates(value);virtual;
Begin
pr_.ContextualAlternates := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadContextualAlternates();virtual;
Begin
@ -234,7 +235,6 @@ End;
Function TSDocxFont.WriteDisableCharacterSpaceGrid(value);virtual;
Begin
pr_.SnapToGrid := value ? false : true;
pr_.Update("first");
End;
Function TSDocxFont.ReadDisableCharacterSpaceGrid();virtual;
Begin
@ -244,7 +244,6 @@ End;
Function TSDocxFont.WriteDoubleStrikeThrough(value);virtual;
Begin
pr_.dStrike := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadDoubleStrikeThrough();virtual;
Begin
@ -260,7 +259,6 @@ End;
Function TSDocxFont.WriteEmboss(value);override;
Begin
pr_.Emboss := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadEmboss();override;
Begin
@ -281,7 +279,6 @@ Begin
TSDocxEnumerations.wdEmphasisMarkUnderSolidCircle:
pr_.Em := "underDot";
end;
pr_.Update("first");
End;
Function TSDocxFont.ReadEmphasisMark();virtual;
Begin
@ -302,7 +299,6 @@ End;
Function TSDocxFont.WriteEngrave(value);virtual;
Begin
pr_.ImPrint := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadEngrave();virtual;
Begin
@ -312,7 +308,6 @@ End;
Function TSDocxFont.WriteHidden(value);virtual;
Begin
pr_.Vanish := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadHidden();virtual;
Begin
@ -322,7 +317,6 @@ End;
Function TSDocxFont.WriteItalic(value);virtual;
Begin
pr_.Italic := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadItalic();virtual;
Begin
@ -332,7 +326,6 @@ End;
Function TSDocxFont.WriteItalicBi(value);virtual;
Begin
pr_.ICs := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadItalicBi();virtual;
Begin
@ -342,7 +335,6 @@ End;
Function TSDocxFont.WriteKerning(value);virtual;
Begin
pr_.Kern := value * 2;
pr_.Update("first");
End;
Function TSDocxFont.ReadKerning();virtual;
Begin
@ -385,7 +377,6 @@ Begin
TSDocxEnumerations.wdLigaturesStandardHistoricalDiscretional():
pr_.Ligatures := "standardHistoricalDiscretional";
end;
pr_.Update("first");
End;
Function TSDocxFont.ReadLigatures();virtual;
Begin
@ -429,7 +420,6 @@ Function TSDocxFont.WriteName(value);virtual;
Begin
pr_.rFont.EastAsia := value;
pr_.rFont.Ascii := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadName();virtual;
@ -440,7 +430,6 @@ End;
Function TSDocxFont.WriteNameAscii(value);virtual;
Begin
pr_.rFont.Ascii := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadNameAscii();virtual;
Begin
@ -450,7 +439,6 @@ End;
Function TSDocxFont.WriteNameBi(value);virtual;
Begin
pr_.rFont.Cs := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadNameBi();virtual;
Begin
@ -460,7 +448,6 @@ End;
Function TSDocxFont.WriteNameFarEast(value);virtual;
Begin
pr_.rFont.EastAsia := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadNameFarEast();virtual;
Begin
@ -471,7 +458,6 @@ End;
Function TSDocxFont.WriteNameOther(value);virtual;
Begin
pr_.rFont.HAnsi := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadNameOther();virtual;
@ -489,7 +475,6 @@ Begin
TSDocxEnumerations.wdNumberFormOldstyle():
pr_.NumForm := "oldStyle";
end;
pr_.Update("first");
End;
Function TSDocxFont.ReadNumberForm();virtual;
Begin
@ -513,7 +498,6 @@ Begin
TSDocxEnumerations.wdNumberSpacingTabular():
pr_.NumSpacing := "tabular";
end;
pr_.Update("first");
End;
Function TSDocxFont.ReadNumberSpacing();virtual;
Begin
@ -530,7 +514,6 @@ End;
Function TSDocxFont.WriteOutline(value);virtual;
Begin
pr_.Outline := value = TSDocxEnumerations.wdToggle() ? _Not(self.Outline) : value;
pr_.Update("first");
End;
Function TSDocxFont.ReadOutline();virtual;
Begin
@ -540,7 +523,6 @@ End;
Function TSDocxFont.WritePosition(value);virtual;
Begin
pr_.Position := value * 2;
pr_.Update("first");
End;
Function TSDocxFont.ReadPosition();virtual;
Begin
@ -550,7 +532,6 @@ End;
Function TSDocxFont.WriteScaling(value);virtual;
Begin
pr_.W := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadScaling();virtual;
Begin
@ -560,7 +541,6 @@ End;
Function TSDocxFont.WriteShadow(value);virtual;
Begin
pr_.Shadow := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadShadow();virtual;
Begin
@ -570,7 +550,6 @@ End;
Function TSDocxFont.WriteSize(value);virtual;
Begin
pr_.Sz := value * 2;
pr_.Update("first");
End;
Function TSDocxFont.ReadSize();virtual;
Begin
@ -580,7 +559,6 @@ End;
Function TSDocxFont.WriteSizeBi(value);virtual;
Begin
pr_.SzCs := value * 2;
pr_.Update("first");
End;
Function TSDocxFont.ReadSizeBi();virtual;
Begin
@ -590,7 +568,6 @@ End;
Function TSDocxFont.WriteSmallCaps(value);virtual;
Begin
pr_.SmallCaps := value = TSDocxEnumerations.wdToggle() ? _Not(self.SmallCaps) : value;
pr_.Update("first");
End;
Function TSDocxFont.ReadSmallCaps();virtual;
Begin
@ -600,7 +577,6 @@ End;
Function TSDocxFont.WriteSpacing(value);virtual;
Begin
pr_.Spacing := value * 20;
pr_.Update("first");
End;
Function TSDocxFont.ReadSpacing();virtual;
Begin
@ -610,7 +586,6 @@ End;
Function TSDocxFont.WriteStrikeThrough(value);virtual;
Begin
pr_.Strike := value;
pr_.Update("first");
End;
Function TSDocxFont.ReadStrikeThrough();virtual;
Begin
@ -620,7 +595,6 @@ End;
Function TSDocxFont.WriteSubscript(value);virtual;
Begin
pr_.VertAlign := "subscript";
pr_.Update("first");
End;
Function TSDocxFont.ReadSubscript();virtual;
Begin
@ -630,7 +604,6 @@ End;
Function TSDocxFont.WriteSuperscript(value);virtual;
Begin
pr_.VertAlign := "supercript";
pr_.Update("first");
End;
Function TSDocxFont.ReadSuperscript();virtual;
Begin
@ -677,7 +650,6 @@ Begin
TSDocxEnumerations.wdUnderlineWords():
pr_.U := "words";
end;
pr_.Update("first");
End;
Function TSDocxFont.ReadUnderline();virtual;
Begin
@ -724,7 +696,6 @@ End;
Function TSDocxFont.WriteUnderlineColor(value);virtual;
Begin
pr_.UColor := color_[value];
pr_.Update("first");
End;
Function TSDocxFont.ReadUnderlineColor();virtual;
Begin

View File

@ -2,15 +2,15 @@ Type TSDocxFontRange = Class(TSDocxFont)
Uses TSDocxEnumerations;
public
Function Init(arr);
Function Init(rangeObj);
Function Apply();overload;
private
Function CallFunction(pf, value);overload;
Function CallFunction(pf);overload;
Function SplitRun();
private
range_arr_;
range_obj_;
split_flag_; // 写之前切割run切割后设为true
public
@ -107,32 +107,29 @@ public
End;
// ============== 实现 ================= //
Function TSDocxFontRange.Init(arr);
Function TSDocxFontRange.Init(rangeObj);
Begin
range_arr_ := arr;
split_flag_ := false;
range_obj_ := rangeObj;
class(TSDocxFont).Init(nil);
End;
Function TSDocxFontRange.SplitRun();
Function TSDocxFontRange.Apply();overload;
Begin
if split_flag_ then return;
class(TSWdCommon).SplitRangeRun(range_arr_);
self.Parent.SetRangeArr(range_arr_);
split_flag_ := true;
CallFunction(ThisFunction(class(TSDocxFont).Apply));
End;
Function TSDocxFontRange.CallFunction(pf, value);overload;
Begin
SplitRun();
for i:=0 to length(range_arr_)-1 do
range_obj_.SplitRun();
range_arr := range_obj_.GetInfo();
for i:=0 to length(range_arr)-1 do
begin
paragraph := range_arr_[i]["tparagraph"];
paragraph := range_arr[i]["tparagraph"];
pr_ := paragraph.pPr.rPr;
##pf(value);
for i:=0 to length(range_arr_)-1 do
for i:=0 to length(range_arr)-1 do
begin
pr_ := range_arr_[i]["trun"].rPr;
pr_ := range_arr[i]["trun"].rPr;
##pf(value);
end
end;
@ -141,9 +138,10 @@ End;
Function TSDocxFontRange.CallFunction(pf);overload;
Begin
ret := nil;
for i:=0 to length(range_arr_)-1 do
range_arr := range_obj_.GetInfo();
for i:=0 to length(range_arr)-1 do
begin
pr_ := range_arr_[i]["trun"].rPr;
pr_ := range_arr[i]["trun"].rPr;
if not ifObj(pr_.Root()) then continue;
cur := ##pf();
if ifnil(ret) then ret := cur;

View File

@ -0,0 +1,713 @@
Type TSDocxParagraphFormat = Class(TSVbaBase)
Uses TSDocxEnumerations;
public
Function Init(docx, pPr);
Function Apply();virtual;
Function ReWrite(pr);virtual;
protected
docx_;
pr_; // TOfficeObj("TwpPr")
public
// Methods
Function CloseUp();virtual;
Function IndentCharWidth(Count);virtual;
Function IndentFirstLineCharWidth(Count);virtual;
Function OpenOrCloseUp();virtual;
Function OpenUp();virtual;
Function Reset();virtual;
Function Space1();virtual;
Function Space15();virtual;
Function Space2();virtual;
Function TabHangingIndent(Count);virtual;
Function TabIndent(Count);virtual;
// property
property AddSpaceBetweenFarEastAndAlpha read ReadAddSpaceBetweenFarEastAndAlpha write WriteAddSpaceBetweenFarEastAndAlpha;
property AddSpaceBetweenFarEastAndDigit read ReadAddSpaceBetweenFarEastAndDigit write WriteAddSpaceBetweenFarEastAndDigit;
property Alignment read ReadAlignment write WriteAlignment;
property AutoAdjustRightIndent read ReadAutoAdjustRightIndent write WriteAutoAdjustRightIndent;
property BaseLineAlignment read ReadBaseLineAlignment write WriteBaseLineAlignment;
property Borders read ReadBorders;
property CharacterUnitFirstLineIndent read ReadCharacterUnitFirstLineIndent write WriteCharacterUnitFirstLineIndent;
property CharacterUnitLeftIndent read ReadCharacterUnitLeftIndent write WriteCharacterUnitLeftIndent;
property CharacterUnitRightIndent read ReadCharacterUnitRightIndent write WriteCharacterUnitRightIndent;
property CollapsedByDefault read ReadCollapsedByDefault write WriteCollapsedByDefault;
property DisableLineHeightGrid read ReadDisableLineHeightGrid write WriteDisableLineHeightGrid;
property Duplicate read ReadDuplicate;
property FarEastLineBreakControl read ReadFarEastLineBreakControl write WriteFarEastLineBreakControl;
property FirstLineIndent read ReadFirstLineIndent write WriteFirstLineIndent;
property HalfWidthPunctuationOnTopOfLine read ReadHalfWidthPunctuationOnTopOfLine write WriteHalfWidthPunctuationOnTopOfLine;
property HangingPunctuation read ReadHangingPunctuation write WriteHangingPunctuation;
property Hyphenation read ReadHyphenation write WriteHyphenation;
property KeepTogether read ReadKeepTogether write WriteKeepTogether;
property KeepWithNext read ReadKeepWithNext write WriteKeepWithNext;
property LeftIndent read ReadLeftIndent write WriteLeftIndent;
property LineSpacing read ReadLineSpacing write WriteLineSpacing;
property LineSpacingRule read ReadLineSpacingRule write WriteLineSpacingRule;
property LineUnitAfter read ReadLineUnitAfter write WriteLineUnitAfter;
property LineUnitBefore read ReadLineUnitBefore write WriteLineUnitBefore;
property MirrorIndents read ReadMirrorIndents write WriteMirrorIndents;
property NoLineNumber read ReadNoLineNumber write WriteNoLineNumber;
property OutlineLevel read ReadOutlineLevel write WriteOutlineLevel;
property PageBreakBefore read ReadPageBreakBefore write WritePageBreakBefore;
property ReadingOrder read ReadReadingOrder write WriteReadingOrder;
property RightIndent read ReadRightIndent write WriteRightIndent;
property Shading read ReadShading;
property SpaceAfter read ReadSpaceAfter write WriteSpaceAfter;
property SpaceAfterAuto read ReadSpaceAfterAuto write WriteSpaceAfterAuto;
property SpaceBefore read ReadSpaceBefore write WriteSpaceBefore;
property SpaceBeforeAuto read ReadSpaceBeforeAuto write WriteSpaceBeforeAuto;
property Style read ReadStyle write WriteStyle;
property TabStops read ReadTabStops write WriteTabStops;
property TextboxTightWrap read ReadTextboxTightWrap write WriteTextboxTightWrap;
property WidowControl read ReadWidowControl write WriteWidowControl;
property WordWrap read ReadWordWrap write WriteWordWrap;
Function WriteWordWrap(value);virtual;
Function ReadWordWrap();virtual;
Function WriteWidowControl(value);virtual;
Function ReadWidowControl();virtual;
Function WriteTextboxTightWrap(value);virtual;
Function ReadTextboxTightWrap();virtual;
Function WriteTabStops(value);virtual;
Function ReadTabStops();virtual;
Function WriteStyle(value);virtual;
Function ReadStyle();virtual;
Function WriteSpaceBeforeAuto(value);virtual;
Function ReadSpaceBeforeAuto();virtual;
Function WriteSpaceBefore(value);virtual;
Function ReadSpaceBefore();virtual;
Function WriteSpaceAfterAuto(value);virtual;
Function ReadSpaceAfterAuto();virtual;
Function WriteSpaceAfter(value);virtual;
Function ReadSpaceAfter();virtual;
Function ReadShading();virtual;
Function WriteRightIndent(value);virtual;
Function ReadRightIndent();virtual;
Function WriteReadingOrder(value);virtual;
Function ReadReadingOrder();virtual;
Function WritePageBreakBefore(value);virtual;
Function ReadPageBreakBefore();virtual;
Function WriteOutlineLevel(value);virtual;
Function ReadOutlineLevel();virtual;
Function WriteNoLineNumber(value);virtual;
Function ReadNoLineNumber();virtual;
Function WriteMirrorIndents(value);virtual;
Function ReadMirrorIndents();virtual;
Function WriteLineUnitBefore(value);virtual;
Function ReadLineUnitBefore();virtual;
Function WriteLineUnitAfter(value);virtual;
Function ReadLineUnitAfter();virtual;
Function WriteLineSpacingRule(value);virtual;
Function ReadLineSpacingRule();virtual;
Function WriteLineSpacing(value);virtual;
Function ReadLineSpacing();virtual;
Function WriteLeftIndent(value);virtual;
Function ReadLeftIndent();virtual;
Function WriteKeepWithNext(value);virtual;
Function ReadKeepWithNext();virtual;
Function WriteKeepTogether(value);virtual;
Function ReadKeepTogether();virtual;
Function WriteHyphenation(value);virtual;
Function ReadHyphenation();virtual;
Function WriteHangingPunctuation(value);virtual;
Function ReadHangingPunctuation();virtual;
Function WriteHalfWidthPunctuationOnTopOfLine(value);virtual;
Function ReadHalfWidthPunctuationOnTopOfLine();virtual;
Function WriteFirstLineIndent(value);virtual;
Function ReadFirstLineIndent();virtual;
Function WriteFarEastLineBreakControl(value);virtual;
Function ReadFarEastLineBreakControl();virtual;
Function ReadDuplicate();virtual;
Function WriteDisableLineHeightGrid(value);virtual;
Function ReadDisableLineHeightGrid();virtual;
Function WriteCollapsedByDefault(value);virtual;
Function ReadCollapsedByDefault();virtual;
Function WriteCharacterUnitRightIndent(value);virtual;
Function ReadCharacterUnitRightIndent();virtual;
Function WriteCharacterUnitLeftIndent(value);virtual;
Function ReadCharacterUnitLeftIndent();virtual;
Function WriteCharacterUnitFirstLineIndent(value);virtual;
Function ReadCharacterUnitFirstLineIndent();virtual;
Function ReadBorders(index);virtual;
Function WriteBaseLineAlignment(value);virtual;
Function ReadBaseLineAlignment();virtual;
Function WriteAutoAdjustRightIndent(value);virtual;
Function ReadAutoAdjustRightIndent();virtual;
Function WriteAlignment(value);virtual;
Function ReadAlignment();virtual;
Function WriteAddSpaceBetweenFarEastAndDigit(value);virtual;
Function ReadAddSpaceBetweenFarEastAndDigit();virtual;
Function WriteAddSpaceBetweenFarEastAndAlpha(value);virtual;
Function ReadAddSpaceBetweenFarEastAndAlpha();virtual;
End;
// ============== 实现 ================= //
Function TSDocxParagraphFormat.Init(docx, pPr);
Begin
docx_ := docx;
pr_ := pPr;
End;
Function TSDocxParagraphFormat.Apply();virtual;
Begin
pr_.Update("first");
End;
Function TSDocxParagraphFormat.ReWrite(pr);virtual;
Begin
self.Reset();
marshal := pr.Marshal()[0];
pr_.Root().InsertAfterChild(marshal["children"]);
End;
// Methods
Function TSDocxParagraphFormat.CloseUp();virtual;
Begin
self.SpaceBefore := 0;
End;
Function TSDocxParagraphFormat.IndentCharWidth(Count);virtual;
Begin
pr_.LeftIndent := Count * 210;
End;
Function TSDocxParagraphFormat.IndentFirstLineCharWidth(Count);virtual;
Begin
self.FirstLineIndent := Count;
End;
Function TSDocxParagraphFormat.OpenOrCloseUp();virtual;
Begin
self.SpaceBefore := self.SpaceBefore > 0 ? 0 : 12;
End;
Function TSDocxParagraphFormat.OpenUp();virtual;
Begin
self.SpaceBefore := 12;
End;
Function TSDocxParagraphFormat.Reset();virtual;
Begin
pr_.Delete();
End;
Function TSDocxParagraphFormat.Space1();virtual;
Begin
self.LineSpacingRule := TSDocxEnumerations.wdLineSpaceSingle();
End;
Function TSDocxParagraphFormat.Space15();virtual;
Begin
self.LineSpacingRule := TSDocxEnumerations.wdLineSpace1pt5();
End;
Function TSDocxParagraphFormat.Space2();virtual;
Begin
self.LineSpacingRule := TSDocxEnumerations.wdLineSpaceDouble();
End;
// property
Function TSDocxParagraphFormat.WriteWordWrap(value);virtual;
Begin
pr_.WordWrap := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadWordWrap();virtual;
Begin
return pr_.Value("WordWrap");
End;
Function TSDocxParagraphFormat.WriteWidowControl(value);virtual;
Begin
pr_.WidowControl := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadWidowControl();virtual;
Begin
return pr_.Value("WidowControl");
End;
Function TSDocxParagraphFormat.WriteTextboxTightWrap(value);virtual;
Begin
case value of
TSDocxEnumerations.wdTightAll():
pr_.TextboxTightWrap := "allLines";
TSDocxEnumerations.wdTightFirstAndLastLines():
pr_.TextboxTightWrap := "firstAndLastLine";
TSDocxEnumerations.wdTightFirstLineOnly():
pr_.TextboxTightWrap := "firstLineOnly";
TSDocxEnumerations.wdTightLastLineOnly():
pr_.TextboxTightWrap := "LastLineOnly";
TSDocxEnumerations.wdTightNone():
pr_.TextboxTightWrap := "none";
end;
End;
Function TSDocxParagraphFormat.ReadTextboxTightWrap();virtual;
Begin
value := pr_.Value("TextboxTightWrap");
case value of
"allLines":
return TSDocxEnumerations.wdTightAll();
"firstAndLastLine":
return TSDocxEnumerations.wdTightFirstAndLastLines();
"firstLineOnly":
return TSDocxEnumerations.wdTightFirstLineOnly();
"LastLineOnly":
return TSDocxEnumerations.wdTightLastLineOnly();
"none":
return TSDocxEnumerations.wdTightNone();
end;
End;
Function TSDocxParagraphFormat.WriteStyle(value);virtual;
Begin
obj := docx_.StyleObject().GetStyle(value);
pr_.StyleId := obj.StyleId;
End;
Function TSDocxParagraphFormat.ReadStyle();virtual;
Begin
id := pr_.Value("StyleId", 1);
obj := docx_.StyleObject().GetStyleById(id);
return obj.Name;
End;
Function TSDocxParagraphFormat.WriteSpaceBeforeAuto(value);virtual;
Begin
pr_.SpaceBeforeAuto := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadSpaceBeforeAuto();virtual;
Begin
return pr_.Value("SpaceBeforeAuto") ? true : false;
End;
Function TSDocxParagraphFormat.WriteSpaceBefore(value);virtual;
Begin
pr_.SpaceBefore := value * 20;
End;
Function TSDocxParagraphFormat.ReadSpaceBefore();virtual;
Begin
return pr_.Value("SpaceBefore") / 20;
End;
Function TSDocxParagraphFormat.WriteSpaceAfterAuto(value);virtual;
Begin
pr_.SpaceAfterAuto := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadSpaceAfterAuto();virtual;
Begin
return pr_.Value("SpaceAfterAuto") ? true : false;
End;
Function TSDocxParagraphFormat.WriteSpaceAfter(value);virtual;
Begin
pr_.SpaceAfter := value * 20;
End;
Function TSDocxParagraphFormat.ReadSpaceAfter();virtual;
Begin
return pr_.Value("SpaceAfter") / 20;
End;
Function TSDocxParagraphFormat.ReadShading();virtual;
Begin
shading_obj := new TSDocxShading(self.Application, self.Creator, self.Parent);
shading_obj.Init(pr_.Shading);
return shading_obj;
End;
Function TSDocxParagraphFormat.WriteRightIndent(value);virtual;
Begin
pr_.RightIndent := value * 20;
End;
Function TSDocxParagraphFormat.ReadRightIndent();virtual;
Begin
return pr_.Value("RightIndent") / 20;
End;
Function TSDocxParagraphFormat.WriteReadingOrder(value);virtual;
Begin
case value of
TSDocxEnumerations.wdReadingOrderLtr():
pr_.Bidi := false;
TSDocxEnumerations.wdReadingOrderRtl():
pr_.Bidi := true;
end;
End;
Function TSDocxParagraphFormat.ReadReadingOrder();virtual;
Begin
value := pr_.Value("Bidi");
case value of
false: return TSDocxEnumerations.wdReadingOrderLtr();
true: return TSDocxEnumerations.wdReadingOrderRtl();
end;
End;
Function TSDocxParagraphFormat.WritePageBreakBefore(value);virtual;
Begin
pr_.PageBreakBefore := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadPageBreakBefore();virtual;
Begin
return pr_.Value("PageBreakBefore");
End;
Function TSDocxParagraphFormat.WriteOutlineLevel(value);virtual;
Begin
case value of
TSDocxEnumerations.wdOutlineLevel1():
pr_.OutlineLevel := 0;
TSDocxEnumerations.wdOutlineLevel2():
pr_.OutlineLevel := 1;
TSDocxEnumerations.wdOutlineLevel3():
pr_.OutlineLevel := 2;
TSDocxEnumerations.wdOutlineLevel4():
pr_.OutlineLevel := 3;
TSDocxEnumerations.wdOutlineLevel5():
pr_.OutlineLevel := 4;
TSDocxEnumerations.wdOutlineLevel6():
pr_.OutlineLevel := 5;
TSDocxEnumerations.wdOutlineLevel7():
pr_.OutlineLevel := 6;
TSDocxEnumerations.wdOutlineLevel8():
pr_.OutlineLevel := 7;
TSDocxEnumerations.wdOutlineLevel9():
pr_.OutlineLevel := 8;
TSDocxEnumerations.wdOutlineLevelBodyText():
class(TSXml).RemoveNode(pr_.Root(), "w:outlineLvl");
end;
End;
Function TSDocxParagraphFormat.ReadOutlineLevel();virtual;
Begin
value := pr_.Value("OutlineLevel");
case value of
0: return TSDocxEnumerations.wdOutlineLevel1();
1: return TSDocxEnumerations.wdOutlineLevel2();
2: return TSDocxEnumerations.wdOutlineLevel3();
3: return TSDocxEnumerations.wdOutlineLevel4();
4: return TSDocxEnumerations.wdOutlineLevel5();
5: return TSDocxEnumerations.wdOutlineLevel6();
6: return TSDocxEnumerations.wdOutlineLevel7();
7: return TSDocxEnumerations.wdOutlineLevel8();
8: return TSDocxEnumerations.wdOutlineLevel9();
nil: return TSDocxEnumerations.wdOutlineLevelBodyText();
end;
End;
Function TSDocxParagraphFormat.WriteNoLineNumber(value);virtual;
Begin
pr_.SuppressLineNumbers := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadNoLineNumber();virtual;
Begin
return pr_.Value("SuppressLineNumbers");
End;
Function TSDocxParagraphFormat.WriteMirrorIndents(value);virtual;
Begin
pr_.MirrorIndents := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadMirrorIndents();virtual;
Begin
return pr_.Value("MirrorIndents");
End;
Function TSDocxParagraphFormat.WriteLineUnitBefore(value);virtual;
Begin
pr_.BeforeLines := value * 100;
End;
Function TSDocxParagraphFormat.ReadLineUnitBefore();virtual;
Begin
return pr_.Value("BeforeLines") / 100;
End;
Function TSDocxParagraphFormat.WriteLineUnitAfter(value);virtual;
Begin
pr_.AfterLines := value * 100;
End;
Function TSDocxParagraphFormat.ReadLineUnitAfter();virtual;
Begin
return pr_.Value("AfterLines") / 100;
End;
Function TSDocxParagraphFormat.WriteLineSpacingRule(value);virtual;
Begin
case value of
TSDocxEnumerations.wdLineSpace1pt5():
pr_.LineSpacingRule := "auto";
TSDocxEnumerations.wdLineSpaceAtLeast():
pr_.LineSpacingRule := "atLeast";
TSDocxEnumerations.wdLineSpaceDouble():
pr_.LineSpacingRule := "auto";
TSDocxEnumerations.wdLineSpaceExactly():
pr_.LineSpacingRule := "exact";
TSDocxEnumerations.wdLineSpaceMultiple():
pr_.LineSpacingRule := "auto";
TSDocxEnumerations.wdLineSpaceSingle():
pr_.LineSpacingRule := "auto";
end;
End;
Function TSDocxParagraphFormat.ReadLineSpacingRule();virtual;
Begin
value := pr_.Value("LineSpacingRule");
case value of
"atLeast":
return TSDocxEnumerations.wdLineSpaceAtLeast();
"exact":
return TSDocxEnumerations.wdLineSpaceExactly();
"auto":
return TSDocxEnumerations.wdLineSpaceMultiple();
end;
End;
Function TSDocxParagraphFormat.WriteLineSpacing(value);virtual;
Begin
pr_.LineSpacing := value * 20;
End;
Function TSDocxParagraphFormat.ReadLineSpacing();virtual;
Begin
return pr_.Value("LineSpacing") / 20;
End;
Function TSDocxParagraphFormat.WriteLeftIndent(value);virtual;
Begin
pr_.LeftIndent := value * 20;
End;
Function TSDocxParagraphFormat.ReadLeftIndent();virtual;
Begin
return pr_.Value("LeftIndent") / 20;
End;
Function TSDocxParagraphFormat.WriteKeepWithNext(value);virtual;
Begin
pr_.KeepWithNext := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadKeepWithNext();virtual;
Begin
return pr_.Value("KeepWithNext");
End;
Function TSDocxParagraphFormat.WriteKeepTogether(value);virtual;
Begin
pr_.KeepTogether := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadKeepTogether();virtual;
Begin
return pr_.Value("KeepTogether");
End;
Function TSDocxParagraphFormat.WriteHyphenation(value);virtual;
Begin
pr_.SuppressAutoHyphens := value ? false : true;
End;
Function TSDocxParagraphFormat.ReadHyphenation();virtual;
Begin
return pr_.Value("SuppressAutoHyphens") ? false : true;
End;
Function TSDocxParagraphFormat.WriteHangingPunctuation(value);virtual;
Begin
pr_.OverflowPunct := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadHangingPunctuation();virtual;
Begin
return pr_.Value("TopLinePunct");
End;
Function TSDocxParagraphFormat.WriteHalfWidthPunctuationOnTopOfLine(value);virtual;
Begin
pr_.TopLinePunct := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadHalfWidthPunctuationOnTopOfLine();virtual;
Begin
return pr_.Value("TopLinePunct");
End;
Function TSDocxParagraphFormat.WriteFirstLineIndent(value);virtual;
Begin
pr_.FirstLineIndent := value * 20;
End;
Function TSDocxParagraphFormat.ReadFirstLineIndent();virtual;
Begin
return pr_.Value("FirstLineIndent") / 20;
End;
Function TSDocxParagraphFormat.WriteFarEastLineBreakControl(value);virtual;
Begin
pr_.Kinsoku := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadFarEastLineBreakControl();virtual;
Begin
return pr_.Value("Kinsoku");
End;
Function TSDocxParagraphFormat.ReadDuplicate();virtual;
Begin
return pr_;
End;
Function TSDocxParagraphFormat.WriteDisableLineHeightGrid(value);virtual;
Begin
pr_.SnapToGrid := value ? false : true;
End;
Function TSDocxParagraphFormat.ReadDisableLineHeightGrid();virtual;
Begin
return pr_.Value("SnapToGrid") ? false : true;
End;
Function TSDocxParagraphFormat.WriteCollapsedByDefault(value);virtual;
Begin
pr_.Collapsed := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadCollapsedByDefault();virtual;
Begin
return pr_.Value("Collapsed");
End;
Function TSDocxParagraphFormat.WriteCharacterUnitRightIndent(value);virtual;
Begin
pr_.RightChars := value * 100;
End;
Function TSDocxParagraphFormat.ReadCharacterUnitRightIndent();virtual;
Begin
return pr_.Value("RightChars") / 100;
End;
Function TSDocxParagraphFormat.WriteCharacterUnitLeftIndent(value);virtual;
Begin
pr_.LeftChars := value * 100;
End;
Function TSDocxParagraphFormat.ReadCharacterUnitLeftIndent();virtual;
Begin
return pr_.Value("LeftChars") / 100;
End;
Function TSDocxParagraphFormat.WriteCharacterUnitFirstLineIndent(value);virtual;
Begin
if value > 0 then pr_.FirstLineChars := value * 100;
else pr_.HangingChars := abs(value) * 100;
End;
Function TSDocxParagraphFormat.ReadCharacterUnitFirstLineIndent();virtual;
Begin
first_val := pr_.Value("FirstLineChars");
if first_val then return integer(first_val / 100);
hanging_val := pr_.Value("HangingChars");
if hanging_val then return -integer(hanging_val / 100);
return 0;
End;
Function TSDocxParagraphFormat.ReadBorders(index);virtual;
Begin
borders_obj := new TSDocxBordersParagraph(self.Application, self.Creator, self.Parent);
borders_obj.Init(pr_);
return ifnil(index) ? borders_obj : borders_obj[index];
End;
Function TSDocxParagraphFormat.WriteBaseLineAlignment(value);virtual;
Begin
case value of
TSDocxEnumerations.wdBaselineAlignAuto():
pr_.TextAlignment := "auto";
TSDocxEnumerations.wdBaselineAlignBaseline():
pr_.TextAlignment := "baseline";
TSDocxEnumerations.wdBaselineAlignCenter():
pr_.TextAlignment := "center";
TSDocxEnumerations.wdBaselineAlignFarEast50():
pr_.TextAlignment := "bottom";
TSDocxEnumerations.wdBaselineAlignTop():
pr_.TextAlignment := "top";
end;
End;
Function TSDocxParagraphFormat.ReadBaseLineAlignment();virtual;
Begin
value := pr_.Value("TextAlignment");
case value of
"auto", nil:
return TSDocxEnumerations.wdBaselineAlignAuto();
"baseline":
return TSDocxEnumerations.wdBaselineAlignBaseline();
"center":
return TSDocxEnumerations.wdBaselineAlignCenter();
"bottom":
return TSDocxEnumerations.wdBaselineAlignFarEast50();
"top":
return TSDocxEnumerations.wdBaselineAlignTop();
end;
End;
Function TSDocxParagraphFormat.WriteAutoAdjustRightIndent(value);virtual;
Begin
pr_.AdjustRightInd := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadAutoAdjustRightIndent();virtual;
Begin
return pr_.Value("AdjustRightInd");
End;
Function TSDocxParagraphFormat.WriteAlignment(value);virtual;
Begin
case value of
TSDocxEnumerations.wdAlignParagraphCenter():
pr_.Alignment := "center";
TSDocxEnumerations.wdAlignParagraphDistribute():
pr_.Alignment := "distribute";
TSDocxEnumerations.wdAlignParagraphJustify():
pr_.Alignment := "both";
TSDocxEnumerations.wdAlignParagraphJustifyHi():
pr_.Alignment := "highKashida";
TSDocxEnumerations.wdAlignParagraphJustifyLow():
pr_.Alignment := "lowKashida";
TSDocxEnumerations.wdAlignParagraphJustifyMed():
pr_.Alignment := "mediumKashida";
TSDocxEnumerations.wdAlignParagraphLeft():
pr_.Alignment := "left";
TSDocxEnumerations.wdAlignParagraphRight():
pr_.Alignment := "right";
TSDocxEnumerations.wdAlignParagraphThaiJustify():
pr_.Alignment := "thaiDistribute";
end;
End;
Function TSDocxParagraphFormat.ReadAlignment();virtual;
Begin
value := pr_.Value("Alignment");
case value of
"center":
return TSDocxEnumerations.wdAlignParagraphCenter();
"distribute":
return TSDocxEnumerations.wdAlignParagraphDistribute();
"both", nil:
return TSDocxEnumerations.wdAlignParagraphJustify();
"highKashida":
return TSDocxEnumerations.wdAlignParagraphJustifyHi();
"lowKashida":
return TSDocxEnumerations.wdAlignParagraphJustifyLow();
"mediumKashida":
return TSDocxEnumerations.wdAlignParagraphJustifyMed();
"left":
return TSDocxEnumerations.wdAlignParagraphLeft();
"right":
return TSDocxEnumerations.wdAlignParagraphRight();
"thaiDistribute":
return TSDocxEnumerations.wdAlignParagraphThaiJustify();
end;
End;
Function TSDocxParagraphFormat.WriteAddSpaceBetweenFarEastAndDigit(value);virtual;
Begin
pr_.AutoSpaceDN := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadAddSpaceBetweenFarEastAndDigit();virtual;
Begin
return pr_.Value("AutoSpaceDN");
End;
Function TSDocxParagraphFormat.WriteAddSpaceBetweenFarEastAndAlpha(value);virtual;
Begin
pr_.AutoSpaceDE := value ? true : false;
End;
Function TSDocxParagraphFormat.ReadAddSpaceBetweenFarEastAndAlpha();virtual;
Begin
return pr_.Value("AutoSpaceDE");
End;

View File

@ -0,0 +1,563 @@
Type TSDocxParagraphFormatRange = Class(TSDocxParagraphFormat)
Uses TSDocxEnumerations;
public
Function Init(docx, rangeObj);
Function Apply();override;
Function ReWrite(value);override;
private
Function CallFunction(pf, value);overload;
Function CallFunction(pf);overload;
private
paragraph_arr_;
public
// Methods
Function CloseUp();override;
Function IndentCharWidth(Count);override;
Function IndentFirstLineCharWidth(Count);override;
Function OpenOrCloseUp();override;
Function OpenUp();override;
Function Reset();override;
Function Space1();override;
Function Space15();override;
Function Space2();override;
Function TabHangingIndent(Count);override;
Function TabIndent(Count);override;
// property
Function WriteWordWrap(value);override;
Function ReadWordWrap();override;
Function WriteWidowControl(value);override;
Function ReadWidowControl();override;
Function WriteTextboxTightWrap(value);override;
Function ReadTextboxTightWrap();override;
Function WriteTabStops(value);override;
Function ReadTabStops();override;
Function WriteStyle(value);override;
Function ReadStyle();override;
Function WriteSpaceBeforeAuto(value);override;
Function ReadSpaceBeforeAuto();override;
Function WriteSpaceBefore(value);override;
Function ReadSpaceBefore();override;
Function WriteSpaceAfterAuto(value);override;
Function ReadSpaceAfterAuto();override;
Function WriteSpaceAfter(value);override;
Function ReadSpaceAfter();override;
Function ReadShading();override;
Function WriteRightIndent(value);override;
Function ReadRightIndent();override;
Function WriteReadingOrder(value);override;
Function ReadReadingOrder();override;
Function WritePageBreakBefore(value);override;
Function ReadPageBreakBefore();override;
Function WriteOutlineLevel(value);override;
Function ReadOutlineLevel();override;
Function WriteNoLineNumber(value);override;
Function ReadNoLineNumber();override;
Function WriteMirrorIndents(value);override;
Function ReadMirrorIndents();override;
Function WriteLineUnitBefore(value);override;
Function ReadLineUnitBefore();override;
Function WriteLineUnitAfter(value);override;
Function ReadLineUnitAfter();override;
Function WriteLineSpacingRule(value);override;
Function ReadLineSpacingRule();override;
Function WriteLineSpacing(value);override;
Function ReadLineSpacing();override;
Function WriteLeftIndent(value);override;
Function ReadLeftIndent();override;
Function WriteKeepWithNext(value);override;
Function ReadKeepWithNext();override;
Function WriteKeepTogether(value);override;
Function ReadKeepTogether();override;
Function WriteHyphenation(value);override;
Function ReadHyphenation();override;
Function WriteHangingPunctuation(value);override;
Function ReadHangingPunctuation();override;
Function WriteHalfWidthPunctuationOnTopOfLine(value);override;
Function ReadHalfWidthPunctuationOnTopOfLine();override;
Function WriteFirstLineIndent(value);override;
Function ReadFirstLineIndent();override;
Function WriteFarEastLineBreakControl(value);override;
Function ReadFarEastLineBreakControl();override;
Function ReadDuplicate();override;
Function WriteDisableLineHeightGrid(value);override;
Function ReadDisableLineHeightGrid();override;
Function WriteCollapsedByDefault(value);override;
Function ReadCollapsedByDefault();override;
Function WriteCharacterUnitRightIndent(value);override;
Function ReadCharacterUnitRightIndent();override;
Function WriteCharacterUnitLeftIndent(value);override;
Function ReadCharacterUnitLeftIndent();override;
Function WriteCharacterUnitFirstLineIndent(value);override;
Function ReadCharacterUnitFirstLineIndent();override;
Function ReadBorders(index);override;
Function WriteBaseLineAlignment(value);override;
Function ReadBaseLineAlignment();override;
Function WriteAutoAdjustRightIndent(value);override;
Function ReadAutoAdjustRightIndent();override;
Function WriteAlignment(value);override;
Function ReadAlignment();override;
Function WriteAddSpaceBetweenFarEastAndDigit(value);override;
Function ReadAddSpaceBetweenFarEastAndDigit();override;
Function WriteAddSpaceBetweenFarEastAndAlpha(value);override;
Function ReadAddSpaceBetweenFarEastAndAlpha();override;
End;
// ============== 实现 ================= //
Function TSDocxParagraphFormatRange.Init(docx, rangeObj);
Begin
class(TSDocxParagraphFormat).Init(docx, nil);
paragraph_arr_ := sselect distinct(["tparagraph"]) from rangeObj.Data end;
End;
Function TSDocxParagraphFormatRange.Apply();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).Apply), nil);
End;
Function TSDocxParagraphFormatRange.ReWrite(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).ReWrite), value);
End;
Function TSDocxParagraphFormatRange.CallFunction(pf, value);overload;
Begin
for i:=0 to length(paragraph_arr_)-1 do
begin
pr_ := paragraph_arr_[i].pPr;
if not ifObj(pr_.Root()) then continue;
##pf(value);
end
End;
Function TSDocxParagraphFormatRange.CallFunction(pf);overload;
Begin
ret := nil;
for i:=0 to length(paragraph_arr_)-1 do
begin
pr_ := paragraph_arr_[i].pPr;
if not ifObj(pr_.Root()) then continue;
cur := ##pf();
if ifnil(ret) then ret := cur;
if ret <> cur then return TSDocxEnumerations.wdUndefined();
end
return ret;
End;
// Methods
Function TSDocxParagraphFormatRange.CloseUp();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).CloseUp), nil);
End;
Function TSDocxParagraphFormatRange.IndentCharWidth(Count);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).IndentCharWidth), Count);
End;
Function TSDocxParagraphFormatRange.IndentFirstLineCharWidth(Count);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).IndentFirstLineCharWidth), Count);
End;
Function TSDocxParagraphFormatRange.OpenOrCloseUp();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).OpenOrCloseUp), nil);
End;
Function TSDocxParagraphFormatRange.OpenUp();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).OpenOrCloseUp), nil);
End;
Function TSDocxParagraphFormatRange.Reset();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).Reset), nil);
End;
Function TSDocxParagraphFormatRange.Space1();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).Space1), nil);
End;
Function TSDocxParagraphFormatRange.Space15();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).Space15), nil);
End;
Function TSDocxParagraphFormatRange.Space2();override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).Space2), nil);
End;
Function TSDocxParagraphFormatRange.TabHangingIndent(Count);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).TabHangingIndent), Count);
End;
Function TSDocxParagraphFormatRange.TabIndent(Count);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).TabIndent), Count);
End;
// property
Function TSDocxParagraphFormatRange.WriteWordWrap(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteWordWrap), value);
End;
Function TSDocxParagraphFormatRange.ReadWordWrap();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadWordWrap));
End;
Function TSDocxParagraphFormatRange.WriteWidowControl(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteWidowControl), value);
End;
Function TSDocxParagraphFormatRange.ReadWidowControl();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadWidowControl));
End;
Function TSDocxParagraphFormatRange.WriteTextboxTightWrap(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteTextboxTightWrap), value);
End;
Function TSDocxParagraphFormatRange.ReadTextboxTightWrap();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadTextboxTightWrap));
End;
Function TSDocxParagraphFormatRange.WriteTabStops(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteTabStops), value);
End;
Function TSDocxParagraphFormatRange.ReadTabStops();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadTabStops));
End;
Function TSDocxParagraphFormatRange.WriteStyle(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteStyle), value);
End;
Function TSDocxParagraphFormatRange.ReadStyle();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadStyle));
End;
Function TSDocxParagraphFormatRange.WriteSpaceBeforeAuto(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceBeforeAuto), value);
End;
Function TSDocxParagraphFormatRange.ReadSpaceBeforeAuto();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceBeforeAuto));
End;
Function TSDocxParagraphFormatRange.WriteSpaceBefore(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceBefore), value);
End;
Function TSDocxParagraphFormatRange.ReadSpaceBefore();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceBefore));
End;
Function TSDocxParagraphFormatRange.WriteSpaceAfterAuto(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceAfterAuto), value);
End;
Function TSDocxParagraphFormatRange.ReadSpaceAfterAuto();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceAfterAuto));
End;
Function TSDocxParagraphFormatRange.WriteSpaceAfter(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteSpaceAfter), value);
End;
Function TSDocxParagraphFormatRange.ReadSpaceAfter();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadSpaceAfter));
End;
// TODO
Function TSDocxParagraphFormatRange.ReadShading();override;
Begin
End;
Function TSDocxParagraphFormatRange.WriteRightIndent(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteRightIndent), value);
End;
Function TSDocxParagraphFormatRange.ReadRightIndent();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadRightIndent));
End;
Function TSDocxParagraphFormatRange.WriteReadingOrder(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteReadingOrder), value);
End;
Function TSDocxParagraphFormatRange.ReadReadingOrder();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadReadingOrder));
End;
Function TSDocxParagraphFormatRange.WritePageBreakBefore(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WritePageBreakBefore), value);
End;
Function TSDocxParagraphFormatRange.ReadPageBreakBefore();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadPageBreakBefore));
End;
Function TSDocxParagraphFormatRange.WriteOutlineLevel(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteOutlineLevel), value);
End;
Function TSDocxParagraphFormatRange.ReadOutlineLevel();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadOutlineLevel));
End;
Function TSDocxParagraphFormatRange.WriteNoLineNumber(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteNoLineNumber), value);
End;
Function TSDocxParagraphFormatRange.ReadNoLineNumber();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadNoLineNumber));
End;
Function TSDocxParagraphFormatRange.WriteMirrorIndents(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteMirrorIndents), value);
End;
Function TSDocxParagraphFormatRange.ReadMirrorIndents();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadMirrorIndents));
End;
Function TSDocxParagraphFormatRange.WriteLineUnitBefore(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineUnitBefore), value);
End;
Function TSDocxParagraphFormatRange.ReadLineUnitBefore();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineUnitBefore));
End;
Function TSDocxParagraphFormatRange.WriteLineUnitAfter(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineUnitAfter), value);
End;
Function TSDocxParagraphFormatRange.ReadLineUnitAfter();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineUnitAfter));
End;
Function TSDocxParagraphFormatRange.WriteLineSpacingRule(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineSpacingRule), value);
End;
Function TSDocxParagraphFormatRange.ReadLineSpacingRule();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineSpacingRule));
End;
Function TSDocxParagraphFormatRange.WriteLineSpacing(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLineSpacing), value);
End;
Function TSDocxParagraphFormatRange.ReadLineSpacing();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLineSpacing));
End;
Function TSDocxParagraphFormatRange.WriteLeftIndent(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteLeftIndent), value);
End;
Function TSDocxParagraphFormatRange.ReadLeftIndent();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadLeftIndent));
End;
Function TSDocxParagraphFormatRange.WriteKeepWithNext(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteKeepWithNext), value);
End;
Function TSDocxParagraphFormatRange.ReadKeepWithNext();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadKeepWithNext));
End;
Function TSDocxParagraphFormatRange.WriteKeepTogether(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteKeepTogether), value);
End;
Function TSDocxParagraphFormatRange.ReadKeepTogether();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadKeepTogether));
End;
Function TSDocxParagraphFormatRange.WriteHyphenation(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteHyphenation), value);
End;
Function TSDocxParagraphFormatRange.ReadHyphenation();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadHyphenation));
End;
Function TSDocxParagraphFormatRange.WriteHangingPunctuation(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteHangingPunctuation), value);
End;
Function TSDocxParagraphFormatRange.ReadHangingPunctuation();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadHangingPunctuation));
End;
Function TSDocxParagraphFormatRange.WriteHalfWidthPunctuationOnTopOfLine(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteHalfWidthPunctuationOnTopOfLine), value);
End;
Function TSDocxParagraphFormatRange.ReadHalfWidthPunctuationOnTopOfLine();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadHalfWidthPunctuationOnTopOfLine));
End;
Function TSDocxParagraphFormatRange.WriteFirstLineIndent(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteFirstLineIndent), value);
End;
Function TSDocxParagraphFormatRange.ReadFirstLineIndent();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadFirstLineIndent));
End;
Function TSDocxParagraphFormatRange.WriteFarEastLineBreakControl(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteFarEastLineBreakControl), value);
End;
Function TSDocxParagraphFormatRange.ReadFarEastLineBreakControl();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadFarEastLineBreakControl));
End;
Function TSDocxParagraphFormatRange.ReadDuplicate();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadDuplicate));
End;
Function TSDocxParagraphFormatRange.WriteDisableLineHeightGrid(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteDisableLineHeightGrid), value);
End;
Function TSDocxParagraphFormatRange.ReadDisableLineHeightGrid();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadDisableLineHeightGrid));
End;
Function TSDocxParagraphFormatRange.WriteCollapsedByDefault(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCollapsedByDefault), value);
End;
Function TSDocxParagraphFormatRange.ReadCollapsedByDefault();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCollapsedByDefault));
End;
Function TSDocxParagraphFormatRange.WriteCharacterUnitRightIndent(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCharacterUnitRightIndent), value);
End;
Function TSDocxParagraphFormatRange.ReadCharacterUnitRightIndent();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCharacterUnitRightIndent));
End;
Function TSDocxParagraphFormatRange.WriteCharacterUnitLeftIndent(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCharacterUnitLeftIndent), value);
End;
Function TSDocxParagraphFormatRange.ReadCharacterUnitLeftIndent();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCharacterUnitLeftIndent));
End;
Function TSDocxParagraphFormatRange.WriteCharacterUnitFirstLineIndent(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteCharacterUnitFirstLineIndent), value);
End;
Function TSDocxParagraphFormatRange.ReadCharacterUnitFirstLineIndent();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadCharacterUnitFirstLineIndent));
End;
Function TSDocxParagraphFormatRange.ReadBorders(index);override;
Begin
// 重组一个新的range_arr_
arr := array();
for i:=0 to length(paragraph_arr_)-1 do
arr[i]["entirety"] := paragraph_arr_[i].Root();
borders_obj := new TSDocxBordersRange(self.Application, self.Creator, self.Parent);
borders_obj.Init(arr);
return ifnil(index) ? borders_obj : borders_obj.Item(index);
End;
Function TSDocxParagraphFormatRange.WriteBaseLineAlignment(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteBaseLineAlignment), value);
End;
Function TSDocxParagraphFormatRange.ReadBaseLineAlignment();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadBaseLineAlignment));
End;
Function TSDocxParagraphFormatRange.WriteAutoAdjustRightIndent(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAutoAdjustRightIndent), value);
End;
Function TSDocxParagraphFormatRange.ReadAutoAdjustRightIndent();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAutoAdjustRightIndent));
End;
Function TSDocxParagraphFormatRange.WriteAlignment(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAlignment), value);
End;
Function TSDocxParagraphFormatRange.ReadAlignment();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAlignment));
End;
Function TSDocxParagraphFormatRange.WriteAddSpaceBetweenFarEastAndDigit(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAddSpaceBetweenFarEastAndDigit), value);
End;
Function TSDocxParagraphFormatRange.ReadAddSpaceBetweenFarEastAndDigit();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAddSpaceBetweenFarEastAndDigit));
End;
Function TSDocxParagraphFormatRange.WriteAddSpaceBetweenFarEastAndAlpha(value);override;
Begin
CallFunction(ThisFunction(class(TSDocxParagraphFormat).WriteAddSpaceBetweenFarEastAndAlpha), value);
End;
Function TSDocxParagraphFormatRange.ReadAddSpaceBetweenFarEastAndAlpha();override;
Begin
return CallFunction(ThisFunction(class(TSDocxParagraphFormatRange).ReadAddSpaceBetweenFarEastAndAlpha));
End;

View File

@ -0,0 +1,305 @@
Type TSDocxShading = Class(TSVbaBase)
Uses TSDocxEnumerations;
public
Function Init(shading);
Function Apply();virtual;
private
shading_; // TOfficeObj("TwShading")
color_index_;
color_;
public
property BackgroundPatternColor read ReadBackgroundPatternColor write WriteBackgroundPatternColor;
property BackgroundPatternColorIndex read ReadBackgroundPatternColorIndex write WriteBackgroundPatternColorIndex;
property ForegroundPatternColor read ReadForegroundPatternColor write WriteForegroundPatternColor;
property ForegroundPatternColorIndex read ReadForegroundPatternColorIndex write WriteForegroundPatternColorIndex;
property Texture read ReadTexture write WriteTexture;
Function WriteTexture(value);virtual;
Function ReadTexture();virtual;
Function WriteForegroundPatternColorIndex(value);virtual;
Function ReadForegroundPatternColorIndex();virtual;
Function WriteForegroundPatternColor(value);virtual;
Function ReadForegroundPatternColor();virtual;
Function WriteBackgroundPatternColorIndex(value);virtual;
Function ReadBackgroundPatternColorIndex();virtual;
Function WriteBackgroundPatternColor(value);virtual;
Function ReadBackgroundPatternColor();virtual;
End;
// ============== 实现 ================= //
Function TSDocxShading.Init(shading);
Begin
shading_ := shading;
color_index_ := TSWdColorIndex();
color_ := TSWdColor();
End;
Function TSDocxShading.Apply();virtual;
Begin
shading_.Update();
End;
// property
Function TSDocxShading.WriteTexture(value);
Begin
case value of
TSDocxEnumerations.wdTexture10Percent():
shading_.Val := "pct10";
TSDocxEnumerations.wdTexture12Pt5Percent():
shading_.Val := "pct12";
TSDocxEnumerations.wdTexture15Percent():
shading_.Val := "pct15";
TSDocxEnumerations.wdTexture17Pt5Percent():
shading_.Val := "pct17";
TSDocxEnumerations.wdTexture20Percent():
shading_.Val := "pct20";
TSDocxEnumerations.wdTexture22Pt5Percent():
shading_.Val := "pct22";
TSDocxEnumerations.wdTexture25Percent():
shading_.Val := "pct25";
TSDocxEnumerations.wdTexture27Pt5Percent():
shading_.Val := "clear";
TSDocxEnumerations.wdTexture2Pt5Percent():
shading_.Val := "clear";
TSDocxEnumerations.wdTexture30Percent():
shading_.Val := "pct30";
TSDocxEnumerations.wdTexture32Pt5Percent():
shading_.Val := "pct32";
TSDocxEnumerations.wdTexture35Percent():
shading_.Val := "pct35";
TSDocxEnumerations.wdTexture37Pt5Percent():
shading_.Val := "pct37";
TSDocxEnumerations.wdTexture40Percent():
shading_.Val := "pct40";
TSDocxEnumerations.wdTexture42Pt5Percent():
shading_.Val := "pct42";
TSDocxEnumerations.wdTexture45Percent():
shading_.Val := "pct45";
TSDocxEnumerations.wdTexture47Pt5Percent():
shading_.Val := "pct47";
TSDocxEnumerations.wdTexture50Percent():
shading_.Val := "pct50";
TSDocxEnumerations.wdTexture52Pt5Percent():
shading_.Val := "pct52";
TSDocxEnumerations.wdTexture55Percent():
shading_.Val := "pct55";
TSDocxEnumerations.wdTexture57Pt5Percent():
shading_.Val := "clear";
TSDocxEnumerations.wdTexture5Percent():
shading_.Val := "pct5";
TSDocxEnumerations.wdTexture60Percent():
shading_.Val := "pct60";
TSDocxEnumerations.wdTexture62Pt5Percent():
shading_.Val := "pct62";
TSDocxEnumerations.wdTexture65Percent():
shading_.Val := "pct65";
TSDocxEnumerations.wdTexture67Pt5Percent():
shading_.Val := "pct67";
TSDocxEnumerations.wdTexture70Percent():
shading_.Val := "pct70";
TSDocxEnumerations.wdTexture72Pt5Percent():
shading_.Val := "pct72";
TSDocxEnumerations.wdTexture75Percent():
shading_.Val := "pct75";
TSDocxEnumerations.wdTexture77Pt5Percent():
shading_.Val := "pct77";
TSDocxEnumerations.wdTexture7Pt5Percent():
shading_.Val := "clear";
TSDocxEnumerations.wdTexture80Percent():
shading_.Val := "pct80";
TSDocxEnumerations.wdTexture82Pt5Percent():
shading_.Val := "pct82";
TSDocxEnumerations.wdTexture85Percent():
shading_.Val := "pct85";
TSDocxEnumerations.wdTexture87Pt5Percent():
shading_.Val := "pct87";
TSDocxEnumerations.wdTexture90Percent():
shading_.Val := "pct90";
TSDocxEnumerations.wdTexture92Pt5Percent():
shading_.Val := "pct92";
TSDocxEnumerations.wdTexture95Percent():
shading_.Val := "pct95";
TSDocxEnumerations.wdTexture97Pt5Percent():
shading_.Val := "pct97";
TSDocxEnumerations.wdTextureCross():
shading_.Val := "thinHorzCross";
TSDocxEnumerations.wdTextureDarkCross():
shading_.Val := "HorzCross";
TSDocxEnumerations.wdTextureDarkDiagonalCross():
shading_.Val := "diagCross";
TSDocxEnumerations.wdTextureDarkDiagonalDown():
shading_.Val := "reverseDiagStripe";
TSDocxEnumerations.wdTextureDarkDiagonalUp():
shading_.Val := "diagStripe";
TSDocxEnumerations.wdTextureDarkHorizontal():
shading_.Val := "horzStripe";
TSDocxEnumerations.wdTextureDarkVertical():
shading_.Val := "vertStripe";
TSDocxEnumerations.wdTextureDiagonalCross():
shading_.Val := "thinDiagCross";
TSDocxEnumerations.wdTextureDiagonalDown():
shading_.Val := "thinReverseDiagStripe";
TSDocxEnumerations.wdTextureDiagonalUp():
shading_.Val := "thinDiagStripe";
TSDocxEnumerations.wdTextureHorizontal():
shading_.Val := "thinHorzStripe";
TSDocxEnumerations.wdTextureNone():
shading_.Val := "none";
TSDocxEnumerations.wdTextureSolid():
shading_.Val := "solid";
TSDocxEnumerations.wdTextureVertical():
shading_.Val := "thinVertStripe";
end;
End;
Function TSDocxShading.ReadTexture();
Begin
value := shading_.Value("Val");
case value of
"pct10":
return TSDocxEnumerations.wdTexture10Percent();
"pct12":
return TSDocxEnumerations.wdTexture12Pt5Percent();
"pct15":
return TSDocxEnumerations.wdTexture15Percent();
"pct17":
return TSDocxEnumerations.wdTexture17Pt5Percent();
"pct20":
return TSDocxEnumerations.wdTexture20Percent();
"pct22":
return TSDocxEnumerations.wdTexture22Pt5Percent();
"pct25":
return TSDocxEnumerations.wdTexture25Percent();
"clear":
return TSDocxEnumerations.wdTexture27Pt5Percent();
"clear":
return TSDocxEnumerations.wdTexture2Pt5Percent();
"pct30":
return TSDocxEnumerations.wdTexture30Percent();
"pct32":
return TSDocxEnumerations.wdTexture32Pt5Percent();
"pct35":
return TSDocxEnumerations.wdTexture35Percent();
"pct37":
return TSDocxEnumerations.wdTexture37Pt5Percent();
"pct40":
return TSDocxEnumerations.wdTexture40Percent();
"pct42":
return TSDocxEnumerations.wdTexture42Pt5Percent();
"pct45":
return TSDocxEnumerations.wdTexture45Percent();
"pct47":
return TSDocxEnumerations.wdTexture47Pt5Percent();
"pct50":
return TSDocxEnumerations.wdTexture50Percent();
"pct52":
return TSDocxEnumerations.wdTexture52Pt5Percent();
"pct55":
return TSDocxEnumerations.wdTexture55Percent();
"clear":
return TSDocxEnumerations.wdTexture57Pt5Percent();
"pct5":
return TSDocxEnumerations.wdTexture5Percent();
"pct60":
return TSDocxEnumerations.wdTexture60Percent();
"pct62":
return TSDocxEnumerations.wdTexture62Pt5Percent();
"pct65":
return TSDocxEnumerations.wdTexture65Percent();
"pct67":
return TSDocxEnumerations.wdTexture67Pt5Percent();
"pct70":
return TSDocxEnumerations.wdTexture70Percent();
"pct72":
return TSDocxEnumerations.wdTexture72Pt5Percent();
"pct75":
return TSDocxEnumerations.wdTexture75Percent();
"pct77":
return TSDocxEnumerations.wdTexture77Pt5Percent();
"clear":
return TSDocxEnumerations.wdTexture7Pt5Percent();
"pct80":
return TSDocxEnumerations.wdTexture80Percent();
"pct82":
return TSDocxEnumerations.wdTexture82Pt5Percent();
"pct85":
return TSDocxEnumerations.wdTexture85Percent();
"pct87":
return TSDocxEnumerations.wdTexture87Pt5Percent();
"pct90":
return TSDocxEnumerations.wdTexture90Percent();
"pct92":
return TSDocxEnumerations.wdTexture92Pt5Percent();
"pct95":
return TSDocxEnumerations.wdTexture95Percent();
"pct97":
return TSDocxEnumerations.wdTexture97Pt5Percent();
"thinHorzCross":
return TSDocxEnumerations.wdTextureCross();
"HorzCross":
return TSDocxEnumerations.wdTextureDarkCross();
"diagCross":
return TSDocxEnumerations.wdTextureDarkDiagonalCross();
"reverseDiagStripe":
return TSDocxEnumerations.wdTextureDarkDiagonalDown();
"diagStripe":
return TSDocxEnumerations.wdTextureDarkDiagonalUp();
"horzStripe":
return TSDocxEnumerations.wdTextureDarkHorizontal();
"vertStripe":
return TSDocxEnumerations.wdTextureDarkVertical();
"thinDiagCross":
return TSDocxEnumerations.wdTextureDiagonalCross();
"thinReverseDiagStripe":
return TSDocxEnumerations.wdTextureDiagonalDown();
"thinDiagStripe":
return TSDocxEnumerations.wdTextureDiagonalUp();
"thinHorzStripe":
return TSDocxEnumerations.wdTextureHorizontal();
"none":
return TSDocxEnumerations.wdTextureNone();
"solid":
return TSDocxEnumerations.wdTextureSolid();
"thinVertStripe":
return TSDocxEnumerations.wdTextureVertical();
end;
End;
Function TSDocxShading.WriteForegroundPatternColorIndex(value);
Begin
shading_.Color := color_index_[value];
End;
Function TSDocxShading.ReadForegroundPatternColorIndex();
Begin
return color_index_[shading_.Value("Color")];
End;
Function TSDocxShading.WriteForegroundPatternColor(value);
Begin
shading_.Color := color_[value];
End;
Function TSDocxShading.ReadForegroundPatternColor();
Begin
return color_[shading_.Value("Color")];
End;
Function TSDocxShading.WriteBackgroundPatternColorIndex(value);
Begin
shading_.Fill := color_index_[value];
End;
Function TSDocxShading.ReadBackgroundPatternColorIndex();
Begin
return color_index_[shading_.Value("Fill")];
End;
Function TSDocxShading.WriteBackgroundPatternColor(value);
Begin
shading_.Fill := color_[value];
End;
Function TSDocxShading.ReadBackgroundPatternColor();
Begin
return color_[shading_.Value("Fill")];
End;

View File

@ -0,0 +1,169 @@
Type TSDocxShadingRange = Class(TSDocxShading)
Uses TSDocxEnumerations;
public
Function Init(rangeObj);
private
Function GetShadingObjectByNode(node);
Function GetShading(arr, hash);
Function CallFunction(fname, value);overload;
Function CallFunction(fname);overload;
Function SplitRun();
private
range_obj_;
public
Function WriteTexture(value);override;
Function ReadTexture();override;
Function WriteForegroundPatternColorIndex(value);override;
Function ReadForegroundPatternColorIndex();override;
Function WriteForegroundPatternColor(value);override;
Function ReadForegroundPatternColor();override;
Function WriteBackgroundPatternColorIndex(value);override;
Function ReadBackgroundPatternColorIndex();override;
Function WriteBackgroundPatternColor(value);override;
Function ReadBackgroundPatternColor();override;
End;
// ============== 实现 ================= //
Function TSDocxShadingRange.Init(rangeObj);
Begin
range_obj_ := rangeObj;
class(TSDocxShading).Init(nil);
End;
Function TSDocxShadingRange.SplitRun();
Begin
range_obj_.SplitRangeRun();
self.Parent.SetRangeObj(range_obj_);
End;
Function TSDocxShadingRange.GetShading(arr, hash);
Begin
if arr["entirety"] then
begin
if not ifnil(hash[arr["entirety"]]) then nil;
hash[arr["entirety"]] := true;
shading := GetShadingObjectByNode(arr["entirety"]);
end
else begin
trun := arr["trun"];
if not ifObj(trun.Root()) then return nil;
shading := new TSDocxShading(self.Application, self.Creator, self.Parent);
shading.Init(trun.rPr.Shading);
end
return shading;
End;
Function TSDocxShadingRange.GetShadingObjectByNode(node);
Begin
name := node.GetName();
if name = "w:p" then
begin
obj := TOfficeObj("TParagraph");
obj.Init(node);
paragraph_obj := new TSDocxParagraph(self.Application, self.Creator, self.Parent);
paragraph_obj.Init(nil, obj, nil);
return paragraph_obj.Shading();
end
else if name = "w:tbl" then
begin
obj := TOfficeObj("TTable");
obj.Init(node);
table_obj := new TSDocxTable(self.Application, self.Creator, self.Parent);
table_obj.Init(nil, obj);
return table_obj.Shading();
end
else if name = "w:tc" then
begin
cell_obj := new TSDocxCell(self.Application, self.Creator, self.Parent);
cell_obj.Init(node);
return cell_obj.Shading();
end
End;
Function TSDocxShadingRange.CallFunction(fname, value);overload;
Begin
// 这样设计是为了段落走走段落的shadingtable走table的cell走cell的
SplitRun();
hash := array();
range_arr := rangeObj.GetInfo();
for i:=0 to length(range_arr)-1 do
begin
shading := GetShading(range_arr[i], hash);
if ifnil(shading) then continue;
pf := FindFunction(fname, shading);
pf.Do(value);
end
End;
Function TSDocxShadingRange.CallFunction(fname);overload;
Begin
hash := array();
ret := nil;
range_arr := rangeObj.GetInfo();
for i:=0 to length(range_arr)-1 do
begin
shading := GetShading(range_arr[i], hash);
if ifnil(shading) then continue;
pf := FindFunction(fname, shading);
r := pf.Do();
if ifnil(ret) then ret := r;
if ret <> r then return TSDocxEnumerations.WdUnderline();
end
return ret;
End;
// property
Function TSDocxShadingRange.WriteTexture(value);override;
Begin
CallFunction("WriteTexture", value);
End;
Function TSDocxShadingRange.ReadTexture();override;
Begin
CallFunction("ReadTexture");
End;
Function TSDocxShadingRange.WriteForegroundPatternColorIndex(value);override;
Begin
CallFunction("WriteForegroundPatternColorIndex", value);
End;
Function TSDocxShadingRange.ReadForegroundPatternColorIndex();override;
Begin
CallFunction("ReadForegroundPatternColorIndex");
End;
Function TSDocxShadingRange.WriteForegroundPatternColor(value);override;
Begin
CallFunction("WriteForegroundPatternColor", value);
End;
Function TSDocxShadingRange.ReadForegroundPatternColor();override;
Begin
CallFunction("ReadForegroundPatternColor");
End;
Function TSDocxShadingRange.WriteBackgroundPatternColorIndex(value);override;
Begin
CallFunction("WriteBackgroundPatternColorIndex", value);
End;
Function TSDocxShadingRange.ReadBackgroundPatternColorIndex();override;
Begin
CallFunction("ReadBackgroundPatternColorIndex");
End;
Function TSDocxShadingRange.WriteBackgroundPatternColor(value);override;
Begin
CallFunction("WriteBackgroundPatternColor", value);
End;
Function TSDocxShadingRange.ReadBackgroundPatternColor();override;
Begin
CallFunction("ReadBackgroundPatternColor");
End;

View File

@ -10,17 +10,17 @@ Type TSWdCommon = Class
if pTotal + len > pStart then
begin
length := length(arr);
arr[length]["tparagraph"] := tparagraph;
arr[length]["trun"] := run_obj;
arr[length]["text"] := text;
arr[length]["root"] := rootNode;
arr[length]["parent"] := parentNode;
// 左边切割
if pTotal < pstart and pTotal + len > pStart + 1 then
arr[length]["lsplit"] := pStart - pTotal; // 左边丢弃的字符数
// 右边切割
if pTotal + len > pEnd then
arr[length]["rsplit"] := pTotal + len - pEnd; // 右边丢弃的字符数
arr[length]["tparagraph"] := tparagraph;
arr[length]["trun"] := run_obj;
arr[length]["text"] := text;
arr[length]["root"] := rootNode;
arr[length]["parent"] := parentNode;
end
return len;
End;
@ -37,7 +37,7 @@ Type TSWdCommon = Class
paragraph_obj.Init(node);
if paragraph_obj.Empty() then
begin
class(TSWdCommon).AddRun(root, startNode, nil, paragraph_obj, pStart, pEnd, pTotal, arr);
AddRun(root, startNode, nil, paragraph_obj, pStart, pEnd, pTotal, arr);
end
else begin
paragraph_len := length(arr); // 标记段落完整的起始位置
@ -47,7 +47,7 @@ Type TSWdCommon = Class
case sub_node.GetName() of
"w:r":
begin
pTotal += class(TSWdCommon).AddRun(root, startNode, sub_node, paragraph_obj, pStart, pEnd, pTotal, arr);
pTotal += AddRun(root, startNode, sub_node, paragraph_obj, pStart, pEnd, pTotal, arr);
if pTotal >= pEnd then return 1;
end
@ -56,7 +56,7 @@ Type TSWdCommon = Class
run_node := sub_node.FirstChildElement("w:r");
while ifObj(run_node) do
begin
class(TSWdCommon).AddRun(paragraph_obj, root, run_node, pStart, pEnd, pTotal, arr);
AddRun(paragraph_obj, root, run_node, pStart, pEnd, pTotal, arr);
run_node := run_node.NextElement("w:r");
end
end
@ -80,7 +80,7 @@ Type TSWdCommon = Class
while ifObj(tc) do
begin
cell_len := length(arr);
flag := class(TSWdCommon).SplitRange(root, tc, pStart, pEnd, pTotal, arr);
flag := SplitRange(root, tc, pStart, pEnd, pTotal, arr);
if flag then return 1;
tc := tc.NextElement("w:tc");
if pTotal >= pEnd then return 1;
@ -119,21 +119,21 @@ Type TSWdCommon = Class
paragraph_obj.Init(node);
if paragraph_obj.Empty() then
begin
class(TSWdCommon).AddRange(root, startNode, findNode, paragraph_obj, nil, arr);
AddRange(root, startNode, findNode, paragraph_obj, nil, arr);
end
else begin
sub_node := node.FirstChildElement();
while ifObj(sub_node) do
begin
case sub_node.GetName() of
"w:r": pend += class(TSWdCommon).AddRange(root, startNode, findNode, paragraph_obj, sub_node, arr);
"w:r": pend += AddRange(root, startNode, findNode, paragraph_obj, sub_node, arr);
"w:ins", "w:del":
begin
run_node := sub_node.FirstChildElement("w:r");
while ifObj(run_node) do
begin
pend += class(TSWdCommon).AddRange(root, findNode, paragraph_obj, run_node, arr);
pend += AddRange(root, findNode, paragraph_obj, run_node, arr);
run_node := run_node.NextElement("w:r");
end
end
@ -156,7 +156,7 @@ Type TSWdCommon = Class
arr := array();
end
case node.GetName() of
"w:p": class(TSWdCommon).ParagraphRange(root, startNode, findNode, node, pend, arr);
"w:p": ParagraphRange(root, startNode, findNode, node, pend, arr);
"w:tbl":
begin
tr := node.FirstChildElement("w:tr");
@ -188,7 +188,7 @@ Type TSWdCommon = Class
Class Function SplitRangeRun(rangeArr);overload;
Begin
for i:=0 to length(rangeArr)-1 do
rangeArr[i] := class(TSWdCommon).SplitSingleRangeRun(rangeArr[i]);
rangeArr[i] := SplitSingleRangeRun(rangeArr[i]);
End;
Class Function SplitSingleRangeRun(arr);overload;

340
docx/utils/TSWdRange.tsf Normal file
View File

@ -0,0 +1,340 @@
Type TSWdRange = Class
public
Function Create(rootNode, startP, endP);overload;
Function Create(rootNode, targetNode);overload;
Function Init();
Function Run();
Function GetStart();
Function GetEnd();
Function SplitRun();overload;
Function SplitRun(arr);overload;
Function Clear();
Function Print();
public
Data; // 管理range结构的数组字段如下
// lsplit: 左边丢弃的字符数
// rsplit: 右边丢弃的字符数
// tparagraph: TOfficeObj("TParagraph")对象
// trun: TOfficeObj("TRun")对象
// text: 文本内容
// root: 根节点
// parent: 父节点
// entirety: 是否是完整的段落/表格/单元格
private
Function FindRangeByPosition(startNode);
Function FindRangeByNode(startNode);
Function AddEntirety(len, node);
Function AddRunInfo(parentNode, runNode, tParagraph);
Function AddRunInfo2(parentNode, runNode, tParagraph);
Function ParagraphRange(node);
private
start_position_; // 开始位置
end_position_; // 结束位置, 开始与结束遵循左闭右开原则
cur_position_; // 当前位置
root_node_; // 根节点
target_node_; // 目标节点使用paragraph.Rangetable.Range, cell.Range时用
split_flag_; // 切割标志
End;
Function TSWdRange.Create(rootNode, startP, endP);overload;
Begin
root_node_ := rootNode;
start_position_ := startP;
end_position_ := endP;
targetNode := nil;
Init();
End;
Function TSWdRange.Create(rootNode, targetNode);overload;
Begin
root_node_ := rootNode;
target_node_ := targetNode;
start_position_ := nil;
end_position_ := nil;
Init();
End;
Function TSWdRange.Init();
Begin
cur_position_ := 0;
split_flag_ := false;
Data := array();
Run();
End;
Function TSWdRange.Run();
Begin
if target_node_ then
FindRangeByNode(target_node_);
else
FindRangeByPosition(root_node_);
End;
Function TSWdRange.Print();
Begin
println("print... {}", Data);
End;
Function TSWdRange.GetStart();
Begin
if ifnil(start_position_) then return 0;
return start_position_;
End;
Function TSWdRange.GetEnd();
Begin
if ifnil(end_position_) then return 0;
return end_position_;
End;
Function TSWdRange.SplitRun();overload;
Begin
if split_flag_ then return;
for i:=0 to length(Data)-1 do
Data[i] := SplitRun(Data[i]);
split_flag_ := true;
End;
Function TSWdRange.SplitRun(arr);overload;
Begin
insert_run := function(root, node);
begin
new_node := root.InsertAfterChild(node, "element", "w:r");
run := TOfficeObj("TRun");
run.Init(new_node);
return run;
end
if ifnil(arr["lsplit"]) and ifnil(arr["rsplit"]) then return arr;
paragraph := arr["tparagraph"];
run := arr["trun"];
text := arr["text"];
if arr["lsplit"] then // 分割左边
begin
lpos := arr["lsplit"];
run.SetText(text[:lpos]);
run := ##insert_run(paragraph.Root(), run.Root());
text := text[lpos + 1:];
run.SetText(text);
arr["text"] := text;
arr["lsplit"] := nil;
end
if arr["rsplit"] then // 分割右边的run
begin
rpos := length(text) - arr["rsplit"];
run.SetText(text[1:rpos]);
new_run := ##insert_run(paragraph.Root(), run.Root());
new_run.SetText(text[rpos+1:]);
arr["rsplit"] := nil;
arr["text"] := text[1:rpos];
end
arr["trun"] := run;
return arr;
End;
Function TSWdRange.FindRangeByPosition(startNode);
Begin
node := startNode.FirstChildElement();
while ifObj(node) do
begin
len := length(Data); // 标记完整段落/表格的起始位置
case node.GetName() of
"w:p":
begin
paragraph_obj := TOfficeObj("TParagraph");
paragraph_obj.Init(node);
if paragraph_obj.Empty() then // 空段落
begin
AddRunInfo(startNode, nil, paragraph_obj);
end
else begin
sub_node := node.FirstChildElement();
while ifObj(sub_node) do
begin
case sub_node.GetName() of
"w:r":
begin
AddRunInfo(startNode, sub_node, paragraph_obj);
if cur_position_ >= end_position_ then return 1;
end
"w:ins", "w:del":
begin
run_node := sub_node.FirstChildElement("w:r");
while ifObj(run_node) do
begin
AddRunInfo(startNode, run_node, paragraph_obj);
if cur_position_ >= end_position_ then return 1;
run_node := run_node.NextElement("w:r");
end
end
end;
sub_node := sub_node.NextElement();
end
// 完整段落
cur_position_ += 1;
end
end
"w:tbl":
begin
tr := node.FirstChildElement("w:tr");
while ifObj(tr) do
begin
tc := tr.FirstChildElement("w:tc");
while ifObj(tc) do
begin
cell_len := length(Data);
flag := FindRangeByPosition(tc);
if flag then return 1;
if cur_position_ >= end_position_ then return 1;
AddEntirety(cell_len, tc);
tc := tc.NextElement("w:tc");
end
cur_position_ += 1;
if cur_position_ >= end_position_ then return 1;
tr := tr.NextElement("w:tr");
end
end
end;
AddEntirety(len, node);
if cur_position_ >= end_position_ then return 1;
node := node.NextElement();
end
End;
Function TSWdRange.AddEntirety(len, node);
Begin
for i:=len to length(Data)-1 do
Data[i]["entirety"] := node;
End;
Function TSWdRange.AddRunInfo(parentNode, runNode, tParagraph);
Begin
run_obj := TOfficeObj("TRun");
run_obj.Init(runNode);
text := ifObj(runNode) ? run_obj.Text() : "";
len := text ? length(text) : 1;
if cur_position_ + len > start_position_ then
begin
length := length(Data);
Data[length]["tparagraph"] := tparagraph;
Data[length]["trun"] := run_obj;
Data[length]["text"] := text;
Data[length]["root"] := root_node_;
Data[length]["parent"] := parentNode;
// 左边切割,左边丢弃的字符数
if cur_position_ < start_position_ and cur_position_ + len > start_position_ + 1 then
Data[length]["lsplit"] := start_position_ - cur_position_;
// 右边切割,右边丢弃的字符数
if cur_position_ + len > end_position_ then
Data[length]["rsplit"] := cur_position_ + len - end_position_;
end
cur_position_ += len;
End;
Function TSWdRange.FindRangeByNode(startNode);
Begin
tc_pf := function(tc);
begin
node := tc.FirstChildElement();
while ifObj(node) do
begin
FindRangeByNode(node);
node := node.NextElement();
end
end
case startNode.GetName() of
"w:p": ParagraphRange(startNode);
"w:tbl":
begin
tr := startNode.FirstChildElement("w:tr");
while ifObj(tr) do
begin
tc := tr.FirstChildElement("w:tc");
while ifObj(tc) do
begin
##tc_pf(tc);
tc := tc.NextElement("w:tc");
end
tr := tr.NextElement("w:tr");
end
end
"w:tc":
begin
##tc_pf(startNode);
end
end;
End;
Function TSWdRange.ParagraphRange(node);
Begin
paragraph_obj := TOfficeObj("TParagraph");
paragraph_obj.Init(node);
if paragraph_obj.Empty() then
begin
AddRunInfo2(nil, nil, paragraph_obj);
end
else begin
sub_node := node.FirstChildElement();
while ifObj(sub_node) do
begin
case sub_node.GetName() of
"w:r": AddRunInfo2(nil, sub_node, paragraph_obj);
"w:ins", "w:del":
begin
run_node := sub_node.FirstChildElement("w:r");
while ifObj(run_node) do
begin
AddRunInfo2(nil, run_obj, paragraph_obj);
run_node := run_node.NextElement("w:r");
end
end
end;
sub_node := sub_node.NextElement();
end
end
End;
Function TSWdRange.AddRunInfo2(parentNode, runNode, tParagraph);
Begin
run_obj := TOfficeObj("TRun");
run_obj.Init(runNode);
length := length(Data);
Data[length]["tparagraph"] := tParagraph;
Data[length]["trun"] := run_obj;
Data[length]["root"] := root_node_;
Data[length]["parent"] := parentNode;
Data[length]["entirety"] := target_node_;
End;
Function TSWdRange.Clear();
Begin
SplitRun();
first := Data[0];
para := first["tparagraph"];
index := 0;
for i:=1 to length(Data)-1 do
begin
if Data[i]["tparagraph"] <> para then
begin
parent := Data[i]["parent"];
parent.DeleteChild(Data[i]["tparagraph"].Root());
end
else begin
p := Data[i]["tparagraph"];
r := Data[i]["trun"];
if ifObj(p.Root()) and ifObj(r.Root()) then p.Root().DeleteChild(r.Root());
end
end
Data := array();
Data[0] := first;
End;

View File

@ -17,19 +17,25 @@ Begin
println("ActiveDocument.Name = {}", application.ActiveDocument.Name);
println("ActiveDocument.Tables.Count = {}", application.ActiveDocument.Tables.Count);
ActiveDocument := application.ActiveDocument;
ActiveDocument.Paragraphs.Add;
prange := ActiveDocument.Range(2, 4);
prange.Font.Size := 20;
prange.ParagraphFormat.Alignment := 1;
return;
// TestTableCell(application);
// TestTableColumns(application);
// TestTables(application);
// TestParagraphs(application);
// TestRange(application);
TestBorders(application);
// TestBorders(application);
// arr := application.ActiveDocument.Range(0, 10);
// println("arr = {}", arr);
Documents[2].SaveAs2(FileName : savepath);
println("savepath = {}", savepath);
return;
End;
@ -54,8 +60,6 @@ Begin
crange.InsertAfter(Text: ".after");
crange.InsertBefore(Text: ".before");
return;
ActiveDocument.Range(2, 17).Font.Size := 20;
println("ActiveDocument.Range(2, 4).Font.Size = {}", ActiveDocument.Range(2, 4).Font.Size);
println("ActiveDocument.Range(2, 5).Font.Size = {}", ActiveDocument.Range(2, 5).Font.Size);

24
test/docx_vba_help.tsl Normal file
View File

@ -0,0 +1,24 @@
Uses TSDocxEnumerations;
Application := new TSDocxApplication();
openpath := "D://temp//default.docx";
savepath := "D://temp//docx_vba_help.docx";
document := Application.Documents.Open(FileName: openpath);
document.Activate;
println("Documents.Count = {}", Application.Documents.Count);
ActiveDocument := Application.ActiveDocument;
println("ActiveDocument.Name = {}", ActiveDocument.Name);
println("\n");
ActiveDocument.Paragraphs.Add;
para := ActiveDocument.Paragraphs.Last;
para.Range.Text := "TSVBA帮助文档";
println("para = {}", para);
// para.Range.Font.Size := 20;
para.Format.Alignment := TSDocxEnumerations.wdAlignParagraphCenter();
para.Format.Apply(); // 写属性后要apply
// ActiveDocument.SaveAs2(FileName : savepath);
// println("ActiveDocument.SaveAs2 = {}", savepath);

4
test/test.tsl Normal file
View File

@ -0,0 +1,4 @@
Uses SampleUnit;
InterfaceFunction();
return;

View File

@ -2,7 +2,7 @@
// xlsx.NewFile();
// xlsx.OpenFile("", "D:\\temp\\vba_new.xlsx");
application := new Application();
application := new XlsxApplication();
application.Workbooks.Add;
Workbooks := application.Workbooks;
Workbooks.Open(FileName : "D:/temp/vba_new.xlsx");

View File

@ -19,18 +19,12 @@ private
fp_; // 函数指针 -- 用来比较
activation_; // 激活的对象
public
class Function GetInstance(value);
private
static collection_;
End;
// ============== 实现 ================= //
Function Collection.Create();
Begin
container_ := ContainerList();
container_ := new LinkList();
ignorecase_ := false;
fp_ := FindFunction("CompareFunction", self);
End;
@ -66,14 +60,6 @@ Begin
return name;
End;
class Function Collection.GetInstance(value);
Begin
if not istable(collection_) then collection_ := array();
if not collection_[value] then
collection_[value] := new Collection();
return collection_[value];
End;
Function Collection.AddCollection(obj, name);
Begin
data := new Data();

View File

@ -1,8 +1,3 @@
Function ContainerList();
Begin
return new LinkList();
End;
Type LinkList = class
private

View File

@ -4,9 +4,9 @@ public
Function Create(app, cre, par);
private
application_;
creator_;
parent_;
[weakref]application_;
[weakref]parent_;
[autoref]creator_;
public
property Application read ReadApplication;
@ -26,7 +26,7 @@ Begin
parent_ := par;
End;
// property
// Properties
Function TSVbaBase.ReadApplication();
Begin
return application_;