增加range方法支持

This commit is contained in:
csh 2024-01-19 17:37:26 +08:00
parent b4649653d9
commit 1ac447c94e
10 changed files with 152 additions and 64 deletions

Binary file not shown.

View File

@ -4,6 +4,9 @@ public
Function Create();
Function Init();
private
documents_;
public
// Methods
Function Activate();
@ -340,9 +343,6 @@ public
Function ReadActiveEncryptionSession();
Function ReadActiveDocument();
private
documents_;
End;
// ============== 实现 ================= //
@ -358,7 +358,6 @@ Begin
documents_.Init();
End;
// Properties
Function TSDocxApplication.ReadDocuments(Index)
Begin

View File

@ -21,7 +21,7 @@ public
Function Item(Index);
Function Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument,
PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format,
Encoding, Visible, OpenConflictDocument, OpenAndRepair, DocumentDirection, NoEncodingDialog); // Completed
Encoding, Visible, OpenConflictDocument, OpenAndRepair, DocumentDirection, NoEncodingDialog); overload;
Function OpenNoRepairDialog(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument,
WritePasswordTemplate, Format, Encoding, Visible, OpenAndRepair,

View File

@ -17,6 +17,7 @@ private
docx_;
range_obj_; // TSWdRange
range_font_; // TSDocxFontRange
range_shading_; // TSDocxShadingRange
paragraph_format_range_; // TSDocxParagraphFormatRange
list_format_range_; // TSDocxListFormatRange
borders_range_; // TSDocxBordersRange
@ -79,7 +80,7 @@ public
Function MoveStartWhile(Cset, Count);
Function MoveUnti(Cset, Count);
Function MoveWhile(Cset, Count);
Function Nex(_Unit, Count);
Function Next(_Unit, Count);
Function NextSubdocument();
Function Paste();
Function PasteAndFormat(Type);
@ -332,6 +333,8 @@ Begin
range_obj_ := rangeObj;
range_font_ := new TSDocxFontRange(self.Application, self.Creator, self);
range_font_.Init(range_obj_);
range_shading_ := new TSDocxShadingRange(self.Application, self.Creator, self);
range_shading_.Init(range_obj_);
paragraph_format_range_ := new TSDocxParagraphFormatRange(self.Application, self.Creator, self);
paragraph_format_range_.Init(docx_, range_obj_);
list_format_range_ := new TSDocxListFormatRange(self.Application, self.Creator, self);
@ -732,6 +735,7 @@ End;
Function TSDocxRange.WriteText(value);
Begin
range_obj_.SplitRun();
self.Clear();
run := range_obj_[0].TRun;
if ifObj(run.Root()) then run.SetText(value);
@ -743,12 +747,21 @@ Begin
End;
Function TSDocxRange.ReadText();
Begin
range_obj_.SplitRun();
txt := "";
prev := range_obj_[0].TParagraph;
for i:=0 to range_obj_.Size()-1 do
begin
run := range_obj_[i].TRun;
txt += prev = range_obj_[i].TParagraph ? run.Text() : "\n" + run.Text();
if not ifObj(run.Root()) then continue;
if prev = range_obj_[i].TParagraph then
begin
txt += run.Text();
end
else begin
txt += "\n" + run.Text();
prev := range_obj_[i].TParagraph;
end
end
return txt;
End;
@ -757,3 +770,18 @@ Function TSDocxRange.ReadListFormat();
Begin
return list_format_range_;
End;
Function TSDocxRange.ReadShading();
Begin
return range_shading_;
End;
Function TSDocxRange.ReadEnd();
Begin
return range_obj_.GetEnd();
End;
Function TSDocxRange.ReadStart();
Begin
return range_obj_.GetStart();
End;

View File

@ -193,20 +193,6 @@ Begin
return ifnil(index) ? rows_obj : rows_obj[index];
End;
Function TSDocxTable.WritePreferredWidthType(value);
Begin
End;
Function TSDocxTable.ReadPreferredWidthType();
Begin
End;
Function TSDocxTable.WritePreferredWidth(value);
Begin
End;
Function TSDocxTable.ReadPreferredWidth();
Begin
End;
Function TSDocxTable.ReadRange();
Begin
if ifnil(range_) then

View File

@ -3,7 +3,7 @@ Uses TSDocxEnumerations;
public
Function Init(rangeObj);
Function Apply();overload;
Function Apply();override;
Function ReWrite(pr);override;
private
@ -115,7 +115,7 @@ Begin
class(TSDocxFont).Init(nil);
End;
Function TSDocxFontRange.Apply();overload;
Function TSDocxFontRange.Apply();override;
Begin
CallFunction(ThisFunction(class(TSDocxFont).Apply));
End;

View File

@ -9,6 +9,7 @@ public
protected
docx_;
pr_; // TOfficeObj("TwpPr")
shading_; // TSDocxShading
public
// Methods
@ -151,6 +152,7 @@ Function TSDocxParagraphFormat.Init(docx, pPr);
Begin
docx_ := docx;
pr_ := pPr;
shading_ := nil;
End;
Function TSDocxParagraphFormat.Apply();virtual;
@ -316,9 +318,12 @@ End;
Function TSDocxParagraphFormat.ReadShading();virtual;
Begin
shading_obj := new TSDocxShading(self.Application, self.Creator, self.Parent);
shading_obj.Init(pr_.Shading);
return shading_obj;
if ifnil(shading_) then
begin
shading_ := new TSDocxShading(self.Application, self.Creator, self.Parent);
shading_.Init(pr_.Shading);
end
return shading_;
End;
Function TSDocxParagraphFormat.WriteRightIndent(value);virtual;

View File

@ -45,7 +45,7 @@ Begin
End;
// property
Function TSDocxShading.WriteTexture(value);
Function TSDocxShading.WriteTexture(value);virtual;
Begin
case value of
TSDocxEnumerations.wdTexture10Percent():
@ -156,7 +156,7 @@ Begin
shading_.Val := "thinVertStripe";
end;
End;
Function TSDocxShading.ReadTexture();
Function TSDocxShading.ReadTexture();virtual;
Begin
value := shading_.Value("Val");
case value of
@ -269,29 +269,29 @@ Begin
end;
End;
Function TSDocxShading.WriteForegroundPatternColorIndex(value);
Function TSDocxShading.WriteForegroundPatternColorIndex(value);virtual;
Begin
shading_.Color := color_index_[value];
End;
Function TSDocxShading.ReadForegroundPatternColorIndex();
Function TSDocxShading.ReadForegroundPatternColorIndex();virtual;
Begin
return color_index_[shading_.Value("Color")];
End;
Function TSDocxShading.WriteForegroundPatternColor(value);
Function TSDocxShading.WriteForegroundPatternColor(value);virtual;
Begin
shading_.Color := color_[value];
End;
Function TSDocxShading.ReadForegroundPatternColor();
Function TSDocxShading.ReadForegroundPatternColor();virtual;
Begin
return color_[shading_.Value("Color")];
End;
Function TSDocxShading.WriteBackgroundPatternColorIndex(value);
Function TSDocxShading.WriteBackgroundPatternColorIndex(value);virtual;
Begin
shading_.Fill := color_index_[value];
End;
Function TSDocxShading.ReadBackgroundPatternColorIndex();
Function TSDocxShading.ReadBackgroundPatternColorIndex();virtual;
Begin
return color_index_[shading_.Value("Fill")];
End;

View File

@ -7,13 +7,13 @@ public
private
Function GetShadingObjectByNode(node);
Function GetShading(arr, hash);
Function GetShading(arr);
Function CallFunction(fname, value);overload;
Function CallFunction(fname);overload;
Function SplitRun();
private
range_obj_;
shading_hash_;
public
Function WriteTexture(value);override;
@ -34,27 +34,22 @@ End;
Function TSDocxShadingRange.Init(rangeObj);
Begin
range_obj_ := rangeObj;
shading_hash_ := array();
class(TSDocxShading).Init(nil);
End;
Function TSDocxShadingRange.Apply();override;
Begin
CallFunction(ThisFunction(class(TSDocxShading).Apply), nil);
CallFunction("Apply");
End;
Function TSDocxShadingRange.SplitRun();
Begin
range_obj_.SplitRangeRun();
self.Parent.SetRangeObj(range_obj_);
End;
Function TSDocxShadingRange.GetShading(arr, hash);
Function TSDocxShadingRange.GetShading(arr);
Begin
if arr.Entirety then
begin
if not ifnil(hash[arr.Entirety]) then nil;
hash[arr.Entirety] := true;
if not ifnil(shading_hash_[arr.Entirety]) then return nil;
shading := GetShadingObjectByNode(arr.Entirety);
shading_hash_[arr.Entirety] := shading;
end
else begin
trun := arr.TRun;
@ -74,7 +69,7 @@ Begin
obj.Init(node);
paragraph_obj := new TSDocxParagraph(self.Application, self.Creator, self.Parent);
paragraph_obj.Init(nil, obj, nil);
return paragraph_obj.Shading();
return paragraph_obj.Shading;
end
else if name = "w:tbl" then
begin
@ -82,24 +77,23 @@ Begin
obj.Init(node);
table_obj := new TSDocxTable(self.Application, self.Creator, self.Parent);
table_obj.Init(nil, obj);
return table_obj.Shading();
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();
return cell_obj.Shading;
end
End;
Function TSDocxShadingRange.CallFunction(fname, value);overload;
Begin
// 这样设计是为了段落走走段落的shadingtable走table的cell走cell的
SplitRun();
hash := array();
range_obj_.SplitRun();
for i:=0 to range_obj_.Size()-1 do
begin
shading := GetShading(range_obj_[i], hash);
shading := GetShading(range_obj_[i]);
if ifnil(shading) then continue;
pf := FindFunction(fname, shading);
pf.Do(value);
@ -108,11 +102,13 @@ End;
Function TSDocxShadingRange.CallFunction(fname);overload;
Begin
hash := array();
range_obj_.SplitRun();
ret := nil;
for i:=0 to range_obj_.Size()-1 do
begin
shading := GetShading(range_obj_[i], hash);
arr := range_obj_[i];
if arr.Entirety and shading_hash_[arr.Entirety] then shading := shading_hash_[arr.Entirety];
else shading := GetShading(range_obj_[i]);
if ifnil(shading) then continue;
pf := FindFunction(fname, shading);
r := pf.Do();

View File

@ -13,7 +13,6 @@ public
Function SplitRun(index);overload;
Function Clear(deleteAll);
Function Size();
Function Root();
Function Print();
Begin
@ -27,6 +26,7 @@ private
Function AddRunInfo(runNode, tParagraph);
Function AddRunInfo2(runNode, tParagraph);
Function ParagraphRange(node);
Function CalcPosition(startNode);
public
data_; // 管理range结构的数组字段如下
@ -106,7 +106,7 @@ Function TSWdRange.Create(rootNode, startP, endP);overload;
Begin
root_node_ := rootNode;
start_position_ := startP;
end_position_ := endP;
end_position_ := endP = -1 ? INF : endP;
target_node_ := nil;
self.Init();
End;
@ -153,21 +153,15 @@ Begin
return length(data_);
End;
Function TSWdRange.Root();
Begin
node := root_node_;
return node;
End;
Function TSWdRange.GetStart();
Begin
if ifnil(start_position_) then return 0;
if ifnil(start_position_) then self.CalcPosition(root_node_);
return start_position_;
End;
Function TSWdRange.GetEnd();
Begin
if ifnil(end_position_) then return 0;
if ifnil(end_position_) then self.CalcPosition(root_node_);
return end_position_;
End;
@ -372,6 +366,86 @@ Begin
end;
End;
Function TSWdRange.CalcPosition(startNode);
Begin
node := startNode.FirstChildElement();
while ifObj(node) do
begin
if node.Eq(target_node_) then
begin
eq_flag := true;
start_position_ := cur_position_;
end
case node.GetName() of
"w:p":
begin
paragraph_obj := TOfficeObj("TParagraph");
paragraph_obj.Init(node);
if paragraph_obj.Empty() then // 空段落
begin
cur_position_ += 1;
end
else begin
sub_node := node.FirstChildElement();
while ifObj(sub_node) do
begin
case sub_node.GetName() of
"w:r":
begin
run_obj := TOfficeObj("TRun");
run_obj.Init(sub_node);
text := run_obj.Text();
if class(TSXml).IsUtf8() then text := Utf8ToAnsi(text);
cur_position_ += lengthw(text);
end
"w:ins", "w:del":
begin
run_node := sub_node.FirstChildElement("w:r");
while ifObj(run_node) do
begin
run_obj := TOfficeObj("TRun");
run_obj.Init(run_node);
text := run_obj.Text();
if class(TSXml).IsUtf8() then text := Utf8ToAnsi(text);
cur_position_ += lengthw(text);
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
flag := self.CalcPosition(tc);
if flag then return 1;
tc := tc.NextElement("w:tc");
end
cur_position_ += 1;
tr := tr.NextElement("w:tr");
end
end
end;
if eq_flag then
begin
end_position_ := cur_position_;
return 1;
end
node := node.NextElement();
end
End;
Function TSWdRange.ParagraphRange(node);
Begin
paragraph_obj := TOfficeObj("TParagraph");