增加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 Create();
Function Init(); Function Init();
private
documents_;
public public
// Methods // Methods
Function Activate(); Function Activate();
@ -340,9 +343,6 @@ public
Function ReadActiveEncryptionSession(); Function ReadActiveEncryptionSession();
Function ReadActiveDocument(); Function ReadActiveDocument();
private
documents_;
End; End;
// ============== 实现 ================= // // ============== 实现 ================= //
@ -358,7 +358,6 @@ Begin
documents_.Init(); documents_.Init();
End; End;
// Properties // Properties
Function TSDocxApplication.ReadDocuments(Index) Function TSDocxApplication.ReadDocuments(Index)
Begin Begin

View File

@ -21,7 +21,7 @@ public
Function Item(Index); Function Item(Index);
Function Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, Function Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument,
PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format, 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, Function OpenNoRepairDialog(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument,
WritePasswordTemplate, Format, Encoding, Visible, OpenAndRepair, WritePasswordTemplate, Format, Encoding, Visible, OpenAndRepair,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -13,7 +13,6 @@ public
Function SplitRun(index);overload; Function SplitRun(index);overload;
Function Clear(deleteAll); Function Clear(deleteAll);
Function Size(); Function Size();
Function Root();
Function Print(); Function Print();
Begin Begin
@ -27,6 +26,7 @@ private
Function AddRunInfo(runNode, tParagraph); Function AddRunInfo(runNode, tParagraph);
Function AddRunInfo2(runNode, tParagraph); Function AddRunInfo2(runNode, tParagraph);
Function ParagraphRange(node); Function ParagraphRange(node);
Function CalcPosition(startNode);
public public
data_; // 管理range结构的数组字段如下 data_; // 管理range结构的数组字段如下
@ -106,7 +106,7 @@ Function TSWdRange.Create(rootNode, startP, endP);overload;
Begin Begin
root_node_ := rootNode; root_node_ := rootNode;
start_position_ := startP; start_position_ := startP;
end_position_ := endP; end_position_ := endP = -1 ? INF : endP;
target_node_ := nil; target_node_ := nil;
self.Init(); self.Init();
End; End;
@ -153,21 +153,15 @@ Begin
return length(data_); return length(data_);
End; End;
Function TSWdRange.Root();
Begin
node := root_node_;
return node;
End;
Function TSWdRange.GetStart(); Function TSWdRange.GetStart();
Begin Begin
if ifnil(start_position_) then return 0; if ifnil(start_position_) then self.CalcPosition(root_node_);
return start_position_; return start_position_;
End; End;
Function TSWdRange.GetEnd(); Function TSWdRange.GetEnd();
Begin Begin
if ifnil(end_position_) then return 0; if ifnil(end_position_) then self.CalcPosition(root_node_);
return end_position_; return end_position_;
End; End;
@ -372,6 +366,86 @@ Begin
end; end;
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); Function TSWdRange.ParagraphRange(node);
Begin Begin
paragraph_obj := TOfficeObj("TParagraph"); paragraph_obj := TOfficeObj("TParagraph");