This commit is contained in:
csh 2023-02-24 14:53:35 +08:00
parent 710077aff4
commit 894303ccef
11 changed files with 145 additions and 95 deletions

View File

@ -666,7 +666,8 @@ style.Protection.Lock := 1;
('attrName': 'Scale', 'type': 'int', 'desc': '缩放比例(%)', 'value': array()), ('attrName': 'Scale', 'type': 'int', 'desc': '缩放比例(%)', 'value': array()),
('attrName': 'FitToWidth', 'type': 'int', 'desc': '页宽', 'value': array()), ('attrName': 'FitToWidth', 'type': 'int', 'desc': '页宽', 'value': array()),
('attrName': 'FitToHeight', 'type': 'int', 'desc': '页高', 'value': array()), ('attrName': 'FitToHeight', 'type': 'int', 'desc': '页高', 'value': array()),
('attrName': 'FirstPageNumber', 'type': 'int', 'desc': '起始页码', 'value': array()), ('attrName': 'UseFirstPageNumber', 'type': 'bool', 'desc': '是否启用起始页码', 'value': array()),
('attrName': 'FirstPageNumber', 'type': 'int', 'desc': '起始页码,{UseFirstPageNumber}为true时有效', 'value': array()),
('attrName': 'Orientation', 'type': 'string', 'desc': '纸张方向', 'value': array('"landscape": 横向', '"portrait": 纵向')), ('attrName': 'Orientation', 'type': 'string', 'desc': '纸张方向', 'value': array('"landscape": 横向', '"portrait": 纵向')),
('attrName': 'PageOrder', 'type': 'string', 'desc': '打印顺序', 'value': array('nil默认: 先列后行', '"overThenDown": 先行后列')), ('attrName': 'PageOrder', 'type': 'string', 'desc': '打印顺序', 'value': array('nil默认: 先列后行', '"overThenDown": 先行后列')),
('attrName': 'BlackAndWhite', 'type': 'boolean', 'desc': '单色打印', 'value': array()), ('attrName': 'BlackAndWhite', 'type': 'boolean', 'desc': '单色打印', 'value': array()),
@ -766,7 +767,7 @@ style.Protection.Lock := 1;
('attrName': 'RefMode', 'type': 'string', 'desc': 'R1C1引用样式', 'value': array('nil(默认): 不启用', '"R1C1": 启用R1C1引用样式')), ('attrName': 'RefMode', 'type': 'string', 'desc': 'R1C1引用样式', 'value': array('nil(默认): 不启用', '"R1C1": 启用R1C1引用样式')),
('attrName': 'Iterate', 'type': 'bool', 'desc': '是否启用迭代计算', 'value': array()), ('attrName': 'Iterate', 'type': 'bool', 'desc': '是否启用迭代计算', 'value': array()),
('attrName': 'IterateCount', 'type': 'int', 'desc': '最多迭代次数', 'value': array()), ('attrName': 'IterateCount', 'type': 'int', 'desc': '最多迭代次数', 'value': array()),
('attrName': 'IterateDelta', 'type': 'double', 'desc': '最大误差需要使用科学计数法如0.002时为2E-3', 'value': array()), ('attrName': 'IterateDelta', 'type': 'double', 'desc': '最大误差', 'value': array()),
('attrName': 'CalcOnSave', 'type': 'bool', 'desc': '保存工作簿之前重新计算,{CalcMode}为"manual"时有效', 'value': array()), ('attrName': 'CalcOnSave', 'type': 'bool', 'desc': '保存工作簿之前重新计算,{CalcMode}为"manual"时有效', 'value': array()),
('attrName': 'ConCurrentCalc', 'type': 'bool', 'desc': '是否启用多线程计算', 'value': array()), ('attrName': 'ConCurrentCalc', 'type': 'bool', 'desc': '是否启用多线程计算', 'value': array()),
('attrName': 'ConCurrentManualCount', 'type': 'int', 'desc': '自定义计算线程数', 'value': array()), ('attrName': 'ConCurrentManualCount', 'type': 'int', 'desc': '自定义计算线程数', 'value': array()),

Binary file not shown.

View File

@ -1,4 +1,4 @@
// Version 1.2.0 // Version 1.2.1
Function TOfficeObj(n); Function TOfficeObj(n);
Begin Begin
@ -1257,7 +1257,6 @@ type TShapeFormat=class(NodeInfo)
Function AddText(text); Function AddText(text);
Begin Begin
o := new TaP(self, "a:p"); o := new TaP(self, "a:p");
o.R.T := text;
o.R.Rpr.Lang := "en-US"; o.R.Rpr.Lang := "en-US";
o.R.Rpr.AltLang := "zh-CN"; o.R.Rpr.AltLang := "zh-CN";
o.R.Rpr.SZ := 2400; o.R.Rpr.SZ := 2400;
@ -4192,12 +4191,6 @@ type TMargins=class(NodeInfo)
Function Init(); Function Init();
Begin Begin
left := 0.75;
right := 0.75;
top := 0.75;
bottom := 0.75;
header := 0.5;
footer := 0.5;
//TODO... //TODO...
End; End;
@ -4206,10 +4199,88 @@ type TMargins=class(NodeInfo)
RootObj := node; RootObj := node;
End; End;
Property Left read readXMLLeft write writeXMLLeft;
Function readXMLLeft();
Begin
tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Left'));
if not ifNil(tmpVal) then return tmpVal;
return class(TSXml).Utf8ToCurCodePage(XMLLeft);
End;
Function writeXMLLeft(str);
Begin
XMLLeft := class(TSXml).CurCodePageToUtf8(str);
End;
Property Right read readXMLRight write writeXMLRight;
Function readXMLRight();
Begin
tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Right'));
if not ifNil(tmpVal) then return tmpVal;
return class(TSXml).Utf8ToCurCodePage(XMLRight);
End;
Function writeXMLRight(str);
Begin
XMLRight := class(TSXml).CurCodePageToUtf8(str);
End;
Property Top read readXMLTop write writeXMLTop;
Function readXMLTop();
Begin
tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Top'));
if not ifNil(tmpVal) then return tmpVal;
return class(TSXml).Utf8ToCurCodePage(XMLTop);
End;
Function writeXMLTop(str);
Begin
XMLTop := class(TSXml).CurCodePageToUtf8(str);
End;
Property Bottom read readXMLBottom write writeXMLBottom;
Function readXMLBottom();
Begin
tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Bottom'));
if not ifNil(tmpVal) then return tmpVal;
return class(TSXml).Utf8ToCurCodePage(XMLBottom);
End;
Function writeXMLBottom(str);
Begin
XMLBottom := class(TSXml).CurCodePageToUtf8(str);
End;
Property Header read readXMLHeader write writeXMLHeader;
Function readXMLHeader();
Begin
tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Header'));
if not ifNil(tmpVal) then return tmpVal;
return class(TSXml).Utf8ToCurCodePage(XMLHeader);
End;
Function writeXMLHeader(str);
Begin
XMLHeader := class(TSXml).CurCodePageToUtf8(str);
End;
Property Footer read readXMLFooter write writeXMLFooter;
Function readXMLFooter();
Begin
tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Footer'));
if not ifNil(tmpVal) then return tmpVal;
return class(TSXml).Utf8ToCurCodePage(XMLFooter);
End;
Function writeXMLFooter(str);
Begin
XMLFooter := class(TSXml).CurCodePageToUtf8(str);
End;
Function GetAttrs(); override; Function GetAttrs(); override;
Begin Begin
HandleAttrs(); HandleAttrs();
return array(("Left", "left", Left, ""),("Right", "right", Right, ""),("Top", "top", Top, ""),("Bottom", "bottom", Bottom, ""),("Header", "header", Header, ""),("Footer", "footer", Footer, "")) union ExtAttr; return array(("Left", "left", XMLLeft, ""),("Right", "right", XMLRight, ""),("Top", "top", XMLTop, ""),("Bottom", "bottom", XMLBottom, ""),("Header", "header", XMLHeader, ""),("Footer", "footer", XMLFooter, "")) union ExtAttr;
End; End;
Function GetChildren(); override; Function GetChildren(); override;
@ -4219,12 +4290,12 @@ type TMargins=class(NodeInfo)
End; End;
//Attributes //Attributes
Left; XMLLeft;
Right; XMLRight;
Top; XMLTop;
Bottom; XMLBottom;
Header; XMLHeader;
Footer; XMLFooter;
//Nodes //Nodes
End; End;
@ -14486,4 +14557,3 @@ private
End End

View File

@ -1,4 +1,4 @@
// Version 1.2.0 // Version 1.2.1
Type TSDocxFile = Class Type TSDocxFile = Class
///Version: V1.0 2022-09-20 ///Version: V1.0 2022-09-20

View File

@ -1,4 +1,4 @@
// Version 1.2.0 // Version 1.2.1
Type TSExcelFile = Class Type TSExcelFile = Class
///Version: V1.0 2022-08-08 ///Version: V1.0 2022-08-08
@ -620,8 +620,7 @@ Type TSExcelFile = Class
///margins: TMargins 对象 ///margins: TMargins 对象
Function SetPageMargins(sheet, margins); Function SetPageMargins(sheet, margins);
Begin Begin
o := getOj(sheet, 'xlsxMargins'); return workbook_.SetPageMargins(class(TSXml).CurCodePageToUtf8(sheet), margins);
if ifObj(o) then o.SetPageMargins(margins);
End; End;
///获取工作表页边距 ///获取工作表页边距
@ -629,9 +628,7 @@ Type TSExcelFile = Class
///返回: TMargins对象 ///返回: TMargins对象
Function GetPageMargins(sheet); Function GetPageMargins(sheet);
Begin Begin
o := getOj(sheet, 'xlsxMargins'); return workbook_.GetPageMargins(class(TSXml).CurCodePageToUtf8(sheet));
if ifObj(o) then return o.GetPageMargins();
return "sheet error";
End; End;
///合并单元格 ///合并单元格
@ -928,8 +925,6 @@ private
return class(xlsxChart).NewObject(sheetname, self);//不缓存xlsxChart对象 return class(xlsxChart).NewObject(sheetname, self);//不缓存xlsxChart对象
'xlsxHeaderFooter': 'xlsxHeaderFooter':
o := class(xlsxHeaderFooter).NewObject(sheetname, self); o := class(xlsxHeaderFooter).NewObject(sheetname, self);
'xlsxMargins':
o := class(xlsxMargins).NewObject(sheetname, self);
'xlsxSheetView': 'xlsxSheetView':
o := class(xlsxSheetView).NewObject(sheetname, self); o := class(xlsxSheetView).NewObject(sheetname, self);
'xlsxPageLayout': 'xlsxPageLayout':

View File

@ -24,7 +24,7 @@ Type xlsxHyperLink = Class
while ifObj(node) do begin while ifObj(node) do begin
ref := node.GetAttribute('ref'); ref := node.GetAttribute('ref');
if ref = axis then begin if ref = axis then begin
node := hyperlinks.DeleteChild(node); hyperlink_node := node;
break; break;
end; end;
node := node.NextElement(); node := node.NextElement();
@ -48,7 +48,14 @@ Type xlsxHyperLink = Class
End End
hyperlink.RId := 'rId' + inttostr(rid); hyperlink.RId := 'rId' + inttostr(rid);
end end
hyperlinks.InsertEndChild(hyperlink.marshal()); if not ifObj(hyperlink_node) then
begin
hyperlinks.InsertEndChild(hyperlink.marshal());
end
else begin
marshal := hyperlink.Marshal();
class(TSXml).UpdateNode(node, marshal['attributes'], marshal['children']);
end
End; End;
Function GetCellHyperLink(axis); Function GetCellHyperLink(axis);

View File

@ -1,41 +0,0 @@
Type xlsxMargins = Class
Function Create(sheetobj, file, xml); overload;
Begin
sheet_ := sheetobj;
file_ := file;
xmlFile_ := xml;
End;
Function SetPageMargins(margins);
Begin
marshal := margins.Marshal();
work_node := xmlFile_.FirstChild('worksheet');
node := work_node.FirstChild('pageMargins');
if ifObj(node) then work_node.DeleteChild(node);
sheet_node := work_node.FirstChild('sheetData');
phone_node := work_node.FirstChild('phoneticPr');
prev_node := ifObj(phone_node) ? phone_node : sheet_node;
work_node.InsertAfterChild(prev_node, marshal);
End;
Function GetPageMargins();
Begin
node := xmlFile_.FirstChild('worksheet').FirstChild('pageMargins');
margins := TOfficeObj('tmargins');
margins.RootObj := node;
return margins;
End
class Function NewObject(sheetname, file);
Begin
o := file.WorkBook().GetSheetObj(sheetname);
xml := file.WorkBook().GetSheetXmlfile(sheetname);
if not ifObj(o) then return 0;
return new xlsxMargins(o, file, xml);
End;
private
file_; //TSExcelFile对象
sheet_;//XmlSheet对象
xmlFile_; //sheet对应的xml对象
End;

View File

@ -8,28 +8,22 @@ Type xlsxPageLayout = Class
Function SetPageLayout(sheet, pageLayout); Function SetPageLayout(sheet, pageLayout);
Begin Begin
if ifint(pageLayout.FirstPageNumber) then pageLayout.UseFirstPageNumber := True;
marshal := pageLayout.Marshal(); marshal := pageLayout.Marshal();
work_node := xmlFile_.FirstChild('worksheet'); work_node := xmlFile_.FirstChild('worksheet');
node := work_node.FirstChild('pageSetUp'); node := work_node.FirstChild('pageSetup');
if ifObj(node) then work_node.DeleteChild(node); if not ifObj(node) then
arr := array('sheetData', 'mergeCells', 'phoneticPr', 'pageMargins');
for i:=length(arr)-1 to 0 do
begin begin
node := work_node.FirstChild(arr[i]); prev_node := class(TSXml).GetWorkSheetPrevNode(work_node, 'pageSetup');
if ifObj(node) then node := work_node.InsertAfterChild(prev_node, marshal);
begin end
work_node.InsertAfterChild(node, marshal); else begin
flag := 1; class(TSXml).UpdateNode(node, marshal['attributes'], marshal['children']);
end
end end
if not flag then
work_node.InsertEndChild(marshal);
End; End;
Function GetPageLayout(); Function GetPageLayout();
Begin Begin
node := xmlFile_.FirstChild('worksheet').FirstChild('pageSetUp'); node := xmlFile_.FirstChild('worksheet').FirstChild('pageSetup');
page_layout := TOfficeObj('TPageLayout'); page_layout := TOfficeObj('TPageLayout');
page_layout.RootObj := node; page_layout.RootObj := node;
return page_layout; return page_layout;

View File

@ -15,11 +15,6 @@ Type xlsxSheetView = Class
id := sheet_view_node.GetAttribute('workbookViewId'); id := sheet_view_node.GetAttribute('workbookViewId');
if trystrtoint(id, r) and r = windowsIndex then if trystrtoint(id, r) and r = windowsIndex then
Begin Begin
attributes := sheet_view_node.Attributes();
sheetView.TabSelected := attributes['tabselected'];
sheetView.WorkbookViewId := attributes['workbookViewId'];
sheetView.ZoomScaleNormal := ZoomScale;
for k, v in attributes do sheet_view_node.DeleteAttribute(k);
marshal := SheetView.Marshal(); marshal := SheetView.Marshal();
class(TSXml).UpdateNode(sheet_view_node, marshal['attributes'], array()); class(TSXml).UpdateNode(sheet_view_node, marshal['attributes'], array());
return ''; return '';

View File

@ -1298,8 +1298,8 @@ Type xlsxWorkBook = Class
style_xml := GetXmlFileObj('xl/styles.xml'); style_xml := GetXmlFileObj('xl/styles.xml');
fonts_node := style_xml.FirstChildElement('styleSheet').FirstChildElement('fonts'); fonts_node := style_xml.FirstChildElement('styleSheet').FirstChildElement('fonts');
first_node := fonts_node.FirstChildElement('font'); first_node := fonts_node.FirstChildElement('font');
fonts_node.DeleteChild(first_node); marshal := font.Marshal();
fonts_node.InsertFirstChild(font.Marshal()); class(TSXml).UpdateNode(first_node, marshal['attributes'], marshal['children']);
End; End;
Function GetDefaultFont(); Function GetDefaultFont();
@ -1317,10 +1317,8 @@ Type xlsxWorkBook = Class
workbook_xml := GetXmlFileObj('xl/workbook.xml'); workbook_xml := GetXmlFileObj('xl/workbook.xml');
workbook_node := workbook_xml.FirstChildElement('workbook'); workbook_node := workbook_xml.FirstChildElement('workbook');
calc_node := workbook_node.FirstChildElement('calcPr'); calc_node := workbook_node.FirstChildElement('calcPr');
sheet_node := workbook_node.FirstChildElement('sheets'); marshal := calcPr.Marshal();
if ifObj(calc_node) then workbook_node.DeleteChild(calc_node); class(TSXml).UpdateNode(calc_node, marshal['attributes'], marshal['children']);
calcPr.calcId := "191029";
workbook_node.InsertAfterChild(sheet_node, calcPr.Marshal());
End; End;
Function GetCalcOptions(); Function GetCalcOptions();
@ -1332,6 +1330,29 @@ Type xlsxWorkBook = Class
return calcPr; return calcPr;
End; End;
Function SetPageMargins(sheet, margins);
Begin
sheet_xml := GetSheetXmlFile(sheet);
work_node := sheet_xml.FirstChild('worksheet');
node := work_node.FirstChild('pageMargins');
if not ifObj(node) then
begin
prev_node := class(TSXml).GetWorkSheetPrevNode(work_node, 'pageMargins');
node := work_node.InsertAfterChild(prev_node, 'element', 'pageMargins');
end
marshal := margins.Marshal();
class(TSXml).UpdateNode(node, marshal['attributes'], marshal['children']);
End;
Function GetPageMargins(sheet);
Begin
sheet_xml := GetSheetXmlFile(sheet);
node := sheet_xml.FirstChild('worksheet').FirstChild('pageMargins');
margins := TOfficeObj('tmargins');
margins.RootObj := node;
return margins;
End
private private
Function generateRow(c1, c2, r); Function generateRow(c1, c2, r);
Begin Begin

View File

@ -1,5 +1,13 @@
# 更新日志 # 更新日志
## 2023-2-24
### V1.2.1
#### excel
1. Get相关方法重新Set后不再覆盖原有设置影响方法如下`Set(Get)PageMargins`,`Set(Get)CellHyperLink`,`Set(Get)PageLayout`,`Set(Get)CalcOptions`,`Set(Get)DefaultFont`,`Set(Get)SheetViewOptions`
## 2023-2-23 ## 2023-2-23
### V1.2.0 ### V1.2.0