diff --git a/Demo/ExcelHelp.tsl b/Demo/ExcelHelp.tsl index 8c043d6..b1c74cd 100644 --- a/Demo/ExcelHelp.tsl +++ b/Demo/ExcelHelp.tsl @@ -525,6 +525,7 @@ style.Protection.Lock := 1; ('attrName': 'Vertical', 'type': 'string', 'desc': '垂直对齐', 'value': array('nil(默认): 靠下', '"center": 居中', '"top": 靠上', '"justify": 两端对齐', 'distributed: 分散对齐')), ('attrName': 'WrapText', 'type': 'boolean', 'desc': '是否自动换行,默认FALSE', 'value': array()), ('attrName': 'ReadingOrder', 'type': 'int', 'desc': '文字方向', 'value': array('nil(默认): 根据内容', '1: 总是从左到右', '2: 总是从右到左')), + ('attrName': 'TextRotation', 'type': 'int', 'desc': '文本方向', 'value': array('[-90:90]')), ), 'Demo': '', ), @@ -742,8 +743,19 @@ style.Protection.Lock := 1; 'AttrInfo': ( ('attrName': 'ShowGridLines', 'type': 'bool', 'desc': '网格线', 'value': array()), ('attrName': 'ShowRowColHeaders', 'type': 'bool', 'desc': '标题', 'value': array()), - ('attrName': 'View', 'type': 'string', 'desc': '工作簿视图', 'value': array('"pageBreakPreview": 分页预览')), - ('attrName': 'ZoomScale', 'type': 'bool', 'desc': '缩放比例(%)', 'value': array()), + ('attrName': 'View', 'type': 'bool', 'desc': '工作簿视图', 'value': array('"pageBreakPreview": 分页预览')), + ('attrName': 'ZoomScale', 'type': 'string', 'desc': '缩放比例(%)', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TPane', + 'Desc': ('TPane有以下属性: '), + 'AttrInfo': ( + ('attrName': 'XSplit', 'type': 'int', 'desc': '按列分割', 'value': array()), + ('attrName': 'YSplit', 'type': 'int', 'desc': '按行分割', 'value': array()), + ('attrName': 'ActivePane', 'type': 'string', 'desc': '激活窗格', 'value': array('"bottomRight": 都设置{XSplit}和{YSplit}时为该值', '"topRight": 仅设置{XSplit}时', '"bottomLeft": 仅设置{YSplit}时')), + ('attrName': 'State', 'type': 'string', 'desc': '冻结窗口', 'value': array('"frozen"')), + ('attrName': 'TopLeftCell', 'type': 'string', 'desc': '顶部单元格,根据{ActivePane}的值设定', 'value': array('"frozen"')), ), 'Demo': '', ), diff --git a/Demo/excel_demo.tsl b/Demo/excel_demo.tsl index 1197493..24780b8 100644 --- a/Demo/excel_demo.tsl +++ b/Demo/excel_demo.tsl @@ -242,6 +242,7 @@ style.Alignment.Horizontal := "center"; style.Alignment.Vertical := "justify"; style.Alignment.WrapText := True; style.Alignment.ReadingOrder := 2; +style.Alignment.TextRotation := 45; style.Border.Left.LineStyle := "thin"; style.Border.Left.Color := "A020F0"; style.Border.Right.LineStyle := "thin"; @@ -357,6 +358,16 @@ println("[success] SetSheetViewOptions"); view := excel.GetSheetViewOptions(sheetName, 0); println("[success] GetSheetViewOptions ShowGridLines = {}, ShowRowColHeaders = {}, View = {}, ZoomScale = {}", view.ShowGridLines, view.ShowRowColHeaders, view.ZoomScale, view.View); +// SetPane +Pane := TOfficeObj('TPane'); +Pane.XSplit := 6; +Pane.YSplit := 14; +Pane.ActivePane := 'bottomRight'; +Pane.TopLeftCell := excel.CoordinatesToCellName(Pane.XSplit + 1, Pane.YSplit + 1)[1]; +Pane.State := 'frozen'; +excel.SetPane(sheetName, 0, Pane); +println("[success] SetPane"); + // SetPageLayout pageLayout := TOfficeObj('TPageLayout'); pageLayout.FitToWidth := 10; diff --git a/Demo/wordHelp.tsl b/Demo/wordHelp.tsl index ef8393c..d8b549e 100644 --- a/Demo/wordHelp.tsl +++ b/Demo/wordHelp.tsl @@ -203,8 +203,9 @@ Begin ///TTable对象 _AddTitle(docx, 'TTable对象属性', 2); //第二级标题 tbl := new TOfficeObj('TTable'); - _LoadObjectAttributes(tbl.Format, attrs, '表格属性', 'Format'); - _LoadObjectAttributes(tbl.FormatEx, attrs, '表格扩展属性', 'FormatEx'); + attrs := array(('类别':'单元格属性', '接口':'Paragraph', '说明':'TParagrap对象:设置单元格段落格式、字体格式')); + _LoadObjectAttributes(tbl.Format, attrs, '表格样式', 'Format'); + _LoadObjectAttributes(tbl.FormatEx, attrs, '浮动表设置', 'FormatEx'); _AddClassHelpTable(docx, attrs);//添加表格:TTable属性 ///TTable方法 diff --git a/DocxFile使用帮助.docx b/DocxFile使用帮助.docx index 433d148..fe1435e 100644 Binary files a/DocxFile使用帮助.docx and b/DocxFile使用帮助.docx differ diff --git a/ExcelFile使用帮助.xlsx b/ExcelFile使用帮助.xlsx index 341a55b..7a6f227 100644 Binary files a/ExcelFile使用帮助.xlsx and b/ExcelFile使用帮助.xlsx differ diff --git a/funcext/TSOffice/TOfficeObj.tsf b/funcext/TSOffice/TOfficeObj.tsf index 54652c6..dafca2e 100644 --- a/funcext/TSOffice/TOfficeObj.tsf +++ b/funcext/TSOffice/TOfficeObj.tsf @@ -1,4 +1,4 @@ -// Version 1.1.1 +// Version 1.1.2 Function TOfficeObj(n); Begin @@ -145,6 +145,10 @@ Begin return new THyperLink(); "tsheetview": return new TSheetView(); + "tpane": + return new TPane(); + "tselection": + return new TSelection(); "tpagelayout": return new TPageLayout(); "tappproperty": @@ -3799,7 +3803,7 @@ type TAlignment=class(NodeInfo) Function GetAttrs(); override; Begin HandleAttrs(); - return array(("Horizontal", "horizontal", Horizontal, ""),("Vertical", "vertical", Vertical, ""),("WrapText", "wrapText", WrapText, ""),("ReadingOrder", "readingOrder", ReadingOrder, "")) union ExtAttr; + return array(("Horizontal", "horizontal", Horizontal, ""),("Vertical", "vertical", Vertical, ""),("WrapText", "wrapText", WrapText, ""),("ReadingOrder", "readingOrder", ReadingOrder, ""),("TextRotation", "textRotation", TextRotation, "")) union ExtAttr; End; Function GetChildren(); override; @@ -3813,6 +3817,7 @@ type TAlignment=class(NodeInfo) Vertical; WrapText; ReadingOrder; + TextRotation; //Nodes End; @@ -4340,6 +4345,202 @@ type TSheetView=class(NodeInfo) //Nodes End; +/////////////////////////////////////////////////////////////// +/// TPane +/////////////////////////////////////////////////////////////// +type TPane=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pane'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function InitRootNode(node); + Begin + RootObj := node; + End; + + Property XSplit read readXMLXSplit write writeXMLXSplit; + Function readXMLXSplit(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('XSplit')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLXSplit); + End; + + Function writeXMLXSplit(str); + Begin + XMLXSplit := class(TSXml).CurCodePageToUtf8(str); + End; + + Property YSplit read readXMLYSplit write writeXMLYSplit; + Function readXMLYSplit(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('YSplit')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLYSplit); + End; + + Function writeXMLYSplit(str); + Begin + XMLYSplit := class(TSXml).CurCodePageToUtf8(str); + End; + + Property TopLeftCell read readXMLTopLeftCell write writeXMLTopLeftCell; + Function readXMLTopLeftCell(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('TopLeftCell')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLTopLeftCell); + End; + + Function writeXMLTopLeftCell(str); + Begin + XMLTopLeftCell := class(TSXml).CurCodePageToUtf8(str); + End; + + Property ActivePane read readXMLActivePane write writeXMLActivePane; + Function readXMLActivePane(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('ActivePane')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLActivePane); + End; + + Function writeXMLActivePane(str); + Begin + XMLActivePane := class(TSXml).CurCodePageToUtf8(str); + End; + + Property State read readXMLState write writeXMLState; + Function readXMLState(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('State')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLState); + End; + + Function writeXMLState(str); + Begin + XMLState := class(TSXml).CurCodePageToUtf8(str); + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("XSplit", "xSplit", XMLXSplit, ""),("YSplit", "ySplit", XMLYSplit, ""),("TopLeftCell", "topLeftCell", XMLTopLeftCell, ""),("ActivePane", "activePane", XMLActivePane, ""),("State", "state", XMLState, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + XMLXSplit; + XMLYSplit; + XMLTopLeftCell; + XMLActivePane; + XMLState; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TSelection +/////////////////////////////////////////////////////////////// +type TSelection=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'selection'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function InitRootNode(node); + Begin + RootObj := node; + End; + + Property Pane read readXMLPane write writeXMLPane; + Function readXMLPane(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Pane')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLPane); + End; + + Function writeXMLPane(str); + Begin + XMLPane := class(TSXml).CurCodePageToUtf8(str); + End; + + Property ActiveCell read readXMLActiveCell write writeXMLActiveCell; + Function readXMLActiveCell(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('ActiveCell')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLActiveCell); + End; + + Function writeXMLActiveCell(str); + Begin + XMLActiveCell := class(TSXml).CurCodePageToUtf8(str); + End; + + Property Sqref read readXMLSqref write writeXMLSqref; + Function readXMLSqref(); + Begin + tmpVal := class(TSXml).Utf8ToCurCodePage(Value('Sqref')); + if not ifNil(tmpVal) then return tmpVal; + return class(TSXml).Utf8ToCurCodePage(XMLSqref); + End; + + Function writeXMLSqref(str); + Begin + XMLSqref := class(TSXml).CurCodePageToUtf8(str); + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Pane", "pane", XMLPane, ""),("ActiveCell", "activeCell", XMLActiveCell, ""),("Sqref", "sqref", XMLSqref, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + XMLPane; + XMLActiveCell; + XMLSqref; + + //Nodes +End; + /////////////////////////////////////////////////////////////// /// TPageLayout /////////////////////////////////////////////////////////////// @@ -7195,7 +7396,7 @@ type TcellMerge=class(NodeInfo) Function GetAttrs(); override; Begin HandleAttrs(); - return array(("Author", "w:author", XMLAuthor, ""),("Date", "w:date", Date, ""),("ID", "w:id", ID, ""),("vmerge", "w:vmerge", vmerge, ""),("vmergeOrig", "w:vmergeOrig", vmergeOrig, "")) union ExtAttr; + return array(("Author", "w:author", XMLAuthor, ""),("Date", "w:date", Date, ""),("ID", "w:id", ID, ""),("vmerge", "w:vmerge", vmerge, "垂直合并设置。"),("vmergeOrig", "w:vmergeOrig", vmergeOrig, "")) union ExtAttr; End; Function GetChildren(); override; @@ -7260,23 +7461,23 @@ type TwTcPr=class(NodeInfo) Function GetChildren(); override; Begin HandleChildren(); - return array(("field":"Width","name":"w:tcW","obj":Width,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"Type","name":"w:tcW","obj":Type,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"", "class":"") + return array(("field":"Width","name":"w:tcW","obj":Width,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"表格单元格宽度", "class":"") + ,("field":"Type","name":"w:tcW","obj":Type,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"宽度属性的单位。此属性用于定义表格的各种属性,包括:单元格间距、首选宽度和表格边距。", "class":"") ,("field":"Shading","name":Shading.NodeName,"obj":Shading,"attrEx":"","nodeType":"","attrName":"", "desc":"表头底纹", "class":"TwShading") - ,("field":"cnfStyle","name":"w:cnfStyle","obj":cnfStyle,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"cnfStyle","name":"w:cnfStyle","obj":cnfStyle,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"此表格单元的条件表格样式格式设置属性集。", "class":"") ,("field":"CellMar","name":CellMar.NodeName,"obj":CellMar,"attrEx":"","nodeType":"","attrName":"", "desc":"单元格边距设置", "class":"TTblCellMar") ,("field":"Borders","name":Borders.NodeName,"obj":Borders,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwTblBorders") - ,("field":"gridSpan","name":"w:gridSpan","obj":gridSpan,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"hideMark","name":"w:hideMark","obj":hideMark,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"hmerge","name":"w:hmerge","obj":hmerge,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"noWrap","name":"w:noWrap","obj":noWrap,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"tcFitText","name":"w:tcFitText","obj":tcFitText,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"textDirection","name":"w:textDirection","obj":textDirection,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"gridSpan","name":"w:gridSpan","obj":gridSpan,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"当前表单元格所跨的网格列", "class":"") + ,("field":"hideMark","name":"w:hideMark","obj":hideMark,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"忽略行高度计算中的单元格结尾标记", "class":"") + ,("field":"hmerge","name":"w:hmerge","obj":hmerge,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"水平合并单元格", "class":"") + ,("field":"noWrap","name":"w:noWrap","obj":noWrap,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"不换行单元格内容", "class":"") + ,("field":"tcFitText","name":"w:tcFitText","obj":tcFitText,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"调整单元格内的文本", "class":"") + ,("field":"textDirection","name":"w:textDirection","obj":textDirection,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"表格单元格文本文字方向", "class":"") ,("field":"Del","name":Del.NodeName,"obj":Del,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TOptInfo") ,("field":"Ins","name":Ins.NodeName,"obj":Ins,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TOptInfo") - ,("field":"cellMerge","name":cellMerge.NodeName,"obj":cellMerge,"attrEx":"","nodeType":"","attrName":"", "desc":"单元格属性", "class":"TcellMerge") - ,("field":"vAlign","name":"w:vAlign","obj":vAlign,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"vmerge","name":"w:vmerge","obj":vmerge,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"cellMerge","name":cellMerge.NodeName,"obj":cellMerge,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TcellMerge") + ,("field":"vAlign","name":"w:vAlign","obj":vAlign,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"表格单元格垂直对齐", "class":"") + ,("field":"vmerge","name":"w:vmerge","obj":vmerge,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"垂直合并单元格", "class":"") ) union ExtNodes; End; @@ -7388,15 +7589,15 @@ type TwTrPr=class(NodeInfo) Function GetChildren(); override; Begin HandleChildren(); - return array(("field":"Height","name":"w:trHeight","obj":Height,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"Rule","name":"w:trHeight","obj":Rule,"attrEx":"w:hRule","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"Alignment","name":"w:jc","obj":Alignment,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"CantSplit","name":"w:cantSplit","obj":CantSplit,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"cnfStyle","name":"w:cnfStyle","obj":cnfStyle,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"gridAfter","name":"w:gridAfter","obj":gridAfter,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"gridBefore","name":"w:gridBefore","obj":gridBefore,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"hidden","name":"w:hidden","obj":hidden,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"tblHeader","name":"w:tblHeader","obj":tblHeader,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + return array(("field":"Height","name":"w:trHeight","obj":Height,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"行高", "class":"") + ,("field":"Rule","name":"w:trHeight","obj":Rule,"attrEx":"w:hRule","nodeType":"","attrName":"", "desc":"如果Rule的值为自动,则应根据其内容的高度自动确定表行的高度,忽略Height值;如果Rule的值至少为least,则表行的高度应至少为Height属性的值;如果Rule的值是精确的,那么表行的高度应该正好是Height属性的值。", "class":"") + ,("field":"Alignment","name":"w:jc","obj":Alignment,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"对齐方式(left、right、center)", "class":"") + ,("field":"CantSplit","name":"w:cantSplit","obj":CantSplit,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"表行不能跨页分隔", "class":"") + ,("field":"cnfStyle","name":"w:cnfStyle","obj":cnfStyle,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"表行条件格式", "class":"") + ,("field":"gridAfter","name":"w:gridAfter","obj":gridAfter,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"最后一个单元格后的网格列", "class":"") + ,("field":"gridBefore","name":"w:gridBefore","obj":gridBefore,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"第一个单元格之前的网格列", "class":"") + ,("field":"hidden","name":"w:hidden","obj":hidden,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"隐藏表行标记", "class":"") + ,("field":"tblHeader","name":"w:tblHeader","obj":tblHeader,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"在每个新页面上重复表行", "class":"") ,("field":"Del","name":Del.NodeName,"obj":Del,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TOptInfo") ) union ExtNodes; End; @@ -7811,7 +8012,7 @@ type TwTblpPr=class(NodeInfo) Function GetAttrs(); override; Begin HandleAttrs(); - return array(("bottomFromText", "w:bottomFromText ", bottomFromText, ""),("horizAnchor", "w:horizAnchor", horizAnchor, ""),("leftFromText", "w:leftFromText", leftFromText, ""),("rightFromText", "w:rightFromText", rightFromText, ""),("tblpX", "w:tblpX", tblpX, ""),("tblpXSpec", "w:tblpXSpec", tblpXSpec, ""),("tblpY", "w:tblpY", tblpY, ""),("tblpYSpec", "w:tblpYSpec", tblpYSpec, ""),("topFromText", "w:topFromText", topFromText, ""),("vertAnchor", "w:vertAnchor", vertAnchor, "")) union ExtAttr; + return array(("bottomFromText", "w:bottomFromText ", bottomFromText, "指定当前浮动表与该浮动表下方段落中文本顶部之间应保持的最小距离。"),("horizAnchor", "w:horizAnchor", horizAnchor, "指定水平定位的基础对象。"),("leftFromText", "w:leftFromText", leftFromText, "指定当前浮动表与该浮动表左侧段落中文本边缘之间应保持的最小距离。"),("rightFromText", "w:rightFromText", rightFromText, "指定当前浮动表与该浮动表右侧段落中文本边缘之间应保持的最小距离。"),("tblpX", "w:tblpX", tblpX, "指定浮动表的绝对水平位置。此绝对位置是相对于horzAnchor属性为此浮动表指定的水平定位点指定的。"),("tblpXSpec", "w:tblpXSpec", tblpXSpec, "指定浮动表的相对水平位置。此相对位置是相对于此浮动表的horizAnchor属性指定的水平定位点指定的。"),("tblpY", "w:tblpY", tblpY, "指定浮动表的绝对垂直位置。此绝对位置是相对于此浮动表的vertAnchor属性指定的垂直锚点指定的。"),("tblpYSpec", "w:tblpYSpec", tblpYSpec, "指定浮动表的相对垂直位置。此相对位置是相对于此浮动表的vertAnchor属性指定的垂直锚点指定的。"),("topFromText", "w:topFromText", topFromText, "指定当前浮动表与该浮动表上方段落中文本底部边缘之间应保持的最小距离。"),("vertAnchor", "w:vertAnchor", vertAnchor, "指定应根据其计算tblpY属性中的垂直定位的基础对象。")) union ExtAttr; End; Function GetChildren(); override; @@ -7877,26 +8078,26 @@ type TwTblPr=class(NodeInfo) Function GetChildren(); override; Begin HandleChildren(); - return array(("field":"StyleID","name":"w:tblStyle","obj":StyleID,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"Width","name":"w:tblW","obj":Width,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"WidthType","name":"w:tblW","obj":WidthType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"Val","name":"w:tblLook","obj":Val,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"NoVBand","name":"w:tblLook","obj":NoVBand,"attrEx":"w:noVBand","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"NoHBand","name":"w:tblLook","obj":NoHBand,"attrEx":"w:noHBand","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"LastRow","name":"w:tblLook","obj":LastRow,"attrEx":"w:lastRow","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"LastColumn","name":"w:tblLook","obj":LastColumn,"attrEx":"w:lastColumn","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"FirstRow","name":"w:tblLook","obj":FirstRow,"attrEx":"w:firstRow","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"FirstColumn","name":"w:tblLook","obj":FirstColumn,"attrEx":"w:firstColumn","nodeType":"","attrName":"", "desc":"", "class":"") + return array(("field":"StyleID","name":"w:tblStyle","obj":StyleID,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"样式ID", "class":"") + ,("field":"Width","name":"w:tblW","obj":Width,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"表格宽度", "class":"") + ,("field":"WidthType","name":"w:tblW","obj":WidthType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"宽度属性的单位。此属性用于定义表格的各种属性,包括:单元格间距、首选宽度和表格边距。", "class":"") + ,("field":"Val","name":"w:tblLook","obj":Val,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"表格条件格式样式:表格样式最多可以指定六种不同的可选条件格式,如首行、尾行、首列、尾列等(16进制short)", "class":"") + ,("field":"NoVBand","name":"w:tblLook","obj":NoVBand,"attrEx":"w:noVBand","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"NoHBand","name":"w:tblLook","obj":NoHBand,"attrEx":"w:noHBand","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"LastRow","name":"w:tblLook","obj":LastRow,"attrEx":"w:lastRow","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"LastColumn","name":"w:tblLook","obj":LastColumn,"attrEx":"w:lastColumn","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"FirstRow","name":"w:tblLook","obj":FirstRow,"attrEx":"w:firstRow","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"FirstColumn","name":"w:tblLook","obj":FirstColumn,"attrEx":"w:firstColumn","nodeType":"","attrName":"", "desc":"disable", "class":"") ,("field":"Shading","name":Shading.NodeName,"obj":Shading,"attrEx":"","nodeType":"","attrName":"", "desc":"表头底纹", "class":"TwShading") - ,("field":"bidiVisual","name":"w:bidiVisual","obj":bidiVisual,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"Alignment","name":"w:jc","obj":Alignment,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"Indent","name":"w:tblInd","obj":Indent,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"IndentType","name":"w:tblInd","obj":IndentType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"bidiVisual","name":"w:bidiVisual","obj":bidiVisual,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"从右到左可视化表格", "class":"") + ,("field":"Alignment","name":"w:jc","obj":Alignment,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"当前文本边距的对齐方式(left、right、center)", "class":"") + ,("field":"Indent","name":"w:tblInd","obj":Indent,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"文档中当前表格前缘之前的缩进(从左到右表格中的左边缘,从右到左表格中的右边缘)。", "class":"") + ,("field":"IndentType","name":"w:tblInd","obj":IndentType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"约定Indent值的的单位,如果忽略此属性,则其值应假定为dxa(二十分之一点)。", "class":"") ,("field":"Borders","name":Borders.NodeName,"obj":Borders,"attrEx":"","nodeType":"","attrName":"", "desc":"表格边框属性", "class":"TwTblBorders") - ,("field":"Autofit","name":"w:tblLayout","obj":Autofit,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Autofit","name":"w:tblLayout","obj":Autofit,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"布局该表内容的算法。当表格显示在文档中时,可以使用固定宽度或自动调整布局算法来显示表格。如果省略了该元素,则该元素的值应假定为自动。", "class":"") ,("field":"CellMar","name":CellMar.NodeName,"obj":CellMar,"attrEx":"","nodeType":"","attrName":"", "desc":"单元格边距设置", "class":"TTblCellMar") - ,("field":"Overlap","name":"w:tblOverlap ","obj":Overlap,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") - ,("field":"tblpPr","name":tblpPr.NodeName,"obj":tblpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"表格样式", "class":"TwTblpPr") + ,("field":"Overlap","name":"w:tblOverlap ","obj":Overlap,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"当前表是否允许其他浮动表重叠其范围。如果指定,则不应进行任何调整,以防止其属性通常会导致其重叠的表格在显示时重叠。如果关闭,则应根据需要调整表格,以防止它们在显示时重叠,方法是根据需要调整浮动表格属性。", "class":"") + ,("field":"tblpPr","name":tblpPr.NodeName,"obj":tblpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"浮动表设置", "class":"TwTblpPr") ) union ExtNodes; End; @@ -8316,7 +8517,7 @@ type TtblStylePr=class(NodeInfo) return array(("field":"pPr","name":pPr.NodeName,"obj":pPr,"attrEx":"","nodeType":"","attrName":"", "desc":"段落格式", "class":"TwpPr") ,("field":"rPr","name":rPr.NodeName,"obj":rPr,"attrEx":"","nodeType":"","attrName":"", "desc":"字体属性", "class":"TwrPr") ,("field":"TrPr","name":TrPr.NodeName,"obj":TrPr,"attrEx":"","nodeType":"","attrName":"", "desc":"表格行属性", "class":"TwTrPr") - ,("field":"TblPr","name":TblPr.NodeName,"obj":TblPr,"attrEx":"","nodeType":"","attrName":"", "desc":"表格属性", "class":"TwTblPr") + ,("field":"TblPr","name":TblPr.NodeName,"obj":TblPr,"attrEx":"","nodeType":"","attrName":"", "desc":"表格样式", "class":"TwTblPr") ,("field":"TcPr","name":TcPr.NodeName,"obj":TcPr,"attrEx":"","nodeType":"","attrName":"", "desc":"单元格属性", "class":"TwTcPr") ) union ExtNodes; End; @@ -11948,13 +12149,16 @@ Type TDocumentBody = Class(DocObject) borders := ifObj(tblBorders) ? tblBorders.Marshal() : nil; cellmar := ifObj(tblCellMar) ? tblCellMar.Marshal() : nil; End; - defaultParagraph := new TParagraph(); - defaultParagraph.pPr.rPr.Lang := 'en-US'; - defaultParagraph.pPr.rPr.eastAsia := 'zh-CN'; - defaultParagraph.Run.rPr.Lang := 'en-US'; - defaultParagraph.Run.rPr.eastAsia := 'zh-CN'; + defaultParagraph := tbl.Paragraph; + if not ifObj(defaultParagraph) then Begin + defaultParagraph := new TParagraph(); + defaultParagraph.pPr.rPr.Lang := 'en-US'; + defaultParagraph.pPr.rPr.eastAsia := 'zh-CN'; + defaultParagraph.Run.rPr.Lang := 'en-US'; + defaultParagraph.Run.rPr.eastAsia := 'zh-CN'; + End; defaultpPr := defaultParagraph.pPr.Marshal(); - defaultrPr := defaultParagraph.Run.rPr.Marshal(); + defaultrPr := defaultParagraph.pPr.rPr.Marshal(); for i:=0 to length(tbl.Data_)-1 do Begin trNode := tbl.node_.InsertEndChild('element', 'w:tr'); @@ -12656,7 +12860,7 @@ Type TDocumentBody = Class(DocObject) Begin if not ifObj(lastParagraph_) then lastParagraph_ := node; - else if (ifInt(posOpt) and posOpt = -1) then + else if ifInt(posOpt) and posOpt = -1 then lastParagraph_ := node; else if ifObj(posOpt) then Begin posNode := posOpt; @@ -13184,6 +13388,14 @@ Type TTable = Class(DocObject, TTableImpl) return TblPr; End; + Property Paragraph read readParagraph; + Function readParagraph(); + Begin + if not ifObj(paragraph_) then + paragraph_ := new TParagraph(); + return paragraph_; + End; + Property FormatEx read readFormatEx; Function readFormatEx(); Begin @@ -13395,6 +13607,7 @@ Type TTable = Class(DocObject, TTableImpl) Data_; colCount_; colWidth_; + paragraph_;//缺省单元格段落格式、字体格式 End; Type TCoreProperties = Class(DocObject) @@ -13962,3 +14175,4 @@ private middlePosition; End + diff --git a/funcext/TSOffice/TSDocxFile.tsf b/funcext/TSOffice/TSDocxFile.tsf index f872d91..f0384f3 100644 --- a/funcext/TSOffice/TSDocxFile.tsf +++ b/funcext/TSOffice/TSDocxFile.tsf @@ -1,4 +1,4 @@ -// Version 1.1.1 +// Version 1.1.2 Type TSDocxFile = Class ///Version: V1.0 2022-09-20 diff --git a/funcext/TSOffice/TSExcelFile.tsf b/funcext/TSOffice/TSExcelFile.tsf index 693e859..fbc4181 100644 --- a/funcext/TSOffice/TSExcelFile.tsf +++ b/funcext/TSOffice/TSExcelFile.tsf @@ -1,4 +1,4 @@ -// Version 1.1.1 +// Version 1.1.2 Type TSExcelFile = Class ///Version: V1.0 2022-08-08 @@ -613,23 +613,41 @@ Type TSExcelFile = Class return workbook_.UnMergeCell(class(TSXml).CurCodePageToUtf8(sheet), hcell, vcell); End; - ///设置工作表视图属性 + ///新建窗口 + ///返回:windowsIndex int, 窗口索引 + Function NewSheetPane(); + Begin + return workbook_.NewSheetView(); + End; + + ///设置窗格 ///sheet: string,工作表名称 - ///viewindex: int,视图索引,viewIndex,从0开始 - ///sheet: object,TSheetView对象 - Function SetSheetViewOptions(sheet, viewIndex, sheetView); + ///windowsIndex: int,窗口索引,从0开始 + ///Pane: TPane对象 + Function SetPane(sheet, windowsIndex, Pane); Begin o := getOj(sheet, 'xlsxSheetView'); - if ifObj(o) then return o.SetSheetViewOptions(viewIndex, sheetView); + if ifObj(o) then return o.SetPane(windowsIndex, Pane); + End; + + ///设置工作表视图属性 + ///sheet: string,工作表名称 + ///windowsIndex: int,窗口索引,从0开始 + ///sheet: object,TSheetView对象 + Function SetSheetViewOptions(sheet, windowsIndex, sheetView); + Begin + o := getOj(sheet, 'xlsxSheetView'); + if ifObj(o) then return o.SetSheetViewOptions(windowsIndex, sheetView); End; ///获取工作表视图属性 ///sheet: string,工作表名称 + ///windowsIndex: int,窗口索引,从0开始 ///返回: object, TSheetView对象 - Function GetSheetViewOptions(sheet, viewIndex); + Function GetSheetViewOptions(sheet, windowsIndex); Begin o := getOj(sheet, 'xlsxSheetView'); - if ifObj(o) then return o.GetSheetViewOptions(viewIndex); + if ifObj(o) then return o.GetSheetViewOptions(windowsIndex); End; // TODO printerSettings1.bin? @@ -652,6 +670,7 @@ Type TSExcelFile = Class return "error sheet"; End; + ///设置默认工作表 ///sheet: string,工作表名称 Function SetDefaultSheet(sheet); Begin diff --git a/funcext/TSOffice/worksheet/xlsxSheetView.tsf b/funcext/TSOffice/worksheet/xlsxSheetView.tsf index 0cd41ca..8d076fb 100644 --- a/funcext/TSOffice/worksheet/xlsxSheetView.tsf +++ b/funcext/TSOffice/worksheet/xlsxSheetView.tsf @@ -6,14 +6,14 @@ Type xlsxSheetView = Class xmlFile_ := xml; End; - Function SetSheetViewOptions(viewIndex, sheetView); + Function SetSheetViewOptions(windowsIndex, sheetView); Begin node := xmlFile_.FirstChild('worksheet').FirstChild('sheetViews'); sheet_view_node := node.FirstChild('sheetView'); while ifObj(sheet_view_node) do Begin id := sheet_view_node.GetAttribute('workbookViewId'); - if trystrtoint(id, r) and r = viewIndex then + if trystrtoint(id, r) and r = windowsIndex then Begin attributes := sheet_view_node.Attributes(); sheetView.TabSelected := attributes['tabselected']; @@ -28,14 +28,14 @@ Type xlsxSheetView = Class End End; - Function GetSheetViewOptions(viewIndex, sheetView); + Function GetSheetViewOptions(windowsIndex, sheetView); Begin node := xmlFile_.FirstChild('worksheet').FirstChild('sheetViews'); sheet_view_node := node.FirstChild('sheetView'); while ifObj(sheet_view_node) do Begin id := sheet_view_node.GetAttribute('workbookViewId'); - if trystrtoint(id, r) and r = viewIndex then + if trystrtoint(id, r) and r = windowsIndex then Begin sheetview := TOfficeObj('TSheetView'); sheetview.RootObj := sheet_view_node; @@ -46,6 +46,51 @@ Type xlsxSheetView = Class return nil; End + Function SetPane(windowsIndex, Pane); + Begin + node := xmlFile_.FirstChild('worksheet').FirstChild('sheetViews'); + sheet_view_node := node.FirstChild('sheetView'); + while ifObj(sheet_view_node) do + Begin + id := sheet_view_node.GetAttribute('workbookViewId'); + if trystrtoint(id, r) and r = windowsIndex then + Begin + sheet_view_node.DeleteChildren(); + sheet_view_node.InsertFirstChild(Pane.Marshal()); + if Pane.XSplit and Pane.YSplit then + begin + selection := tofficeobj('TSelection'); + selection.pane := 'topRight'; + selection.activecell := coordinatestocellname(pane.xsplit + 1, 1)[1]; + selection.sqref := selection.activecell; + sheet_view_node.InsertEndChild(selection.Marshal()); + selection.Pane := 'bottomLeft'; + selection.ActiveCell := CoordinatesToCellName(1, Pane.YSplit + 1)[1]; + selection.Sqref := selection.ActiveCell; + sheet_view_node.InsertEndChild(selection.Marshal()); + selection := TOfficeObj('TSelection'); + selection.Pane := 'bottomRight'; + sheet_view_node.InsertEndChild(selection.Marshal()); + end + else if Pane.XSplit then + begin + selection := tofficeobj('TSelection'); + selection.pane := 'topRight'; + selection.activecell := coordinatestocellname(pane.xsplit + 1, 2)[1]; + selection.sqref := selection.activecell; + sheet_view_node.InsertEndChild(selection.Marshal()); + end + else if Pane.YSplit then + begin + selection := tofficeobj('TSelection'); + selection.pane := 'bottomLeft'; + sheet_view_node.InsertEndChild(selection.Marshal()); + end + End + sheet_view_node := sheet_view_node.NextElement(); + End + End; + class Function NewObject(sheetname, file); Begin o := file.WorkBook().GetSheetObj(sheetname); diff --git a/funcext/TSOffice/worksheet/xlsxWorkBook.tsf b/funcext/TSOffice/worksheet/xlsxWorkBook.tsf index 300b579..2edf94c 100644 --- a/funcext/TSOffice/worksheet/xlsxWorkBook.tsf +++ b/funcext/TSOffice/worksheet/xlsxWorkBook.tsf @@ -1104,6 +1104,26 @@ Type xlsxWorkBook = Class return; End; + Function NewSheetPane(); + Begin + workbook := GetXmlFileObj('xl/workbook.xml'); + book_view_node := workbook.FirstChildElement('workbook').FirstChildElement('bookViews'); + workbook_node := book_view_node.FirstChildElement('workbookView'); + book_view_node.InsertEndChild(workbook_node.Marshal()[0]); + for i:=0 to length(sheetnames_)-1 do + begin + name := sheetNames_[i]['name']; + xml_file := GetXmlFileObj(sheetNames_[i]['file']); + sheet_node := xml_file.FirstChildElement('worksheet').FirstChildElement('sheetViews'); + sheet_view := sheet_node.LastChildElement('sheetView'); + view_id := strtoint(sheet_view.GetAttribute('workbookViewId')) + 1; + view_obj := TOfficeObj('TSheetView'); + view_obj.WorkbookViewId := view_id; + sheet_node.InsertEndChild(view_obj.Marshal()); + end + return view_id; + End; + private Function generateRow(c1, c2, r); Begin diff --git a/更新日志.md b/更新日志.md index 54fb568..7ea1ae5 100644 --- a/更新日志.md +++ b/更新日志.md @@ -1,5 +1,20 @@ # 更新日志 +## 2023-1-31 + +### V1.1.2 + +#### word + +1. 完善帮助文档 +2. 修复获取chart图无法获取对应属性值 + +#### excel + +1. 新增`SetPane` +2. 新增`NewSheetView` +3. 单元格样式新增属性“文本方向”: `TAlignment::TextRotation` + ## 2023-1-18 ### V1.1.1