diff --git a/Demo/ExcelHelp.tsl b/Demo/ExcelHelp.tsl new file mode 100644 index 0000000..51f5b56 --- /dev/null +++ b/Demo/ExcelHelp.tsl @@ -0,0 +1,726 @@ +path := ExtractFileDir(ExtractFileDir(PluginPath())); +{$IFNDEF Win32} + path := path + '\\funcext\\TSOffice\\TSExcelFile.tsf'; +{$ELSE} + path := path + '/funcext/TSOffice/TSExcelFile.tsf'; +{$ENDIF} +funcs := LoadClassInfo(path); + +testing := 1; +file := new TSExcelFile(); +[err, errinfo] := file.NewFile(); +if err then + return PrintError("NewFile", err, errinfo); +PrintSuccess("NewFile", testing++); + +[err, errinfo] := file.SetSheetName('Sheet1', 'ExcelFile'); +if err then + return PrintError("SetSheetName", err, errinfo); +PrintSuccess("SetSheetName", testing++); + +[err, errinfo] := file.NewSheet("Functions"); +if err then + return PrintError("NewSheet", err, errinfo); +PrintSuccess("NewSheet", testing++); + +file.SetDefaultSheet('ExcelFile'); + +richtext := TOfficeObj('TRichText'); +txt1 := richtext.AddText('TSExcelFile类 '); +txt1.Font.Size := 35; +txt1.Font.Color := "FF0000"; +txt1.Font.Bold := 1; +txt1.Font.Name := "华文彩云"; +txt2 := richtext.AddText('帮助文档'); +txt2.Font.Size := 30; +txt2.Font.Name := "微软雅黑"; +txt2.Font.Bold := 1; +txt2.Font.Italic := 1; +txt2.Font.Color := "FFC0CB"; + +file.SetCellRichText('ExcelFile', 'A1', richtext); +PrintSuccess("SetCellRichText", testing++); +[err, richText] := file.GetCellRichText('ExcelFile', 'A1'); +if err then + return PrintError("GetCellRichText", err, errinfo); +PrintSuccess("GetCellRichText", testing++); + +file.MergeCell('ExcelFile', 'A1', 'C1'); +PrintSuccess("MergeCell", testing++); + + +style := TOfficeObj('TStyle'); +style.Border.Left.LineStyle := "double"; +style.Border.Left.Color := "FF0000"; +style.Border.Right.LineStyle := "double"; +style.Border.Right.Color := "FF0000"; +style.Border.Bottom.LineStyle := "double"; +style.Border.Bottom.Color := "FF0000"; +style.Border.Top.LineStyle := "double"; +style.Border.Top.Color := "FF0000"; +style.Alignment.Horizontal := "center"; +style.Alignment.Vertical := "center"; +style.Fill.Gradient.Shading := 3; +style.Fill.Gradient.Color1 := "FFFFFF"; +style.Fill.Gradient.Color2 := "E0EBF5"; + +styleId := file.NewStyle(style); +PrintSuccess("NewStyle", testing++); + +file.SetCellStyle("ExcelFile", 'A1', 'C1', styleId); + +file.SetCellValue("ExcelFile", "A3", "索引"); +file.SetCellValue("ExcelFile", "B3", "函数名称"); +file.SetCellValue("ExcelFile", "C3", "功能"); +file.SetColWidth("ExcelFile", "A", "A", 6); +file.SetColWidth("ExcelFile", "B", "B", 55); +file.SetColWidth("ExcelFile", "C", "C", 100); +file.SetCellStyle("ExcelFile", "A3", "C3", styleId); + + +style2 := TOfficeObj("TStyle"); +style2.Font.Color := "A020F0"; +style2.Font.Bold := true; +style2.Font.Size := 12; +style2.Font.Name := "Microsoft YaHei"; +style2.Fill.Pattern.PatternType := "solid"; +style2.Fill.Pattern.ForegroundColor := "EFEFEF"; +style2.Alignment.WrapText := true; +styleId2 := file.NewStyle(style2); + +style3 := TOfficeObj("TStyle"); +style3.Font.Color := "1F7F3B"; +style3.Font.Size := 9; +style3.Font.Name := "Microsoft YaHei"; +style3.Fill.Pattern.PatternType := "solid"; +style3.Fill.Pattern.ForegroundColor := "FFFAFA"; +style3.Alignment.WrapText := true; +styleId3 := file.NewStyle(style3); + +style4 := TOfficeObj("TStyle"); +style4.Font.Color := "A020F0"; +style4.Font.UnderLine := "single"; +styleId4 := file.NewStyle(style4); + +hash := AddTOfficeObj(file); + +row := 1; +for i:=0 to length(funcs)-1 do +Begin + [err0, cell0] := file.CoordinatesToCellName(1, i+4); + [err1, cell1] := file.CoordinatesToCellName(2, i+4); + [err2, cell2] := file.CoordinatesToCellName(3, i+4); + file.SetCellValue("ExcelFile", cell0, i+1); + file.SetCellValue("ExcelFile", cell1, funcs[i]['funcname']); + file.SetCellValue("ExcelFile", cell2, funcs[i]['name']); + + str := funcs[i]['name'] + "\nFunction " + funcs[i]['funcname'] + funcs[i]['comment']; + arr := str2array(str, "\n"); + [err, c1] := file.CoordinatesToCellName(1, row); + [err, c2] := file.CoordinatesToCellName(1, row + length(arr) - 1); + file.SetCellStyle("Functions", c1, c1, styleId2); + file.SetCellStyle("Functions", c1, c2, styleId3); + + for j:=0 to length(arr)-1 do + Begin + [err, c] := file.CoordinatesToCellName(1, row++); + file.SetCellValue("Functions", c, arr[j]); + End + row++; + + hyperlink := TOfficeObj('THyperLink'); + hyperlink.LinkType := "Location"; + hyperlink.LinkUrl := "Functions!" $ c1; + + file.SetCellHyperLink("ExcelFile", cell1, hyperlink); + file.SetCellStyle("ExcelFile", cell1, cell1, styleId4); + +End + +file.SetColWidth('Functions', 'A', 'A', 120); +PrintSuccess('SetColWidth', testing++); + +saveName := utf8toansi("d:\\temp\\ExcelFile使用帮助.xlsx"); +[err, errinfo] := file.SaveAs('', saveName); +if err then + return PrintError("SaveAs", err, errinfo); +PrintSuccess("SaveAs", testing++); + + + +// ============================================================ +Function PrintError(msg, errno, errinfo); +Begin + return println("{} : errorno = {}, errorinfo = {}!", msg, errno, errinfo); +End + +Function PrintSuccess(msg, time); +Begin + println("Test {} [{} success]", time, msg); +End + +Function LoadClassInfo(f); +Begin + t := array(); + [err,fh] := io_open(f); + if err then return t; + [err, data] := io_read(fh); + io_close(fh); + if err then return t; + + lines := str2array(string(data), "\n"); + for i:=0 to length(lines)-1 do begin + line := lines[i]; + if AnsiContainsText(line, 'private') then break; + str := " End;"; + if leftstr(line, length(str)) = str then Begin + //if funcname <> "" and leftstr(funcname,7) <> "Create(" and leftstr(funcname,8) <> "Destory(" then Begin + if flag and funcname <> "" then Begin + n := length(t); + t[n]['funcname'] := funcname; + t[n]['comment'] := comment; + t[n]['name'] := name; + End; + funcname := ""; + comment := ""; + name := ""; + begF := 0; + endF := 1; + flag := 0; + continue; + End; + func := " Function "; + if leftstr(line, length(func)) = func then Begin + funcname := rightstr(line, length(line)-length(func)); + begF := 1; + continue; + End; + if endF=0 or begF then continue; + if ParseRegExpr("\/\/\/(.*)$",line,"",result,MPos,Mlen) and length(result) then Begin + flag := 1; + str := result[0][1]; + if name="" then begin + name := str; + continue; + end; + comment := comment + "\n " + str; + End; + End; + return t; +End; + +Function AddTOfficeObj(excel); +Begin + hash := array(); + sheet_name := "TOfficeObj说明"; + excel.NewSheet(sheet_name); + excel.SetColWidth(sheet_name, 'A', 'A', 32); + excel.SetColWidth(sheet_name, 'B', 'B', 25); + excel.SetColWidth(sheet_name, 'C', 'C', 30); + excel.SetColWidth(sheet_name, 'D', 'D', 35); + + style := TOfficeObj('TStyle'); + style.Alignment.Horizontal := "center"; + style.Alignment.WrapText := True; + style.Font.Name := "Microsoft YaHei"; + style.Font.Color := "E10D4F"; + style.Font.Size := 14; + style.Font.Bold := True; + style.Font.UnderLine := 'singleAccounting'; + style.Fill.Gradient.Shading := 16; + style.Fill.Gradient.Color1 := 'A3ECFB'; + style.Fill.Gradient.Color2 := '626AD8'; + styleid1 := excel.NewStyle(style); + + style := TOfficeObj('TStyle'); + style.Font.Name := "Microsoft YaHei"; + style.Font.ThemeColor := "8"; + style.Font.Size := 10; + style.Font.Bold := True; + style.Alignment.WrapText := True; + style.Fill.Pattern.PatternType := 'lightGrid'; + style.Fill.Pattern.ForegroundThemeColor := 4; + style.Fill.Pattern.ForegroundThemeColorTint := 0.8; + style.Fill.Pattern.BackgroundThemeColor := 9; + style.Fill.Pattern.BackgroundThemeColorTint := 0.8; + styleid2 := excel.NewStyle(style); + + style := TOfficeObj('TStyle'); + style.Font.Name := "Consolas"; + style.Font.ThemeColor := "1"; + style.Font.Size := 10; + style.Alignment.WrapText := True; + style.Alignment.Horizontal := 'left'; + style.Alignment.Vertical := 'center'; + style.Fill.Pattern.PatternType := "solid"; + style.Fill.Pattern.ForegroundThemeColor := 6; + style.Fill.Pattern.ForegroundThemeColorTint := 0.8; + style.Fill.Pattern.BackgroundThemeColor := 0; + styleid3 := excel.NewStyle(style); + + style := TOfficeObj("TStyle"); + style.Font.Color := ""; + style.Font.Size := 9; + style.Font.Name := "Microsoft YaHei"; + style.Fill.Pattern.PatternType := "solid"; + style.Fill.Pattern.ForegroundColor := "FFFAFA"; + style.Alignment.WrapText := true; + style.Border.Left.LineStyle := "dotted"; + style.Border.Right.LineStyle := "dotted"; + style.Border.Top.LineStyle := "dotted"; + style.Border.Bottom.LineStyle := "dotted"; + styleId4 := excel.NewStyle(style); + + style := TOfficeObj("TStyle"); + style.Font.Color := "000000"; + style.Font.Size := 12; + style.Font.Name := "Consolas"; + style.Font.Bold := True; + style.Alignment.WrapText := true; + style.Alignment.Vertical := "top"; + styleId5 := excel.NewStyle(style); + style.Font.Bold := False; + style.Font.Size := 11; + style.Font.Color := "757575"; + styleId6 := excel.NewStyle(style); + + style := TOfficeObj("TStyle"); + style.Font.Size := 11; + style.Font.Name := "Microsoft YaHei"; + style.Font.Color := "000000"; + style.Alignment.WrapText := True; + style.Alignment.Vertical := "top"; + styleId7 := excel.NewStyle(style); + + style := TOfficeObj("TStyle"); + style.Font.Size := 11; + style.Font.Name := "幼圆"; + style.Font.Color := "502447"; + style.Font.Bold := True; + style.Fill.Pattern.PatternType := "solid"; + style.Fill.Pattern.ForegroundThemeColor := 9; + style.Fill.Pattern.ForegroundThemeColorTint := 0.6; + style.Fill.Pattern.BackgroundThemeColor := 0; + styleId8 := excel.NewStyle(style); + + col := 1; + row := 1; + merge_span := 3; + obj_info := getObjInfo(); + for i:=0 to length(obj_info)-1 do + begin + name := obj_info[i]['ObjName']; + [err, cell_1] := excel.CoordinatesToCellName(col, row); + [err, cell_2] := excel.CoordinatesToCellName(col+merge_span, row); + hash[name] := cell_1; + excel.SetCellValue(sheet_name, cell_1, name); + excel.MergeCell(sheet_name, cell_1, cell_2); + excel.SetCellStyle(sheet_name, cell_1, cell_2, styleid1); + row++; + + desc_arr := obj_info[i]['Desc']; + for j:=0 to length(desc_arr)-1 do + begin + [err, cell1] := excel.CoordinatesToCellName(col, row); + [err, cell2] := excel.CoordinatesToCellName(col+merge_span, row); + excel.MergeCell(sheet_name, cell1, cell2); + [err, cell_3] := excel.CoordinatesToCellName(col, row); + height := length(desc_arr[j]) < 120 ? 15 : length(desc_arr[j])/120*15; + excel.SetRowHeight(sheet_name, row, height); + excel.SetCellValue(sheet_name, cell_3, desc_arr[j]); + row++; + end + [err, cell3] := excel.CoordinatesToCellName(col, row - 1); + excel.SetCellStyle(sheet_name, cell1, cell3, styleid2); + + count := 1; + attr_arr := obj_info[i]['AttrInfo']; + if not istable(attr_arr) then attr_arr := array(); + for k:=0 to length(attr_arr)-1 do + begin + if k = 0 then + begin + [err, cell1] := excel.CoordinatesToCellName(col, row); + [err, cell2] := excel.CoordinatesToCellName(col+3, row); + excel.SetSheetRow(sheet_name, cell1, array("属性", "类型", "说明", "取值")); + excel.SetCellStyle(sheet_name, cell1, cell2, styleId8); + row++; + end + if attr_arr[k]['attrName'] then + begin + insert_col := col; + [err, cell_2] := excel.CoordinatesToCellName(insert_col, row); + excel.SetCellValue(sheet_name, cell_2, attr_arr[k]['attrName']); + excel.SetCellStyle(sheet_name, cell_2, cell_2, styleid5); + insert_col++; + + [err, cell_2] := excel.CoordinatesToCellName(insert_col, row); + excel.SetCellValue(sheet_name, cell_2, attr_arr[k]['type']); + excel.SetCellStyle(sheet_name, cell_2, cell_2, styleId6); + insert_col++; + + [err, cell_2] := excel.CoordinatesToCellName(insert_col, row); + desc_str := attr_arr[k]['desc']; + if desc_str and ParseRegExpr("{(.*?)}", desc_str, "", result, mpos, mlen) then + begin + richText := TOfficeObj('TRichText'); + position := 1; + for index := 0 to length(result)-1 do + begin + s1 := ""; + endposition := mpos[index][0]; + if endposition > 1 then + begin + s1 := desc_str[position: endposition-1]; + t1 := richText.AddText(s1); + end + s2 := result[index][1]; + position += length(s1) + mlen[index][0]; + t2 := richText.AddText(s2); + t2.Font.Bold := True; + end + if position - 1 < length(desc_str) then t3 := richText.AddText(desc_str[position:]); + excel.SetCellRichText(sheet_name, cell_2, richText); + excel.SetCellStyle(sheet_name, cell_2, cell_2, styleId7); + end + insert_col++; + + value_arr := attr_arr[k]['value']; + if istable(value_arr) then + begin + value_str := array2str(value_arr, "\r\n"); + [err, cell_2] := excel.CoordinatesToCellName(insert_col, row); + excel.SetCellValue(sheet_name, cell_2, value_str); + excel.SetCellStyle(sheet_name, cell_2, cell_2, styleId4); + end + end + else if attr_arr[k]['desc'] then + begin + [err, cell1] := excel.CoordinatesToCellName(col, row); + [err, cell2] := excel.CoordinatesToCellName(col+merge_span, row); + excel.MergeCell(sheet_name, cell1, cell2); + desc_str := attr_arr[k]['desc']; + if ParseRegExpr("{(.*?)}", desc_str, "", result, mpos, mlen) then + begin + richText := TOfficeObj('TRichText'); + position := 1; + for index := 0 to length(result)-1 do + begin + s1 := ""; + endposition := mpos[index][0]; + if endposition > 1 then + begin + s1 := desc_str[position: endposition-1]; + t1 := richText.AddText(s1); + end + s2 := result[index][1]; + position += length(s1) + mlen[index][0]; + t2 := richText.AddText(s2); + t2.Font.Bold := True; + end + if position - 1 <= length(desc_str) then t3 := richText.AddText(desc_str[position:]); + excel.SetCellRichText(sheet_name, cell1, richText); + end + end + + row++; + end + + demo_str := trim(obj_info[i]['Demo']); + if demo_str <> '' then + begin + demo_arr := str2array(demo_str); + for demo_index := 0 to length(demo_arr)-2 do + begin + [err, cell_name] := excel.CoordinatesToCellName(col, row); + [err, cell2] := excel.CoordinatesToCellName(col, row); + [err, cell_name2] := excel.CoordinatesToCellName(col + merge_span, row); + excel.SetCellValue(sheet_name, cell_name, demo_arr[demo_index]); + excel.MergeCell(sheet_name, cell_name, cell_name2); + excel.SetCellStyle(sheet_name, cell_name, cell2, styleid3); + row++; + end + end + + row ++; + end + + return hash; + +End + +Function getObjInfo(); +Begin + richTextDemo := " +richText := TOfficeObj('TRichText'); +text1 := richText.AddText('Hello'); +text1.Font.Size := 35; +text1.Font.Color := 'FF0000'; +text2 := richText.AddText('World'); +text2.Font.Size := 35; +text2.Font.Bold := true; + "; + styleDemo := " +style := TOfficeObj('TStyle'); +style.Font.Color := 'A020F0'; +style.Font.Size := 22; +style.Font.Name := '黑体'; +style.Font.Bold := True; +style.Font.Charset := '134'; +style.Font.Script := 'subscript'; +style.Font.Underline := 'double'; +style.Font.Strikethrough := True; +style.Font.Italic := True; +style.Alignment.Horizontal := 'center'; +style.Alignment.Vertical := 'justify'; +style.Alignment.WrapText := True; +style.Alignment.ReadingOrder := 2; +style.Border.Left.LineStyle := 'thin'; +style.Border.Left.Color := 'A020F0'; +style.Border.Right.LineStyle := 'thin'; +style.Border.Right.Color := 'FF0000'; +style.Border.Bottom.LineStyle := 'mediumDashed'; +style.Border.Bottom.Color := 'FF0000'; +style.Border.Top.LineStyle := 'mediumDashed'; +style.Border.Top.Color := 'FF0000'; +style.Border.DiagonalDown := True; +style.Border.DiagonalUp := True; +style.Border.Diagonal.LineStyle := 'double'; +style.Border.Diagonal.Color := 'A020F0'; +style.NumberFormat.FormatCode := '#,##0.000_ '; +//style.Fill.Pattern.PatternType := 'solid'; +//style.Fill.Pattern.ForegroundColor := 'FF6699FF'; +//style.Fill.Pattern.BackgroundColor := 'FFFF0000'; +style.Fill.Gradient.ThemeColor1 := 0; +style.Fill.Gradient.ThemeColor2 := 4; +style.Fill.Gradient.Shading := 1; +style.Protection.Hide := 1; +style.Protection.Lock := 1; + "; + + return array( + ('ObjName': 'TRichText', + 'Desc': ('富文本在使用时需要先用AddText方法添加一段文本,再对本段文本的字体样式(TFont)进行设置'), + 'Demo': richTextDemo + ), + ('ObjName': 'TStyle', + 'Desc': ('TStyle有以下属性: '), + 'AttrInfo': ( + ('attrName': 'NumberFormat', 'type': 'class - TNumFmts', 'desc': '数字样式', 'value': array()), + ('attrName': 'Alignment', 'type': 'class - TAlignmenth', 'desc': '对齐样式', 'value': array()), + ('attrName': 'Font', 'type': 'class - TFont', 'desc': '字体样式', 'value': array()), + ('attrName': 'Border', 'type': 'class - TBorder', 'desc': '边框样式', 'value': array()), + ('attrName': 'Fill', 'type': 'class - TFills', 'desc': '填充样式', 'value': array()), + ('attrName': 'Protection', 'type': 'class - TProtection', 'desc': '保护样式', 'value': array()), + ), + 'Demo': styleDemo, + ), + ('ObjName': 'TNumFmts', + 'Desc': ('TNumFmts有以下属性: '), + 'AttrInfo': ( + ('attrName': 'FormatCode', 'type': 'string', 'desc': '', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TAlignment', + 'Desc': ('TAlignment有以下属性: '), + 'AttrInfo': ( + ('attrName': 'Horizontal', 'type': 'string', 'desc': '水平对齐', 'value': array('nil(默认): 靠右', '"center": 居中', '"left": 靠左', '"fill": 填充', '"justify": 两端对齐', '"distributed": 两端对齐', '"centerContinuous": 跨列居中')), + ('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: 总是从右到左')), + ), + 'Demo': '', + ), + ('ObjName': 'TFont', + 'Desc': ('TFont有以下属性: '), + 'AttrInfo': ( + ('attrName': 'Name', 'type': 'string', 'desc': '字体名称', 'value': array()), + ('attrName': 'Size', 'type': 'double', 'desc': '字体大小', 'value': array()), + ('attrName': 'Bold', 'type': 'boolean', 'desc': '是否加粗,默认FALSE', 'value': array()), + ('attrName': 'Italic', 'type': 'boolean', 'desc': '是否倾斜,默认FALSE', 'value': array()), + ('attrName': 'Charset', 'type': 'string', 'desc': '字符集', 'value': array()), + ('attrName': 'Strikethrough', 'type': 'boolean', 'desc': '是否启用删除线,默认FALSE', 'value': array()), + ('attrName': 'Script', 'type': 'string', 'desc': '上下标', 'value': array('"subscript": 下标', '"superscript": 上标')), + ('attrName': '', 'type': 'double', 'desc': '{颜色}:{Color}和{ThemeColor}只能设置一种', 'value': array()), + ('attrName': 'Color', 'type': 'string', 'desc': 'RGB颜色,如"A020F0"', 'value': array()), + ('attrName': 'ThemeColor', 'type': 'int', 'desc': '主题颜色', 'value': array()), + ('attrName': 'Underline', 'type': 'string', 'desc': '下划线', 'value': array('"double": 双下划线', '"singleAccounting": 会计单下划线', '"doubleAccounting": 会计双下划线')), + ), + 'Demo': '', + ), + ('ObjName': 'TBorders', + 'Desc': ('TBorders有以下属性: '), + 'AttrInfo': ( + ('attrName': 'Left', 'type': 'class - TBorder', 'desc': '左边框', 'value': array()), + ('attrName': 'Right', 'type': 'class - TBorder', 'desc': '右边框', 'value': array()), + ('attrName': 'Top', 'type': 'class - TBorder', 'desc': '上边框', 'value': array()), + ('attrName': 'Bottom', 'type': 'class - TBorder', 'desc': '下边框', 'value': array()), + ('attrName': 'DiagonalUp', 'type': 'boolean', 'desc': '左下-右上 对角线', 'value': array()), + ('attrName': 'DiagonalDown', 'type': 'boolean', 'desc': '左上-右下 对角线', 'value': array()), + ('attrName': 'Diagonal', 'type': 'class - TBorder', 'desc': '对角线,设置 {DiagonalUp}或{DiagonalDown}时有效', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TBorder', + 'Desc': ('TBorder有以下属性: '), + 'AttrInfo': ( + ('attrName': 'LineStyle', 'type': 'string', 'desc': '线型', 'value': array('"hair"', '"dotted"', '"dashDotDot"', '"dashDot"', '"dashed"', '"thin"', '"slantDashDot"', '"mediumDashedDotDot"', '"mediumDashedDot"', '"mediumDashed"', '"medium"', '"thick"', '"double"')), + ('attrName': '', 'type': '', 'desc': '{颜色}:{Color}和{ThemeColor}只能设置一个', 'value': array()), + ('attrName': 'Color', 'type': 'string', 'desc': 'RGB颜色', 'value': array()), + ('attrName': 'ThemeColor', 'type': 'int', 'desc': '主题颜色', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TFills', + 'Desc': ('TFills有以下属性: '), + 'AttrInfo': ( + ('attrName': '', 'type': '', 'desc': '填充方式{Pattern}和{Gradient}只能设置一种', 'value': array()), + ('attrName': 'Pattern', 'type': 'class - TPattern', 'desc': '图案填充', 'value': array()), + ('attrName': 'Gradient', 'type': 'class - TGradient', 'desc': '颜色渐变填充', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TPattern', + 'Desc': ('TPattern有以下属性: '), + 'AttrInfo': ( + ('attrName': 'PatternType', 'type': 'string', 'desc': '图案样式', 'value': array()), + ('attrName': '', 'type': '', 'desc': '{颜色}:前景色,{ForegroundColor}和{ForegroundThemeColor}只能设置一种', 'value': array()), + ('attrName': 'ForegroundColor', 'type': 'string', 'desc': 'RGB颜色', 'value': array()), + ('attrName': 'ForegroundThemeColor', 'type': 'int', 'desc': '主题颜色', 'value': array()), + ('attrName': 'ForegroundThemeColorTint', 'type': 'int', 'desc': '主题颜色的色调', 'value': array()), + ('attrName': '', 'type': '', 'desc': '{颜色}:背景色,{BackgroundColor}和{BackgroundThemeColor}只能设置一种', 'value': array()), + ('attrName': 'BackgroundColor', 'type': 'string', 'desc': 'RGB颜色', 'value': array()), + ('attrName': 'BackgroundThemeColor', 'type': 'int', 'desc': '主题颜色', 'value': array()), + ('attrName': 'BackgroundThemeColorTint', 'type': 'int', 'desc': '主题颜色的色调', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TGradient', + 'Desc': ('TGradient有以下属性: '), + 'AttrInfo': ( + ('attrName': '', 'type': '', 'desc': '{颜色1}:渐变的第一种颜色,{Color1}和{ThemeColor1}只能设置一种', 'value': array()), + ('attrName': 'Color1', 'type': 'string', 'desc': 'RGB颜色', 'value': array()), + ('attrName': 'ThemeColor1', 'type': 'int', 'desc': '主题颜色', 'value': array()), + ('attrName': '', 'type': '', 'desc': '{颜色2}:渐变的第一种颜色,{Color2}和{ThemeColor2}只能设置一种', 'value': array()), + ('attrName': 'Color2', 'type': 'string', 'desc': 'RGB颜色', 'value': array()), + ('attrName': 'ThemeColor2', 'type': 'int', 'desc': '主题颜色', 'value': array()), + ('attrName': 'Shading', 'type': 'int', 'desc': '底纹样式', 'value': array('0: 水平渐变,颜色1从上到下渐变到颜色2', '1: 水平渐变,颜色2从上到下渐变到颜色1', + '2: 水平渐变,三层颜色,颜色1从上渐变到中间颜色2,再从颜色2渐变到底部颜色1', + '3: 垂直渐变,颜色1从左到右渐变到颜色2', + '4: 垂直渐变,颜色2从右到左渐变到颜色1', + '5: 垂直渐变,三层颜色,颜色1从左渐变到中间颜色2,再从颜色2渐变到右边颜色1', + '6: 斜上渐变,颜色1左上渐变到右下颜色2', + '7: 斜上渐变,颜色2左上渐变到右下颜色1', + '8: 斜上渐变,三层颜色,颜色1从左上渐变到对角线颜色2,再从颜色2渐变到右下颜色1', + '9: 斜下渐变,颜色1右上渐变到左下颜色2', + '10: 斜下渐变,颜色2左上渐变到右下颜色1', + '11: 斜下渐变,三层颜色,颜色1从左上渐变到对角线颜色2,再从颜色2渐变到右下颜色1', + '12: 角部辐射渐变,颜色1左上角辐射渐变到右下角2', + '13: 角部辐射渐变,颜色1右上角辐射渐变到左下角颜色2', + '14: 角部辐射渐变,颜色1左下角辐射渐变到右上角2', + '15: 角部辐射渐变,颜色1右下角辐射渐变到左上角颜色2', + '16: 中心辐射渐变,颜色1从中心向四周辐射到颜色2', + )), + ), + 'Demo': '', + ), + ('ObjName': 'TProtection', + 'Desc': ('TProtection有以下属性: '), + 'AttrInfo': ( + ('attrName': 'Lock', 'type': 'boolean', 'desc': '是否锁定,默认FALSE', 'value': array()), + ('attrName': 'Hide', 'type': 'boolean', 'desc': '是否隐藏,默认FALSE', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'THeaderFooter', + 'Desc': ('THeaderFooter有以下属性: '), + 'AttrInfo': ( + ('attrName': 'DifferentOddEven', 'type': 'boolean', 'desc': '是否分别设定奇数和偶数页页眉和页脚,若为FALSE(默认)时,仅需设置{OddHeader}和{OddFooter}', 'value': array()), + ('attrName': 'DifferentFirst', 'type': 'boolean', 'desc': '是否单独设定首页页眉页脚', 'value': array()), + ('attrName': 'ScaleWithDoc', 'type': 'boolean', 'desc': '是否随文档一起缩放', 'value': array()), + ('attrName': 'AlignWithMargin', 'type': 'boolean', 'desc': '是否与页边距对齐', 'value': array()), + ('attrName': 'OddHeader', 'type': 'string', 'desc': '奇数页页眉控制符', 'value': array()), + ('attrName': 'OddFooter', 'type': 'string', 'desc': '奇数页页脚控制符', 'value': array()), + ('attrName': 'EvenHeader', 'type': 'string', 'desc': '偶数页页眉控制符,仅{DifferentOddEven} = TRUE 时有效', 'value': array()), + ('attrName': 'EvenFooter', 'type': 'string', 'desc': '偶数页页脚控制符,仅{DifferentOddEven} = TRUE 时有效', 'value': array()), + ('attrName': 'FirstHeader', 'type': 'string', 'desc': '首页页眉控制符,仅{DifferentFirst} = TRUE 时有效', 'value': array()), + ('attrName': 'FirstFooter', 'type': 'string', 'desc': '首页页脚控制符,仅{DifferentFirst} = TRUE 时有效', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TMargins', + 'Desc': ('TMargins有以下属性: '), + 'AttrInfo': ( + ('attrName': 'Left', 'type': 'double', 'desc': '左页边距', 'value': array()), + ('attrName': 'Right', 'type': 'double', 'desc': '右页边距', 'value': array()), + ('attrName': 'Top', 'type': 'double', 'desc': '上页边距', 'value': array()), + ('attrName': 'Bottom', 'type': 'double', 'desc': '下页边距', 'value': array()), + ('attrName': 'Header', 'type': 'double', 'desc': '页眉页边距', 'value': array()), + ('attrName': 'Footer', 'type': 'double', 'desc': '页脚页边距', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TPageLayout', + 'Desc': ('TPageLayout有以下属性: '), + 'AttrInfo': ( + ('attrName': 'PaperSize', 'type': 'int', 'desc': '纸张大小', 'value': array()), + ('attrName': '', 'type': '', 'desc': '{Scale}和{FitToWidth},{FitToHeight}只能设置一种', 'value': array()), + ('attrName': 'Scale', 'type': 'int', 'desc': '缩放比例(%)', 'value': array()), + ('attrName': 'FitToWidth', 'type': 'int', 'desc': '页宽', 'value': array()), + ('attrName': 'FitToHeight', 'type': 'int', 'desc': '页高', 'value': array()), + ('attrName': 'FirstPageNumber', 'type': 'int', 'desc': '起始页码', 'value': array()), + ('attrName': 'Orientation', 'type': 'string', 'desc': '纸张方向', 'value': array('"landscape": 横向', '"portrait": 纵向')), + ('attrName': 'PageOrder', 'type': 'string', 'desc': '打印顺序', 'value': array('nil(默认): 先列后行', '"overThenDown": 先行后列')), + ('attrName': 'BlackAndWhite', 'type': 'boolean', 'desc': '单色打印', 'value': array()), + ('attrName': 'Draft', 'type': 'boolean', 'desc': '是否开启草稿质量', 'value': array()), + ('attrName': 'CellComments', 'type': 'string', 'desc': '注释', 'value': array('nil(默认): 无', '"atEnd": 工作表末尾', '"asDisplayed": 如同工作表中的显示')), + ('attrName': 'CellError', 'type': 'string', 'desc': '错误单元格打印为', 'value': array('nil(默认): 显示值', '"blank": 空白', '"dash": "--"', "NA": "#N/A")), + ), + 'Demo': '', + ), + ('ObjName': 'TAppProperty', + 'Desc': ('TAppProperty有以下属性: '), + 'AttrInfo': ( + ('attrName': 'Application', 'type': 'string', 'desc': '应用程序', 'value': array()), + ('attrName': 'DocSecurity', 'type': 'boolean', 'desc': '', 'value': array()), + ('attrName': 'ScaleCrop', 'type': 'string', 'desc': '', 'value': array('"false"(默认)', '"true"')), + ('attrName': 'Manager', 'type': 'string', 'desc': '主管', 'value': array()), + ('attrName': 'LinksUpToDate', 'type': 'string', 'desc': '', 'value': array('"false"(默认)', '"true"')), + ('attrName': 'SharedDoc', 'type': 'string', 'desc': '', 'value': array('"false"(默认)', '"true"')), + ('attrName': 'HyperlinkBase', 'type': 'string', 'desc': '超链接基础', 'value': array()), + ('attrName': 'HyperlinksChanged', 'type': 'string', 'desc': '', 'value': array('"false"(默认)', '"true"')), + ('attrName': 'AppVersion', 'type': 'string', 'desc': '应用程序版本', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'THyperLink', + 'Desc': ('THyperLink有以下属性: '), + 'AttrInfo': ( + ('attrName': 'LinkType', 'type': 'string', 'desc': '超链接类型', 'value': array('"External": 外部超链接', '"Location"': 内部超链接)), + ('attrName': 'LinkUrl', 'type': 'string', 'desc': '超链接地址', 'value': array()), + ('attrName': 'Tooltip', 'type': 'string', 'desc': '超链接悬浮提示内容', 'value': array()), + ('attrName': 'Display', 'type': 'string', 'desc': '单元格显示的内容', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TPicture', + 'Desc': ('TPicture有以下属性: '), + 'AttrInfo': ( + ('attrName': 'Image', 'type': 'binary', 'desc': '图片的二进制数据', 'value': array()), + ('attrName': 'Descr', 'type': 'binary', 'desc': '图片描述', 'value': array()), + ), + 'Demo': '', + ), + ('ObjName': 'TPictureFormat', + 'Desc': ('TPictureFormat有以下属性: '), + 'AttrInfo': ( + ('attrName': 'BegColOff', 'type': 'int', 'desc': '开始列偏移', 'value': array()), + ('attrName': 'BegRowOff', 'type': 'int', 'desc': '开始行偏移', 'value': array()), + ('attrName': 'EndColOff', 'type': 'int', 'desc': '结束列偏移', 'value': array()), + ('attrName': 'EndRowOff', 'type': 'int', 'desc': '结束行偏移', 'value': array()), + ), + 'Demo': '', + ), + ); +End diff --git a/Demo/chart.tsl b/Demo/chart.tsl new file mode 100644 index 0000000..6dc0835 --- /dev/null +++ b/Demo/chart.tsl @@ -0,0 +1,82 @@ +excel := new TSExcelFile(); +_test_addchart(excel); +//_test_getcharts(excel); + + +Function _test_getcharts(excel); +Begin + f := 'F:\\temp\\test.xlsx'; + [err, errmsg] := excel.OpenFile('', f); + if err then return + echo 'Open Fail:', errmsg, '\n'; + [err, charts] := excel.GetCharts('Sheet1'); + for i:=0 to length(charts)-1 do Begin + println('ChartName={}, Title={}, Series={}',charts[i].Chart.Name, charts[i].Chart.Title, charts[i].Chart.Series); + End; + charts[1].RemoveSeries(1); + [err, errmsg] := excel.SaveAs('', 'f:\\temp\\ch.xlsx'); + println('SaveAs->{}',err); + //charts[i].RemoveSeries(i); + //charts[i].AddSeries(Name, Categories, Values); + //charts[i].UpdateSeries(i, Name, Categories, Values); + //charts[i].UpdateTitle(i, title); +End; + +Function _test_addchart(excel); +Begin + //f := 'F:\\temp\\test.xlsx'; + [err, errmsg] := excel.NewFile(); + //[err, errmsg] := excel.OpenFile('', f); + if err then return + echo 'Open Fail:', errmsg, '\n'; + //插入数据表 + data := array(("Name":"Small","Apple":2,"Orange":3,"Pear":3), + ("Name":"Normal","Apple":5,"Orange":2,"Pear":4), + ("Name":"Large","Apple":6,"Orange":7,"Pear":8)); + chart := TOfficeObj('TChart'); + chart.Type := 'col'; + chart.VaryColors := true; + chart.BegColOff := 80000; + chart.BegRowOff := 80000; + chart.Name := 'test chart 1'; + chart.Title := 'Hans Chart'; + + chart.AddSeries('Sheet1!$A$6', 'Sheet1!$B$5:$D$5', 'Sheet1!$B$6:$D$6'); + chart.AddSeries('Sheet1!$A$7', 'Sheet1!$B$5:$D$5', 'Sheet1!$B$7:$D$7'); + chart.AddSeries('Sheet1!$A$8', 'Sheet1!$B$5:$D$5', 'Sheet1!$B$8:$D$8'); + + chart.ShowLegendKey := false; + chart.Legend.Position := 'left'; + + chart.ShowBubbleSize := true; + chart.ShowCatName := false; + chart.ShowLeaderLines := false; + chart.ShowPercent := true; + chart.ShowSerName := true; + chart.ShowVal := true; + chart.ShowBlanksAs := 'zero'; + + + [err, errinfo] := excel.InsertTable("Sheet1","A5",data, true); + chart1 := excel.AddChart('Sheet1', 'A11:G30', chart); + println('AddChart1={}', chart1); + + + chart.Type := 'pie3D'; + chart.VaryColors := true; + chart.BegColOff := 0; + chart.BegRowOff := 0; + chart.Name := 'test chart 2'; + chart.Title := 'Hans Chart 2'; + chart.Legend.Position := 'bottom'; + chart.Series := array(('Name':"Sheet3!$A$6", 'Categories':"Sheet3!$B$5:$D$5", 'Values':"Sheet3!$B$6:$D$6")); + chart.ShowSerName := false; + chart.ShowVal := false; + excel.NewSheet('Sheet3'); + [err, errinfo] := excel.InsertTable("Sheet3","A5",data, true); + chart2 := excel.AddChart('Sheet3', 'I11:P30', chart); + println('AddChart2={}', chart2); + + [err, errmsg] := excel.SaveAs('', 'f:\\temp\\ch.xlsx'); + println('SaveAs->{}',err); +End; diff --git a/Demo/docx.tsl b/Demo/docx.tsl new file mode 100644 index 0000000..7f91168 --- /dev/null +++ b/Demo/docx.tsl @@ -0,0 +1,127 @@ +docx := new TSDocxFile(); +//_test_readParagraphs(docx); +_test_newfile(docx); +//_test_addtable(docx); +//_test_Properties(docx); +//_test_picture(docx); + + +Function _test_picture(docx); +Begin + [err, errmsg] := docx.NewFile(); + if err then + return echo 'Open Fail:', errmsg, '\n'; + + picture := TOfficeObj('TPicture'); + picture.Descr := 'Hans Tan\'s Picture test'; + readfile(rwbinary(), '', 'F:\\temp\\VS2010Ultim\\Setup\\banner.bmp', 0, 1024*1024, data); + picture.Image := data; + p := docx.AddPicture(picture, -1); + + v := docx.SaveAs('', 'f:\\temp\\p.docx'); + println('Save={}', v); +End; + + +Function _test_Properties(docx); +Begin + f := 'F:\\temp\\test.docx'; + [err, errmsg] := docx.OpenFile('', f); + if err then return + echo 'Open Fail:', errmsg, '\n'; + + core := docx.Properties(); + core.Author := 'Hans Tan'; + core.Modified := now(); + + docx.SaveAs('', 'f:\\temp\\core.docx'); +End; + + +Function _test_addtable(docx); +Begin + [err, errmsg] := docx.NewFile(); + if err then return + echo 'Open Fail:', errmsg, '\n'; + + data := array(("Name":"Small","Apple":2,"Orange":3,"Pear":3), + ("Name":"Normal","Apple":5,"Orange":2,"Pear":4), + ("Name":"Large","Apple":6,"Orange":7,"Pear":8)); + tbl := docx.CreateTable(data, true, true); + //tbl.TblPr.Style := 1; + + tbl := docx.InsertTable(tbl, -1); + + v := docx.SaveAs('', 'f:\\temp\\t.docx'); + println('Save={}', v); +End; + +Function _test_newfile(docx); +Begin + [err, errmsg] := docx.NewFile(); + if err then return + echo 'Open Fail:', errmsg, '\n'; + + paragraph := TOfficeObj('TParagraph'); + paragraph.Run.Text := 'This is the 1 Line.'; + p := docx.AddParagraph(paragraph, -1); + p := docx.AddLineBreak(p); + p := docx.AddLineBreak(p); + paragraph.Run.Text := 'This is the 2 Line.'; + p := docx.AddParagraph(paragraph, -1); + p := docx.AddPageBreak(p); + + paragraph.Run.Text := 'This is the 3 Line.'; + p := docx.AddParagraph(paragraph, -1); + p := docx.AddColumnBreak(p); + paragraph.Run.Text := ''; + p := docx.AddParagraph(paragraph, -1); + p.SetText('This is the 4 Line\nline5\nline6\nline7.'); + + v := docx.SaveAs('', 'f:\\temp\\new.docx'); + println('Save={}', v); + +End; + +Function _test_readParagraphs(docx); +Begin + f := 'F:\\temp\\test.docx'; + [err, errmsg] := docx.OpenFile('', f); + if err then return + echo 'Open Fail:', errmsg, '\n'; + + paragraph := TOfficeObj('TParagraph'); + paragraph.Run.Text := 'New paragraph'; + v := docx.AddParagraph(paragraph, 0); + paragraphs := docx.Paragraphs(); + println("AddParagraph={}", v); + paragraphs[9].SetText('1、修改文字; +2、第2段; +3、第3段; +4、第4段。'); + + paragraphs := docx.Paragraphs(); + for i:=0 to length(paragraphs)-1 do Begin + println('Name={}, Text={}', paragraphs[i].Name(), paragraphs[i].Text()); + End; + + tcnt := docx.TablesCount(); + println('\n\nTableCount={}',tcnt); + for i := 0 to tcnt-1 do Begin + table := docx.GetTable(i); + for j := 0 to table.Rows()-1 do Begin + for k := 0 to table.Cols()-1 do Begin + cell := table.Cell(j, k); + if ifObj(cell) then Begin + println('row={}, col={}, text={}', j, k, cell.Text()); + continue; + End; + println('row={}, col={}, Cell=nil', j, k); + End; + End; + End; + + println('all text={}, textArray={}', docx.Text(), docx.TextArray()); + + docx.SaveAs('', 'f:\\temp\\p.docx'); +End; \ No newline at end of file diff --git a/Demo/excel_demo.tsl b/Demo/excel_demo.tsl new file mode 100644 index 0000000..d5c3316 --- /dev/null +++ b/Demo/excel_demo.tsl @@ -0,0 +1,503 @@ +testCount := 0; +sheetName := "hello"; +sheetName2 := "world"; + +// OpenFile +excel := new TSExcelFile(); +[err, errmsg] := excel.OpenFile('', 'd:\\temp\\raw.xlsx'); +PrintInfo("OpenFile", err, errmsg); + +// Save +[err, errmsg] := excel.Save(); +PrintInfo("Save", err, errmsg); + +excel := new TSExcelFile(); + +// NewFile +[err, errmsg] := excel.NewFile(); +PrintInfo("NewFile", err, errmsg); + +// SaveAs +// [err, errmsg] := excel.SaveAs('', 'd:\\temp\\test.xlsx'); +// PrintInfo("SaveAs", err, errmsg); + +// FileName +name := excel.FileName(); +println("[success] name = {}", name); + +// GetSheet +sheets := excel.GetSheets(); +println("[success] sheets = {}", sheets); + +// GetSheetsCount +sheetCount := excel.GetSheetsCount(); +println("[success] GetSheetsCount = {}", sheetCount); + +// SetSheetName +[err, errmsg] := excel.SetSheetName("sheet1", sheetName); +PrintInfo("SetSheetName", err, errmsg); + +// GetSheetName +sheetName := excel.GetSheetName(0); +println("[success] GetSheetName = {}", sheetName); + +// NewSheet +[err, errmsg] := excel.NewSheet(sheetName2); +PrintInfo("NewSheet", err, errmsg); + +// DeleteSheet +[err, errmsg] := excel.NewSheet("test1"); +//[err, errmsg] := excel.DeleteSheet("test1"); +//PrintInfo("DeleteSheet", err, errmsg); + +// TotalCols +totalCols := excel.TotalCols(sheetName); +println("[success] TotalCols = {}", totalCols); + +// TotalRows +totalRows := excel.TotalRows(sheetName); +println("[success] TotalRows = {}", totalRows); + +// SetCellValue +flag := excel.SetCellValue(sheetName, "A1", 100); +println("[success] SetCellValue = ", flag); + +// GetCellValue +[err, errmsg] := excel.GetCellValue(sheetName, "A1"); +PrintInfo("GetCellValue", err, errmsg); + +// SetCellRichText +richText := TOfficeObj('TRichtext'); +text1 := richText.AddText('Hello'); +text1.Font.Size := 35; +text1.Font.Color := "FFF000"; +text2 := richText.AddText(" World"); +text2.Font.Size := 25; +text2.Font.Bold := true; +excel.SetCellRichText(sheetName, "A2", richText); +text2.Text := "python"; +excel.SetCellRichText(sheetName, "A3", richText); +println("[success] SetCellRichText"); + +// GetCellRichText +arr := excel.GetCellRichText(sheetName, "A3"); +println("[success] GetCellRichText = {}", arr); + +// ClearCell +excel.ClearCell(sheetName, "A1"); +//excel.ClearCell(sheetName); +println("[success] ClearCell"); + +// SetCellFormula +excel.SetCellFormula(sheetName, "A2", "=100*50"); +println("[success] SetCellFormula"); + +// GetCellFormula +[err, errmsg] := excel.GetCellFormula(sheetName, "A2"); +PrintInfo("GetCellFormula", err, errmsg); + +// SetSheetRow +excel.SetSheetRow(sheetName, "C3", array(1, 2, 3, 4, "a", "b")); +println("[success] SetSheetRow"); + +// InsertTable +table := array((1, 2, "你好"), (4, 5, "b")); +//table2 := array(("title1" :1, "title2": 2), ("title1": 3, "title2": 4)); +[err, errmsg] := excel.InsertTable(sheetName, "A5", table); +PrintInfo("InsertTable", err, errmsg); + +// GetTable +table := excel.GetTable(sheetName, "A5", "B7"); +println("[success] GetTable = {}", table); + +// InsertCol +excel.InsertCol(sheetName, "B"); +excel.InsertCol(sheetName, "B"); +println("[success] InsertCol"); + +// InsertRow +excel.InsertRow(sheetName, 3); +excel.InsertRow(sheetName, 3); +println("[success] InsertRow"); + +// RemoveCol +excel.RemoveCol(sheetName, "B"); +println("[success] RemoveCol"); + +// RemoveRow +excel.RemoveRow(sheetName, 3); +println("[success] RemoveRow"); + +// SetRowHeight +excel.SetRowHeight(sheetName, 1, 30); +excel.SetRowHeight(sheetName, 15, 30); +println("[success] SetRowHeight"); + +// GetRowHeight +height := excel.GetRowHeight(sheetName, 2); +println("[success] GetRowHeight = {}", height); +height := excel.GetRowHeight(sheetName, 15); +println("[success] GetRowHeight = {}", height); + +// SetColWidth +excel.SetColWidth(sheetName, "A", "D", 20); +println("[success] SetColWidth"); + +// GetColWidth +width := excel.GetColWidth(sheetName, "A"); +println("[success] GetColWidth = {}", width); +width := excel.GetColWidth(sheetName, "E"); +println("[success] GetColWidth = {}", width); + +// SetSheetDefaultColWidth +excel.SetSheetDefaultColWidth(sheetName, 15); +println("[success] SetSheetDefaultColWidth"); + +// GetSheetDefaultColWidth +width := excel.GetSheetDefaultColWidth(sheetName); +println("[success] GetSheetDefaultColWidth = {}", width); + +// AddComment +excel.AddComment(sheetName, "A1", "csh", "heiheihei"); +println("[success] AddComment"); + +// AddChart +data := array(("Name":"Small","Apple":2,"Orange":3,"Pear":3), + ("Name":"Normal","Apple":5,"Orange":2,"Pear":4), + ("Name":"Large","Apple":6,"Orange":7,"Pear":8)); +chart := TOfficeObj('TChart'); +chart.Type := 'col'; +chart.VaryColors := true; +chart.BegColOff := 20000; +chart.BegRowOff := 20000; +chart.Name := 'test chart 1'; +chart.Title := 'Hans Chart'; + +chart.AddSeries('Sheet1!$A$6', 'Sheet1!$B$5:$D$5', 'Sheet1!$B$6:$D$6'); +chart.AddSeries('Sheet1!$A$7', 'Sheet1!$B$5:$D$5', 'Sheet1!$B$7:$D$7'); +chart.AddSeries('Sheet1!$A$8', 'Sheet1!$B$5:$D$5', 'Sheet1!$B$8:$D$8'); + +chart.ShowLegendKey := false; +chart.Legend.Position := 'left'; + +chart.ShowBubbleSize := true; +chart.ShowCatName := false; +chart.ShowLeaderLines := false; +chart.ShowPercent := true; +chart.ShowSerName := true; +chart.ShowVal := true; +chart.ShowBlanksAs := 'zero'; + +excel.NewSheet('Sheet1'); +[err, errinfo] := excel.InsertTable("Sheet1","A5",data, true); +chart1 := excel.AddChart('Sheet1', 'A11:G30', chart); +println("[success] AddChart"); +[err, errmsg] := excel.saveas("", "d:\\temp\\test.xlsx"); +println("saveas : {}", err); + +// GetCharts +[err, charts] := excel.GetCharts('Sheet1'); +for i:=0 to length(charts)-1 do Begin + println('ChartName={}, Title={}, Series={}',charts[i].Chart.Name, charts[i].Chart.Title, charts[i].Chart.Series); +End; + +// SplitCellName +[err, col, row] := excel.SplitCellName("AK47"); +if not err then println("[success] {} = col : {}, row = {}", "SplitCellName", col, row); + +// JoinCellName +[err, errmsg] := excel.JoinCellName("AK", 47); +PrintInfo("JoinCellName", err, errmsg); + +// ColumnNameToNumber +[err, errmsg] := excel.ColumnNameToNumber("AK"); +PrintInfo("ColumnNameToNumber", err, errmsg); + +// ColumnNumberToName +[err, errmsg] := excel.ColumnNumberToName(37); +PrintInfo("ColumnNumberToName", err, errmsg); + +// CellNameToCoordinates +[err, col, row] := excel.CellNameToCoordinates("A2"); +if not err then println("[success] {} = col : {}, row = {}", "CellNameToCoordinates", col, row); + +// RGBToHSL +[err, h, s, l] := excel.RGBToHSL(255, 15, 33); +if not err then println("[success] {} = {}, {}, {}", "RGBToHSL", h, s, l); + +// HSLToRGB +[err, r, g, b] := excel.HSLToRGB(h, s, l); +if not err then println("[success] {} = {}, {}, {}", "HSLToRGB", h, s, l); + +// NewStyle +style := TOfficeObj('TStyle'); +style.Font.Color := "A020F0"; +style.Font.Size := 22; +style.Font.Name := "黑体"; +style.Font.Bold := True; +style.Font.Charset := "134"; +style.Font.Script := "subscript"; +style.Font.Underline := "double"; +style.Font.Strikethrough := True; +style.Font.Italic := True; +style.Alignment.Horizontal := "center"; +style.Alignment.Vertical := "justify"; +style.Alignment.WrapText := True; +style.Alignment.ReadingOrder := 2; +style.Border.Left.LineStyle := "thin"; +style.Border.Left.Color := "A020F0"; +style.Border.Right.LineStyle := "thin"; +style.Border.Right.Color := "FF0000"; +style.Border.Bottom.LineStyle := "mediumDashed"; +style.Border.Bottom.Color := "FF0000"; +style.Border.Top.LineStyle := "mediumDashed"; +style.Border.Top.Color := "FF0000"; +style.Border.DiagonalDown := True; +style.Border.DiagonalUp := True; +style.Border.Diagonal.LineStyle := "double"; +style.Border.Diagonal.Color := "A020F0"; +style.NumberFormat.FormatCode := "#,##0.000_ "; +//style.Fill.Pattern.PatternType := "solid"; +//style.Fill.Pattern.ForegroundColor := "FF6699FF"; +//style.Fill.Pattern.BackgroundColor := "FFFF0000"; +style.Fill.Gradient.ThemeColor1 := 0; +style.Fill.Gradient.ThemeColor2 := 4; +style.Fill.Gradient.Shading := 1; +style.Protection.Hide := 1; +style.Protection.Lock := 1; + +styleid1 := excel.NewStyle(style); +println("[success] NewStyle = {}", styleid1); + +// SetCellStyle +excel.SetCellStyle(sheetName, "A1", "A2", styleid1); +println("[success] SetCellStyle"); + +styleid := excel.GetCellStyle(sheetName, "A1"); +println("[success] GetCellStyle = {}", styleid); +styleid := excel.GetCellStyle(sheetName, "D4"); +println("[success] GetCellStyle = {}", styleid); + +// SetSheetHeaderFooter +headerFooter := TOfficeObj("THeaderFooter"); +headerFooter.DifferentOddEven := true; +headerFooter.DifferentFirst := true; +headerFooter.ScaleWithDoc := False; +headerFooter.AlignWithMargin := False; +headerFooter.OddHeader := "&L123&456&789"; +headerFooter.OddFooter := "&Ldef&Rhij"; +headerFooter.EvenHeader := "&L123&R456"; +headerFooter.EvenFooter := "&L456&R789"; +headerFooter.FirstHeader := "&L++"; +headerFooter.FirstFooter := "&R--"; +excel.SetSheetHeaderFooter(sheetName, headerFooter); +println("[success] SetSheetHeaderFooter"); + +// SetSheetVisible +excel.SetSheetVisible(sheetName, True); +println("[success] SetSheetVisible"); + +// GetSheetVisible +visible := excel.GetSheetVisible(sheetName); +println("[success] GetSheetVisible = {}", visible); + +// SetRowVisible +excel.SetRowVisible(sheetName, 2, false); +println("[success] SetRowVisible"); + +// GetRowVisble +[err, errmsg] := excel.GetRowVisble(sheetName, 2); +PrintInfo("GetRowVisble 2", err, errmsg); +[err, errmsg] := excel.GetRowVisble(sheetName, 3); +PrintInfo("GetRowVisble 3", err, errmsg); + +// SetColVisible +excel.SetColVisible(sheetName, "A", false); +println("[success] SetRowVisible"); + +// GetColVisble +[err, errmsg] := excel.GetColVisble(sheetName, "A"); +PrintInfo("GetColVisible", err, errmsg); + +// SetPageMargins +margins := TOfficeObj('TMargins'); +margins.Top := 0.5; +margins.Bottom := 0.6; +margins.Left := 0.7; +margins.Right := 0.8; +margins.Header := 0.9; +margins.Footer := 1.0; +excel.SetPageMargins(sheetName2, margins); +println("[success] SetPageMargins"); + +// GetPageMargins +margins := excel.GetPageMargins(sheetName2); +println("[success] GetPageMargins top = {}, bottom = {}, left = {}, right = {}, header = {}, footer = {}", + margins.Value('Top'), margins.Value('Bottom'), margins.Value('Left'), margins.Value('Right'), + margins.Value('Header'), margins.Value('Footer')); + +// MergeCell +excel.SetCellStyle(sheetName2, "A4", "A4", styleid1); +excel.MergeCell(sheetName2, "A4", "C4"); +excel.MergeCell(sheetName2, "A5", "D7"); +println("[success] MergeCell"); + +// UnMergeCell +excel.UnMergeCell(sheetName2, "A4", "C4"); +println("[success] UnMergeCell"); + +// TODO 未完全开发完毕 +// SetSheetViewOptions +// GetSheetViewOptions + +// SetPageLayout +pageLayout := TOfficeObj('TPageLayout'); +pageLayout.FitToWidth := 10; +pageLayout.FitToHeight := 10; +pageLayout.FirstPageNumber := 5; +pageLayout.Orientation := "portrait"; +pageLayout.BlackAndWhite := true; +pageLayout.PaperSize := 11; +pageLayout.PageOrder := "overThenDown"; +pageLayout.CellError := "blank"; +pageLayout.CellComments := "asDisplayed"; +excel.SetPageLayout(sheetName2, pageLayout); +println("[success] SetPageLayout"); + +// GetPageLayout +pageLayout := excel.GetPageLayout(sheetName2); +println("[success] GetPageLayout FitToWidth = {}, PaperSize = {}", pageLayout.Value('FitToWidth'), pageLayout.Value('PaperSize')); + +// SetDefaultSheet +excel.SetDefaultSheet(sheetName2); +println("[success] SetDefaultSheet"); + +// GetDefaultSheet +sheet := excel.GetDefaultSheet(); +println("[success] GetDefaultSheet = {}", sheet); + +// SetCellHyperLink +link := TOfficeObj('THyperLink'); +link.LinkType := "Location"; +link.LinkUrl := sheetName $ "!A1"; +excel.SetCellHyperLink(sheetName2, 'A1', link); +link := TOfficeObj('THyperLink'); +link.LinkType := "External"; +link.LinkUrl := "https://www.baidu.com"; +link.Tooltip := "超链接悬浮提示"; +excel.SetCellValue(sheetName2, 'A2', '超链接'); +excel.SetCellHyperLink(sheetName2, 'A2', link); +println("[success] SetCellHyperLink"); + +// GetCellHyperLink +hyperlink := excel.GetCellHyperLink(sheetName2, 'A2'); +println("[success] GetCellHyperLink LinkType = {}, LinkUrl = {}, Tooltip = {}", hyperlink.Value('LinkType'), hyperlink.Value('LinkUrl'), hyperlink.Value('Tooltip')); + +// SetSheetBackground +ret := readfile(rwBinary(), "", "C:\\Users\\csh05\\Pictures\\Saved Pictures\\1.jpg", 0, 1024000, data); +if not ret then return echo "readfile error!"; +picture := TOfficeObj('TPicture'); +picture.Image := data; +excel.SetSheetBackground(sheetName, picture); +println("[success] SetSheetBackground"); + +// AddPicture +format := TOfficeObj('TPictureFormat'); +format.BegColOff := 20000; +format.EndColOff := 20000; +excel.AddPicture(sheetName, 'A11', 'F33', picture, format); +excel.AddPicture(sheetName2, 'A8', 'D16', picture, format); +println("[success] AddPicture"); + +// DeletePicture +excel.DeletePicture(sheetName2, 'A1', 'D17'); +println("[success] DeletePicture"); + +// TODO 可能有问题 +// AddTable +table2 := array(("title1" :1, "title2": 2), ("title1": 3, "title2": 4)); +excel.InsertTable(sheetName2, "A9", table2, true); +tablestyle := TOfficeObj('TTableStyle'); +tablestyle.TableName := "测试表"; +tablestyle.TableStyle := "TableStyleMedium2"; +tablestyle.ShowFirstColumn := True; +tablestyle.ShowLastColumn := True; +tablestyle.ShowRowStripes := True; +tablestyle.ShowColumnStripes := True; +excel.AddTable(sheetName2, "A9", "B11", tablestyle, false); +println("[success] AddTable"); + +// InsertPageBreak +excel.InsertPageBreak(sheetName2, 10); +excel.InsertPageBreak(sheetName2, 15); +println("[success] InsertPageBreak"); + +// RemovePageBreak +excel.RemovePageBreak(sheetName2, 15); +println("[success] RemovePageBreak"); + +// AddShape +shape_format := TOfficeObj('TShapeFormat'); +shape_format.BegColOff := 354252; +shape_format.EndColOff := 7653; +shape_format.BegRowOff := 55577; +shape_format.EndRowOff := 66675; +shape_type := "roundRect"; + +// SetCoreProps +core := TOfficeObj('TCoreProperty'); +core.Title := "标题"; +core.Subject := "主题"; +core.Creator := "作者"; +excel.SetCoreProps(core); +println("[success] SetCoreProps"); + +// GetCoreProps +core := excel.GetCoreProps(); +println("[success] GetCoreProps Title = {}, subject = {}, Creator = {}", core.Value("Title"), core.Value("Subject"), core.Value("Creator")); + +// SetAppProps +appProps := TOfficeObj('TAppProperty'); +appProps.Application := "Microsoft TX"; +appProps.DocSecurity := false; +appProps.ScaleCrop := "true"; +appProps.Company := "TS"; +appProps.LinksUpToDate := "true"; +appProps.HyperlinksChanged := "true"; +appProps.AppVersion := "1.000"; +appProps.Manager := "这是主管"; +//appProps.HyperlinkBase := "这是超链接基础"; +excel.SetAppProps(appProps); +println("[success] SetAppProps"); + +// GetAppProps +app_props := excel.GetAppProps(); +println("[success] GetAppProps Manager = {}, Company = {}, Application = {}", app_props.Value('Manager'), app_props.Value('Company'), app_props.Value('Application')); + +[err, errmsg] := excel.saveas("", "d:\\temp\\test.xlsx"); +println("saveas : {}", err); + +Function _test_background(excel); +Begin + f := 'D:\\temp\\a.xlsx'; + [err, msg] := excel.OpenFile('', f); + if err then return + echo "Open Fail:", msg, '\n'; + + ret := readfile(rwBinary(), "", "C:\\Users\\csh05\\Pictures\\Saved Pictures\\1.png", 0, 102400, data); + if ret then pictrue := new TSImage(data); + else return echo "readfile error!"; + + excel.SetSheetBackground('Sheet1', pictrue); + + [err, errmsg] := excel.SaveAs('', 'd:\\temp\\e.xlsx'); + println('SaveAs->{}',err); +End + +// ============================================================ +Function PrintInfo(msg, err, errinfo); +Begin + if err then debugreturn println("{} : errorno = {}, errorinfo = {}!", msg, err, errinfo); + println("[success] {} = {}", msg, errinfo); +End + diff --git a/Demo/wordHelp.tsl b/Demo/wordHelp.tsl new file mode 100644 index 0000000..0affe97 --- /dev/null +++ b/Demo/wordHelp.tsl @@ -0,0 +1,1114 @@ +///Create by Tinysoft. +///自动生成 TSDocxFile 帮助文件 +mtic;SetProfiler(7); +docx := new TSDocxFile(); +[err, errmsg] := docx.NewFile(); +if err then + return println( 'Create NewFile Fail:{}.', errmsg); + +//多级项目编号 +sysparams['numId'] := docx.NumberingObject().NumberId('multilevel', 'decimal'); + +///Test 0: 文档标题 +paragraphTitle := _0_AddTitle(docx); + +///Test 1: 文档说明 +_1_HelpInfo(docx); + +///Test 2: 文档API +_2_DocumentApi(docx); + +///Test 3: TParagraph对象 +_3_Paragraph(docx); + +///Test 4: TTable对象 +_4_Table(docx); + +///Test 5: TPicture对象 +_5_Picture(docx); + +///Test 6: TComments对象 +_6_Comments(docx); + +///Test 7: TRevision对象 +_7_Revision(docx); + +///文档属性 +_8_CoreProperties(docx); + +///章节、页脚、页眉 +_9_TDocSection(docx); + +///文本框 +_10_TTextBox(docx); + +///TRange +_11_TRange(docx); + +///TDocxStyles +_12_TDocxStyles(docx); + +///TNumbering +_13_TNumbering(docx); + +///TDocxChart +_14_TDocxChart(docx); + +///附注 +_Annotation(docx); + +///Faq +_Faq(docx); + +///目录 +docx.AddTableContent(paragraphTitle, 1, 3); + +v := docx.SaveAs('', 'D:/temp/help.docx'); +println('Test Over!\n Save {}: {},time={}', file, v, mtoc); + +info := GetProfilerInfo(true); +exportfile(ftstream(),'','f:\\temp\\ProfilerInfo.stm',info); + +/////////////////////////////////////////////////////////////////////////////////////////////// +///子函数 +///Test 1: 文档标题 +Function _0_AddTitle(docx); +Begin + _PrintMsg('AddTitle'); + p := _AddTitle(docx, '天软DOCX文档操作接口帮助文档', 0);//添加文档标题 + p.Font.Size := 48; + p.Apply(); + for i:=0 to 16 do + docx.AddLineBreak(-1);//换行符 + + r := array(('文档编号','TS-XXXXXX-XXX'),('文档版本','Version 1.0'),('修订日期',datetimetostr(Now())),('保密级别','')); + tbl := docx.CreateTable(r); + tbl.Format.Indent := 500; + tbl.format.IndentType := 'dxa'; + //设置列宽 + tbl.ColumnWidth(1, 2000); + tbl.ColumnWidth(2, 6000); + tbl := docx.InsertTable(tbl, -1); + for i:=1 to 4 do Begin + //第1列底纹设置 + cell := tbl.Cell(i, 1); + cell.Format.Shading.Val := 'clear'; + cell.Format.Shading.Color := 'auto'; + cell.Format.Shading.Fill := 'D9D9D9'; + cell.Apply(); + //第2列,据中对齐 + c2 := tbl.Cell(i, 2); + c2.Format.vAlign := 'center'; + c2.pFormat.Alignment := 'center'; + c2.Apply(); + End; + tbl.Apply(); + p := docx.AddPageBreak(-1);//换页符 + + println(' >>OK\n'); + return p; +End; + +///Test 1: 前言 +Function _1_HelpInfo(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('前言'); + _AddTitle(docx, '前言', 1); //第一段标题 + + //添加段落 + preface := TOfficeObj('TParagraph'); + preface.Run.T := '本文档由word_help.tsl脚本,调用本文档中描述的接口自动生成!'; + preface.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 + preface.Format.LeftIndent := 440;//段落左边距 + preface.Font.Name := '宋体'; + preface.Font.Color := 'FF0000'; + preface.Font.Bold := true; + preface.Font.Size := 32; + p1 := docx.AddParagraph(preface, -1, nil); + + println(' >>OK\n'); +End; + +///Test 2: 文档API +Function _2_DocumentApi(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('Document Api'); + _AddTitle(docx, '文档接口(TSDocFile)', 1); //第二段标题 + + _AddTitle(docx, 'TSDocFile方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TSDocxFile.tsf', 'TSDocxFile'); + _AddFunctionHelpInfo(docx, paragraph $ '.1.', conf, 3); + + println(' >>OK\n'); +End; + +///Test 3: TParagraph对象 +Function _3_Paragraph(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TParagraph对象'); + _AddTitle(docx, 'TParagraph对象(段落)', 1); //第三段标题 + + ///TParagraph属性 + _AddTitle(docx, 'TParagraph属性', 2); //第二级标题 + formatObj := new TOfficeObj('TwpPr'); + _LoadObjectAttributes(formatObj, attrs, '段落属性', 'Format'); + fontObj := new TOfficeObj('TwrPr'); + _LoadObjectAttributes(fontObj, attrs, '字体属性', 'Font'); + _AddClassHelpTable(docx, attrs);//添加表格:TParagraph属性 + + ///TParagraph方法 + _AddTitle(docx, 'TParagraph方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TParagraph'); + conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); + + ///TTabStops对象 + _AddTitle(docx, 'TTabStops对象', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TTabStops'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.3.', conf, 3); + + ///TabStop属性 + _AddTitle(docx, 'TTabStop属性', 2); //第二级标题 + attrs := array(); + formatObj := new TOfficeObj('TTabStop'); + _LoadObjectAttributes(formatObj, attrs, 'TTabStop属性', ''); + _AddClassHelpTable(docx, attrs); + + println(' >>OK\n'); +End; + +///Test 4: TTable对象 +Function _4_Table(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TTable对象'); + _AddTitle(docx, 'TTable对象(表格)', 1); //第四段标题 + + ///TTable对象 + _AddTitle(docx, 'TTable对象属性', 2); //第二级标题 + tbl := new TOfficeObj('TTable'); + _LoadObjectAttributes(tbl.Format, attrs, '表格属性', 'Format'); + _LoadObjectAttributes(tbl.FormatEx, attrs, '表格扩展属性', 'FormatEx'); + _AddClassHelpTable(docx, attrs);//添加表格:TTable属性 + + ///TTable方法 + _AddTitle(docx, 'TTable方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TTable'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); + + ///TCell对象 + _AddTitle(docx, 'TCell对象属性', 2); + attrs := array(); + formatObj := new TOfficeObj('TwTcPr'); + _LoadObjectAttributes(formatObj, attrs, '单元格属性', 'Format'); + _AddClassHelpTable(docx, attrs);//添加表格:TCell属性 + + ///TCell方法 + _AddTitle(docx, 'TCell方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TCell'); + conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocumentBody'); + conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.4.', conf, 3); + + println(' >>OK\n'); +End; + +///Test 5: TPicture对象 +Function _5_Picture(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TPicture对象'); + _AddTitle(docx, 'TPicture对象(图像)', 1); //第五段标题 + + ///TPicture对象属性 + _AddTitle(docx, 'TPicture对象属性', 2); + attrs := array(('类别':'图片信息', '接口':'Image', '说明':'二进制内容'), + ('类别':'图片信息', '接口':'Descr', '说明':'图像描述'), + ('类别':'图片信息', '接口':'Width', '说明':'图像宽度'), + ('类别':'图片信息', '接口':'Height', '说明':'图像高度') + ); + pPr := new TOfficeObj('TpicsPpr'); + _LoadObjectAttributes(pPr, attrs, '图像属性', 'Format'); + _AddClassHelpTable(docx, attrs);//添加表格:TPicture对象 + + ///TPicture方法 + _AddTitle(docx, 'TPicture方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TPicture'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); + + ///插入图像案例 + _AddTitle(docx, '插入图像案例', 2); + picture := TOfficeObj('TPicture'); + picture.Descr := '插入图像案例'; + readfile(rwbinary(), '', docx.GetPath() + '\\funcext\\TSOffice\\template\\tinysoft.gif', 0, 1024*1024, data); + picture.Image := data; + p := docx.AddPicture(picture, -1); + //添加图像外边框 + p.Format.Ln.SolidFill.SchemeClr.Val := 'accent1'; + p.Apply(); + + println(' >>OK\n'); +End; + +///Test 6: TDocComments对象 +Function _6_Comments(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TDocComments对象'); + _AddTitle(docx, 'TDocComments对象(批注集合)', 1); //第六段标题 + + ///TDocComments方法 + _AddTitle(docx, 'TDocComments方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocComments'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); + + ///TDocComment对象属性 + _AddTitle(docx, 'TDocComment对象属性', 2); + attrs := array( + ('类别':'属性', '接口':'sPos', '说明':'被标注文字在文档中的位置'), + ('类别':'属性', '接口':'SelectLength', '说明':'选择文字的长度,汉字当一个字符,不计算换行符号') + ); + pPr := new TOfficeObj('TDocComment'); + _LoadObjectAttributes(pPr, attrs, '属性', 'Format'); + _AddClassHelpTable(docx, attrs);//添加表格:TDocComment对象 + + ///TDocComment方法 + _AddTitle(docx, 'TDocComment方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocComment'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); + + //插入批注案例 + _AddTitle(docx, '插入批注案例', 2); + //添加测试段落文字 + p1 := TOfficeObj('TParagraph'); + p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 + p1.Format.LeftIndent := 440;//段落左边距 + p1.Run.AddText('本文档由天软科技制作。'); + p1.Run.rPr.Name := '宋体'; + p1.Run.rPr.Bold := true; + p1.Run.rPr.Size := 32; + p1.Run.rPr.Color := 'FF0000'; + p2 := docx.AddParagraph(p1, -1, nil); + //插入批注 + comment := docx.NewComment('Tinysoft', '深圳市天软科技开发有限公司'); + comment.sPos := 4; + comment.SelectLength := 4; + p2.AddComment(comment); + //嵌套批注 + comment := docx.NewComment('Tinysoft', '嵌套批注:Tinysoft'); + comment.sPos := 4; + comment.SelectLength := 2; + p2.AddComment(comment); + //2层嵌套批注 + comment := docx.NewComment('Tinysoft', '2层嵌套批注Tiny'); + comment.sPos := 4; + comment.SelectLength := 1; + p2.AddComment(comment); + //2层嵌套批注 + comment := docx.NewComment('Tinysoft', '2层嵌套批注Software'); + comment.sPos := 5; + comment.SelectLength := 1; + p2.AddComment(comment); + + //读取批注案例 + _AddTitle(docx, '读取批注案例', 2); + r := array(); + commentObjs := docx.Comments(); + for i:=0 to commentObjs.Count()-1 do Begin + comment := commentObjs.Comment(i); + r[i]['批注ID'] := comment.CommentID; + r[i]['批注文字范围'] := comment.Text(); + End; + tbl := docx.CreateTable(r, true, true); + tbl.Format.Indent := 500; + tbl.format.IndentType := 'dxa'; + tbl := docx.InsertTable(tbl, -1); + + //删除批注案例 + _AddTitle(docx, '删除批注案例(执行docx.Comments().Comment(3).Delete();)', 2); + //删除批注 + docx.Comments().Comment(3).Delete(); + r := array(); + commentObjs := docx.Comments(); + for i:=0 to commentObjs.Count()-1 do Begin + comment := commentObjs.Comment(i); + r[i]['批注ID'] := comment.CommentID; + r[i]['批注文字范围'] := comment.Text(); + End; + tbl := docx.CreateTable(r, true, true); + tbl.Format.Indent := 500; + tbl.format.IndentType := 'dxa'; + tbl := docx.InsertTable(tbl, -1); + + println(' >>OK\n'); +End; + +///Test 7: TRevision对象 +Function _7_Revision(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TRevision对象'); + _AddTitle(docx, 'TRevision对象(修订)', 1); //第七段标题 + + ///TRevision对象 + _AddTitle(docx, 'TRevision属性', 2); + attrs := array( + ('类别':'属性', '接口':'sPos', '说明':'被标注文字在文档中的位置'), + ('类别':'属性', '接口':'SelectLength', '说明':'选择文字的长度,汉字当一个字符,不计算换行符号') + ); + formatObj := new TOfficeObj('TRevision'); + _LoadObjectAttributes(formatObj, attrs, '属性', ''); + _AddClassHelpTable(docx, attrs);//添加表格:TRevision属性 + + ///TRevision方法 + _AddTitle(docx, 'TRevision方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TRevision'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); + + //插入修订案例 + _AddTitle(docx, '插入修订案例', 2); + //添加测试段落文字 + p1 := TOfficeObj('TParagraph'); + p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 + p1.Format.LeftIndent := 440;//段落左边距 + p1.Run.T := '插入案例。'; + p1.Run.rPr.Name := '宋体'; + p1.Run.rPr.Bold := true; + p1.Run.rPr.Size := 32; + p1.Run.rPr.Color := 'FF0000'; + pAddRevision := docx.AddParagraph(p1, -1, nil); + //插入修订 + revision := TOfficeObj('TRevision'); + revision.Author := '修订者'; + revision.sPos := 2; + revision.InsText := '修订'; + pAddRevision.AddRevision(revision); + + //删除修订案例 + _AddTitle(docx, '删除修订案例', 2); + //添加测试段落文字 + p1 := TOfficeObj('TParagraph'); + p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 + p1.Format.LeftIndent := 440;//段落左边距 + p1.Run.T := '删除修订案例。'; + p1.Run.rPr.Name := '宋体'; + p1.Run.rPr.Bold := true; + p1.Run.rPr.Size := 32; + p1.Run.rPr.Color := 'FF0000'; + pDelRevision := docx.AddParagraph(p1, -1, nil); + //删除修订 + revision := TOfficeObj('TRevision'); + revision.Author := '修订者'; + revision.sPos := 4; + revision.SelectLength := 2; + pDelRevision.DelRevision(revision); + + //读取修订案例 + _AddTitle(docx, '读取修订案例', 2); + revisions := pAddRevision.Revisions(); + revisions union= pDelRevision.Revisions(); + r := array(); + for i:=0 to length(revisions)-1 do Begin + r[i]['Act'] := revisions[i].Act(); + r[i]['Text'] := revisions[i].Text(); + //if i=1 then + // revisions[i].Accept(); //接受修订 + // revisions[i].Reject(); //拒绝修订 + End; + tbl := docx.CreateTable(r, true, true); + tbl.Format.Indent := 500; + tbl.format.IndentType := 'dxa'; + tbl := docx.InsertTable(tbl, -1); + + println(' >>OK\n'); +End; + +///文档属性 +Function _8_CoreProperties(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TCoreProperties对象'); + _AddTitle(docx, 'TCoreProperties对象(文档属性)', 1); //第八段标题 + + ///TCoreProperties对象 + _AddTitle(docx, 'TCoreProperties对象', 2); + attrs := array( + ('类别':'属性', '接口':'Author', '说明':'读写属性:作者'), + ('类别':'属性', '接口':'Category', '说明':'读写属性:此包内容的分类。示例值可能包括:简历、信函、财务预测、提案或技术演示。'), + ('类别':'属性', '接口':'Description', '说明':'读写属性:文档描述'), + ('类别':'属性', '接口':'Subject', '说明':'读写属性:文档主题'), + ('类别':'属性', '接口':'Title', '说明':'读写属性:文档名称'), + ('类别':'属性', '接口':'Version', '说明':'读写属性:自由格式版本字符串'), + ('类别':'属性', '接口':'Rversion', '说明':'读写属性:此修订的编号,每次保存文档时按Word递增。'), + ('类别':'属性', '接口':'KeyWords', '说明':'读写属性:可能用作本文档搜索词的描述性词或短短语'), + ('类别':'属性', '接口':'Created', '说明':'读写属性:创建日期'), + ('类别':'属性', '接口':'Modified', '说明':'读写属性:上次修改文档的时间'), + ('类别':'属性', '接口':'LastModifiedBy', '说明':'读写属性:上次修改文档的人的姓名或其他标识符(如电子邮件地址)'), + ); + _AddClassHelpTable(docx, attrs);//添加表格:TCoreProperties属性 + + println(' >>OK\n'); +End; + +///章节、页脚、页眉 +Function _9_TDocSection(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TDocSection对象'); + _AddTitle(docx, 'TDocSection对象(章节)', 1); //第九段标题 + + ///TDocSection对象 + _AddTitle(docx, 'TDocSection对象(章节)', 2); + formatObj := new TOfficeObj('TDocSection'); + _LoadObjectAttributes(formatObj, attrs, '属性', ''); + _AddClassHelpTable(docx, attrs);//添加表格:TDocSection属性 + + ///TDocSection方法 + _AddTitle(docx, 'TDocSection方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocSection'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); + + ///THeaderFooter方法 + _AddTitle(docx, 'THeaderFooter方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocHeaderFooter'); + conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocumentBody'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.3.', conf, 3); + + ///添加页眉、页脚案例 + _AddTitle(docx, '添加页眉、页脚案例', 2); + help := TOfficeObj('TParagraph'); + help.Run.T := '参考word_help.tsl脚本(TDocxFile::Sections, TDocSection::AddHeader, TDocSection::AddFooter)!'; + help.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 + help.Format.LeftIndent := 440;//段落左边距 + help.Font.Name := '宋体'; + help.Font.Color := 'FF0000'; + help.Font.Bold := true; + help.Font.Size := 30; + p1 := docx.AddParagraph(help, -1, nil); + + section := docx.Sections(-1);//获取缺省章节 + footer := section.AddFooter('');//添加缺省页脚 + //页脚内容 + p := TOfficeObj('TParagraph'); + p.Run.T := '电 话:0755-83937039'; + p.AddRun('网 址:http://www.tinysoft.com.cn', true); + p.AddRun('公司地址:深圳市福田区莲花街道梅岭社区新闻路59号深茂商业中心19F', true); + p.Format.Bdr.Top.val := 'single';//页脚横线 + p.Format.SpaceAfter := 0; + p.Font.Name := '宋体'; + p.Font.Color := 'FF0000'; + p.Font.Size := 16; + p2 := footer.AddParagraph(p, -1, nil); + p.Font.Size := 18; + pgno := footer.AddPageNumber('第 {0} 页,共 {1} 页', p.Font); //添加页码 + pgno.Format.Alignment := 'center'; //据中对齐 + pgno.Format.SpaceAfter := 0; + pgno.Apply(); + + //添加页眉 + header := section.AddHeader('');//添加缺省页眉 + p := TOfficeObj('TParagraph'); + p.Run.T := '深圳市天软科技开发有限公司'; + p.Format.Alignment := 'right'; //据右对齐 + //p.Format.Bdr.Bottom.val := 'single';//页眉横线 + p.Font.Name := '宋体'; + p.Font.Color := 'FF0000'; + p.Font.Size := 16; + p1 := header.AddParagraph(p, -1, nil); + + println(' >>OK\n'); +End; + +///文本框 +Function _10_TTextBox(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TTextBox对象'); + _AddTitle(docx, 'TTextBox对象(文本框)', 1); //第十段标题 + + ///TTextBox方法 + _AddTitle(docx, 'TTextBox方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TDocumentBody'); + conf := select * from conf where leftstr(['funcname'],10) <> 'AddPicture' end; + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); + + println(' >>OK\n'); +End; + +///TRange +Function _11_TRange(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TRange对象'); + _AddTitle(docx, 'TRange对象', 1); //第11段标题 + + ///TRange对象 + _AddTitle(docx, 'TRange对象', 2); + attrs := array( + ('类别':'属性', '接口':'Font', '说明':'字体属性,参考段落字体属性'), + ('类别':'属性', '接口':'Text', '说明':'读写属性:文字内容') + ); + _AddClassHelpTable(docx, attrs);//添加表格:TRange属性 + + ///TRange方法 + _AddTitle(docx, 'TRange方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TRange'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); + + //修改字体属性案例 + _AddTitle(docx, '字体属性设置案例', 2); + //添加测试段落文字 + p1 := TOfficeObj('TParagraph'); + p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 + p1.Format.LeftIndent := 440;//段落左边距 + p1.Run.T := '深圳市天软公司'; + p1.Run.rPr.Name := '宋体'; + pTest := docx.AddParagraph(p1, -1, nil); + //修改部分文字字体 + range := pTest.Range(3,2); + range.Font.Size := 32; + range.Font.Color := 'FF0000'; + range.Font.Bold := true; + range.Apply(); + //添加文字1 + range1 := pTest.AddText(5, '科技开发有限'); + range1.Font.Size := 28; + range1.Font.Color := '00FF00'; + range1.Font.Bold := true; + range1.Apply(); + //添加文字2 + range2 := pTest.AddText(0, '广东省'); + range2.Font.Size := 28; + range2.Font.Color := '0000FF'; + range2.Font.Bold := true; + range2.Apply(); + //r := pTest.Range(2,10); + //r.Text := 'Tinysoft'; + + r := pTest.AddText(-1, ':www.tinysoft.com.cn');//段落后追加 + r.Font.Size := 20; + r.Font.Color := '0000FF'; + r.Font.Bold := true; + r.Apply(); + + println(' >>OK\n'); +End; + +///TDocxStyles +Function _12_TDocxStyles(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TDocxStyles对象'); + _AddTitle(docx, 'TDocxStyles对象', 1); //第12段标题 + + ///TDocxStyles方法 + _AddTitle(docx, 'TDocxStyles方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\document\\TDocxStyles.tsf', 'TDocxStyles'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); + + println(' >>OK\n'); +End; + +///TNumbering +Function _13_TNumbering(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TNumbering对象'); + _AddTitle(docx, 'TNumbering对象', 1); //第13段标题 + + ///TNumbering方法 + _AddTitle(docx, 'TNumbering方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\document\\TNumbering.tsf', 'TNumbering'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); + + ///TNumStyle对象 + _AddTitle(docx, 'TNumStyle属性', 2); + formatObj := new TOfficeObj('TNumStyle'); + _LoadObjectAttributes(formatObj, attrs, '属性', ''); + _AddClassHelpTable(docx, attrs);//添加表格:TNumStyle属性 + + //缺省项目符号 + _AddTitle(docx, '缺省项目符号', 2); + for i:=0 to 6 do Begin + p := TOfficeObj('TParagraph'); + p.Format.numPr.Level := 0;//项目编号 + p.Format.numPr.numId := docx.NumberingObject().NumberId('bullet', i); //项目编号 + p.Font.Size := 28; + p.Font.Color := 'FF0000'; + p.Font.Bold := true; + p.Format.LeftIndent := 700;//段落左边距 + p.Run.T := 'NumberId("bullet", ' $ i $ ')'; + docx.AddParagraph(p, -1, nil); + End; + + println(' >>OK\n'); +End; + +///TDocxChart +Function _14_TDocxChart(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('TChart对象'); + _AddTitle(docx, 'TChart对象', 1); //第14段标题 + + ///TDocxChart方法 + _AddTitle(docx, 'TChart方法', 2); + conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TChart'); + _AddFunctionHelpInfo(docx, '' $ paragraph $ '.1.', conf, 3); + + ///TChart对象 + _AddTitle(docx, 'TChart属性', 2); + formatObj := new TOfficeObj('TChart'); + _LoadObjectAttributes(formatObj, attrs, '属性', ''); + _AddClassHelpTable(docx, attrs);//添加表格:TChart属性 + + data := array( + ('年度':2019, '深圳':26927, '广州':23628, '佛山':10751, '东莞':9482, '惠州':4177, '其它':32706), + ('年度':2020, '深圳':27670, '广州':25019, '佛山':10816, '东莞':9650, '惠州':4222, '其它':33383.92), + ('年度':2021, '深圳':30665, '广州':28232, '佛山':12157, '东莞':10855, '惠州':4977, '其它':37483.7) + ); + tmpData := nils(3,7); + tmpData[:,:] := data; + _AddTitle(docx, '案例一:广东省2019——2021年GDP(柱状图)', 2); + chart := TOfficeObj('TChart'); + chart.Width := 15; + chart.Height := 9; + chart.Type := 'col'; + chart.VaryColors := true; + chart.Name := 'GD-GDP-1'; + chart.Title := '广东省2019——2021年GDP(单位:亿元)'; + names := FieldNames(data)[1:]; + for i:=0 to length(data)-1 do + chart.AddSeries('' $ data[i]['年度'], names, (tmpData[i])[1:]); + chart.ShowLegendKey := false; + chart.Legend.Position := 'bottom'; + chart.ShowBubbleSize := true; + chart.ShowCatName := false; + chart.ShowPercent := true; + chart.ShowSerName := false; + chart.ShowVal := false; + chart.ShowBlanksAs := 'zero'; + chart.DataTable := true; + docx.AddChart(chart, -1); + + _AddTitle(docx, '案例二:广东省2019——2021年GDP(折线图)', 2); + chart.Type := 'line'; + chart.ShowBubbleSize := false; + chart.ShowPercent := false; + chart.DataTable := false; + chart.ClearSeries(); + for i:=0 to length(names)-1 do begin + k := names[i]; + chart.AddSeries(names[i], array('2019','2020','2021'), sselect [k] from data end); + End; + docx.AddChart(chart, -1); + + _AddTitle(docx, '案例三:广东省2021年GDP(饼状图)', 2); + chart.Title := '广东省2021年GDP(单位:亿元)'; + chart.Type := 'pie'; + chart.ShowCatName := true; + chart.ClearSeries(); + chart.AddSeries('广东省', names, (tmpData[2])[1:]); + docx.AddChart(chart, -1); + + charts := array(("Type":"area","图表类型":"面积图"), + ("Type":"areastacked","图表类型":""), + ("Type":"areapercentstacked","图表类型":""), + ("Type":"area3d","图表类型":""), + ("Type":"area3dstacked","图表类型":""), + ("Type":"area3dpercentstacked","图表类型":""), + ("Type":"bar","图表类型":""), + ("Type":"barstacked","图表类型":""), + ("Type":"barpercentstacked","图表类型":""), + ("Type":"bar3dclustered","图表类型":""), + ("Type":"bar3dstacked","图表类型":""), + ("Type":"bar3dpercentstacked","图表类型":""), + ("Type":"bar3dconeclustered","图表类型":""), + ("Type":"bar3dconestacked","图表类型":""), + ("Type":"bar3dconepercentstacked","图表类型":""), + ("Type":"bar3dpyramidclustered","图表类型":""), + ("Type":"bar3dpyramidstacked","图表类型":""), + ("Type":"bar3dpyramidpercentstacked","图表类型":""), + ("Type":"bar3dcylinderclustered","图表类型":""), + ("Type":"bar3dcylinderstacked","图表类型":""), + ("Type":"bar3dcylinderpercentstacked","图表类型":""), + ("Type":"col","图表类型":""), + ("Type":"colstacked","图表类型":""), + ("Type":"colpercentstacked","图表类型":""), + ("Type":"col3d","图表类型":""), + ("Type":"col3dclustered","图表类型":""), + ("Type":"col3dstacked","图表类型":""), + ("Type":"col3dpercentstacked","图表类型":""), + ("Type":"col3dcone","图表类型":""), + ("Type":"col3dconeclustered","图表类型":""), + ("Type":"col3dconestacked","图表类型":""), + ("Type":"col3dconepercentstacked","图表类型":""), + ("Type":"col3dpyramid","图表类型":""), + ("Type":"col3dpyramidclustered","图表类型":""), + ("Type":"col3dpyramidstacked","图表类型":""), + ("Type":"col3dpyramidpercentstacked","图表类型":""), + ("Type":"col3dcylinder","图表类型":""), + ("Type":"col3dcylinderclustered","图表类型":""), + ("Type":"col3dcylinderstacked","图表类型":""), + ("Type":"col3dcylinderpercentstacked","图表类型":""), + ("Type":"bubble","图表类型":""), + ("Type":"bubble3d","图表类型":""), + ("Type":"doughnut","图表类型":""), + ("Type":"line","图表类型":""), + ("Type":"pie3d","图表类型":""), + ("Type":"pie","图表类型":""), + ("Type":"pieofpiechart","图表类型":""), + ("Type":"barofpiechart","图表类型":""), + ("Type":"radar","图表类型":""), + ("Type":"scatter","图表类型":""), + ("Type":"surface3d","图表类型":""), + ("Type":"wireframesurface3d","图表类型":""), + ("Type":"contour","图表类型":""), + ("Type":"wireframecontour","图表类型":"")); + _AddTitle(docx, '系统支持的图表类型', 2); + tbl := docx.CreateTable(charts); + tbl.Format.Indent := 500; + tbl.format.IndentType := 'dxa'; + //设置列宽 + tbl.ColumnWidth(1, 2000); + tbl.ColumnWidth(2, 12000); + tbl := docx.InsertTable(tbl, -1); + + println(' >>OK\n'); +End; + +Function _AddTitle(docx, subject, level); +Begin + leftIndent := array((0,0), (425,425), (453,850), (708,1508)); + p := docx.AddHeading(subject, -1, level);//标题 + if level then Begin + p.Format.FirstLineChars := 0; + p.Format.LeftChars := 0; + p.Format.Hanging := leftIndent[level][0]; + p.Format.LeftIndent := leftIndent[level][1];//段落左边距 + End + else //标题 + p.Format.Alignment := 'center'; //据中对齐 + //p.Font.Name := '宋体'; + p.Font.rFont.hint := 'eastAsia'; + p.Font.Bold := true; + if level then Begin + p.Format.numPr.Level := level - 1; //项目级别 + p.Format.numPr.numId := sysparams['numId']; //项目编号 + End; + p.Apply(); + return p; +End; + +///添加函数帮助信息 +Function _AddFunctionHelpInfo(docx, head, conf, level); +Begin + ind := 1; + hash := array(); + for i:=0 to length(conf)-1 do Begin + if not ifString(conf[i]['comment']) or conf[i]['comment'] = '' then continue; + arr := str2array(conf[i]['funcname'], '('); + k := lowercase(arr[0]); + if hash[k]=1 and ( not k in array('create')) then continue; + hash[k] := 1; + subject := head $ ind++ $ ' ' $ conf[i]['funcname']; + _AddTitle(docx, conf[i]['funcname'], level); + + //添加函数声明段落 + pFun := TOfficeObj('TParagraph'); + pFun.Format.Hanging := 660; //悬挂缩进 + pFun.Format.LeftIndent := 1760;//段落左边距 + pFun.Font.Name := '宋体'; + println(' Subject:{}', subject); + pFun.Run.T := 'Function ' + conf[i]['funcname']; + p1 := docx.AddParagraph(pFun, -1, nil);//函数方法 + //设置首行字体颜色、黑体 + firstRun := p1.GetRun(0); + firstRun.Font.Color := 'FF0000'; + firstRun.Font.Bold := true; + firstRun.Apply(); + + //添加函数帮助信息段落 + arr := str2array(conf[i]['comment'], '\n'); + for j:=0 to length(arr)-1 do Begin + pFun.Run.T := '///' + arr[j]; + p2 := docx.AddParagraph(pFun, -1, nil); + End; + + End; +End; + +///从对象中加载属性 +Function _LoadObjectAttributes(obj, r, itemType, api); +Begin + if not ifArray(r) then r := array(); + attrs := obj.GetAttrs(); + ind := length(r); + for i:=0 to length(attrs)-1 do Begin + if attrs[i, 3] = 'disable' then continue; + r[ind]['类别'] := itemType; + r[ind]['接口'] := ifthen(api='','',api + '.') + attrs[i, 0]; + r[ind]['说明'] := attrs[i, 3]; + ind++; + End; + + children := obj.GetChildren(); + for i:=0 to length(children)-1 do Begin + descText := children[i]['desc']; + if descText = 'disable' then continue; + if ifObj(children[i]['obj']) then Begin + if descText = '' then Begin + _LoadObjectAttributes(children[i]['obj'], r, itemType, ifthen(api='','',api + '.') $ children[i]['field']); + ind := length(r); + continue; + End + else Begin + if not ifArray(sysParams['objs']) then + sysParams['objs'] := array(); + cnt := length(sysParams['objs']); + sysParams['objs'][cnt] := array('name':children[i]['field'], 'obj':children[i]['obj'], 'desc':children[i]['desc'], 'class':children[i]['class']); + descText := descText $ '(' $ children[i]['class'] $ '对象)'; + End; + End + r[ind]['类别'] := itemType; + r[ind]['接口'] := ifthen(api='','',api + '.') + children[i]['field']; + r[ind]['说明'] := descText; + ind++; + End; +End; + +///添加对象属性表格 +Function _AddClassHelpTable(docx, data); +Begin + //设置边框属性 + tbl := docx.CreateTable(data, true, true); + tbl.Format.Borders.Top.Size := 24; + tbl.Format.Borders.Left.Size := 24; + tbl.Format.Borders.Bottom.Size := 24; + tbl.Format.Borders.Right.Size := 24; + tbl.Format.Borders.Top.Val := 'thinThickThinMediumGap'; + tbl.Format.Borders.Left.Val := 'thinThickThinMediumGap'; + tbl.Format.Borders.Bottom.Val := 'thinThickThinMediumGap'; + tbl.Format.Borders.Right.Val := 'thinThickThinMediumGap'; + tbl.Format.Borders.InsideH.Val := 'single'; + tbl.Format.Borders.InsideV.Val := 'single'; + tbl.Format.Borders.Top.color := 'D0D0D0'; + tbl.Format.Borders.Left.color := 'D0D0D0'; + tbl.Format.Borders.Bottom.color := 'D0D0D0'; + tbl.Format.Borders.Right.color := 'D0D0D0'; + tbl.Format.Borders.Top.themeColor := 'accent3'; + tbl.Format.Borders.Left.themeColor := 'accent3'; + tbl.Format.Borders.Bottom.themeColor := 'accent3'; + tbl.Format.Borders.Right.themeColor := 'accent3'; + tbl.Format.Borders.Top.themeTint := '99'; + tbl.Format.Borders.Left.themeTint := '99'; + tbl.Format.Borders.Bottom.themeTint := '99'; + tbl.Format.Borders.Right.themeTint := '99'; + + //设置列宽 + tbl.ColumnWidth(1, 800); + tbl.ColumnWidth(2, 2000); + tbl.ColumnWidth(3, 2000); + tbl.ColumnWidth(4, 6000); + + //设置表格左边距 + tbl.Format.Indent := 500; + tbl.format.IndentType := 'dxa'; + //tbl.TblPr.Style := 1; + tbl := docx.InsertTable(tbl, -1); + + //设置表头底纹 + rows := tbl.Rows(); + cols := tbl.Cols(); + for i:=1 to cols do Begin + cell := tbl.Cell(1, i); + cell.Format.Shading.ThemeFillTint := 32; + cell.Format.Shading.ThemeFill := 'accent5'; + cell.Format.Shading.Fill := 'DBEEF3'; + cell.Apply(); + End; + + //设置第1列底纹 + for i:=1 to rows do Begin + cell := tbl.Cell(i, 1); + cell.Format.Shading.ThemeFillTint := 32; + cell.Format.Shading.ThemeFill := 'accent5'; + cell.Format.Shading.Fill := 'DBEEF3'; + cell.Apply(); + End; + + //合并单元格 + fields := select distinct [1] as 'type' from data where thisrowindex > 0 end; + for i:=0 to length(fields)-1 do begin + key := fields[i]['type']; + r := select thisrowindex+1 as 'row' from data where [1] = key end; + begRow := r[0]['row']; + endRow := r[length(r)-1]['row']; + [err, begCell] := xlsx_call("CoordinatesToCellName", 2, begRow); + [err, endCell] := xlsx_call("CoordinatesToCellName", 2, endRow); + tbl.Merge(begCell, endCell, true); + + //设置合并单元格据中对齐 + cell := tbl.Cell(begRow, 2); + cell.Format.vAlign := 'center'; + cell.Apply(); + End; +End; + +///打印信息 +Function _PrintMsg(msg); +Begin + if ifNil(sysparams['Test']) then sysParams['Test'] := 0; + println('This is test {}: {}.',sysParams['Test'],msg); + sysParams['Test'] := sysParams['Test'] + 1; +End; + +///从TSDocxFile.tsf文件加载API +function _LoadClassInfo(f, className); +Begin + _ReplaceFileName(f); + if istable(sysparams[f]) then Begin + return sysParams[f, className]; + End; + sysparams[f] := array(); + [err,fh] := io_open(f); + if err then return array(); + [err, data] := io_read(fh); + io_close(fh); + if err then return array(); + + comment := ''; + cName := ''; + funcname := ''; + t := array(); + lines := str2array(string(data), '\n'); + for i:=0 to length(lines)-1 do begin + line := lines[i]; + if leftstr(line, 5) = 'Type ' then Begin + a := str2array(line, ' '); + cName := a[1]; + continue; + End; + if lowercase(leftstr(line, 3)) = 'end' then Begin + if cName <> '' then Begin + sysParams[f, cName] := t; + End; + cName := ''; + t := array(); + continue; + End; + if cName = '' then continue; + str := ' End;'; + if leftstr(line, length(str)) = str then Begin + comment := ''; + name := ''; + continue; + End; + func := ' Function '; + if leftstr(line, length(func)) = func then Begin + funcname := rightstr(line, length(line)-length(func)); + if funcname <> '' then Begin + n := length(t); + t[n]['funcname'] := funcname; + t[n]['comment'] := comment; + t[n]['name'] := name; + End; + comment := ''; + name := ''; + continue; + End; + if ParseRegExpr('\/\/\/(.*)$',line,'',result,MPos,Mlen) and length(result) then Begin + str := result[0][1]; + comment := comment + (comment = '' ? '' : '\n') + str; + if name='' then begin + name := str; + end; + End; + End; + return sysParams[f, className]; +End; + +///附注 +Function _Annotation(docx); +Begin + r := sysParams['objs']; + if not istable(r) then return; + sysParams['objs'] := array(); + paragraph := sysparams['Test']; + _PrintMsg('附注'); + _AddTitle(docx, '附注一:内置对象', 1); //附注标题 + + ind := 1; + hash := array('TwpPr':1, 'TwrPr':1); + while i < length(r) do Begin + attrs := array(); + _LoadObjectAttributes(r[i]['obj'], attrs, '属性', ''); + classname := r[i]['class']; + if istable(attrs) and ifnil(hash[classname]) then Begin + _AddTitle(docx, classname $ '对象:' $ r[i]['desc'], 2); + attrs := array(); + _LoadObjectAttributes(r[i]['obj'], attrs, '属性', ''); + _AddClassHelpTable(docx, attrs);//添加表格 + if istable(sysParams['objs']) then Begin + r union= sysParams['objs']; + sysParams['objs'] := array(); + End; + hash[classname] := 1; + End; + i++; + End; + + println(' >>OK\n'); +End; + +Function _Faq(docx); +Begin + paragraph := sysparams['Test']; + _PrintMsg('FAQ'); + _AddTitle(docx, '附注二:FAQ', 1); //附注FAQ标题 + + [err,fh] := io_open( _ReplaceFileName(docx.GetPath() + '\\funcext\\TSOffice\\template\\faq.txt') ); + if err then return t; + [err, data] := io_read(fh); + io_close(fh); + lines := str2array(string(data), '\n'); + numId := docx.NumberingObject().NumberId('bullet', 1); //项目编号 + for i:=0 to length(lines)-1 do Begin + title := flase; + str := lines[i]; + p := TOfficeObj('TParagraph'); + if str <> '' then Begin + if str[1] = '*' then Begin + title := true; + str := str[2:]; + println(' FAQ: {}', str); + End; + p.Run.T := str; + End; + if title then Begin + p.Format.numPr.Level := 0;//项目编号 + p.Format.numPr.numId := numId; + p.Font.Size := 28; + p.Font.Color := 'FF0000'; + p.Font.Bold := true; + p.Format.LeftIndent := 500;//段落左边距 + End + else Begin + p.Format.Hanging := 300; //悬挂缩进 + p.Format.LeftIndent := 880;//段落左边距 + End; + docx.AddParagraph(p, -1, nil); + End; + + println(' >>OK\n'); +End; + +Function _ReplaceFileName(f); +Begin + if f[1] = '/' then + f := ReplaceStr(f, '\\', '/'); + return f; +End; \ No newline at end of file diff --git a/DocxFile使用帮助.docx b/DocxFile使用帮助.docx new file mode 100644 index 0000000..e004ad2 Binary files /dev/null and b/DocxFile使用帮助.docx differ diff --git a/ExcelFile使用帮助.xlsx b/ExcelFile使用帮助.xlsx index d7f24dd..dcbc103 100644 Binary files a/ExcelFile使用帮助.xlsx and b/ExcelFile使用帮助.xlsx differ diff --git a/Linux-aarch64/libTsXlsx.so b/Linux-aarch64/libTsXlsx.so new file mode 100644 index 0000000..1ec0439 Binary files /dev/null and b/Linux-aarch64/libTsXlsx.so differ diff --git a/Linux-aarch64/liboffice_plugin.so b/Linux-aarch64/liboffice_plugin.so new file mode 100644 index 0000000..1bf91ab Binary files /dev/null and b/Linux-aarch64/liboffice_plugin.so differ diff --git a/Linux-x86_64/libTsXlsx.so b/Linux-x86_64/libTsXlsx.so new file mode 100644 index 0000000..0cb8079 Binary files /dev/null and b/Linux-x86_64/libTsXlsx.so differ diff --git a/Linux-x86_64/liboffice_plugin.so b/Linux-x86_64/liboffice_plugin.so new file mode 100644 index 0000000..e192195 Binary files /dev/null and b/Linux-x86_64/liboffice_plugin.so differ diff --git a/README.md b/README.md index cc4e130..23997eb 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,26 @@ TSOffice 项目:纯 TSL 代码实现 excel、word 文件读写 ### windows -- [fmt_pubkrnl_plugin](./Windows-X64/fmt_pubkrnl_plugin.dll) 放入 tsl 安装根目录下 Plugin 文件夹 -- [office_plugin](./Windows-X64/office_plugin.dll) 放入 tsl 安装根目录下 Plugin 文件夹 -- [tsxlsx.dll](./Windows-X64/tsxlsx.dll) 放入 tsl 安装根目录 +对应文件夹的dll文件按如下要求 + +- `fmt_pubkrnl_plugin` 放入 tsl 安装根目录下 Plugin 文件夹 +- `office_plugin` 放入 tsl 安装根目录下 Plugin 文件夹 +- `tsxlsx.dll` 放入 tsl 安装根目录 + +### Linux + +根据架构选择aarch64或x86版本将对应文件夹内容进行部署 + +- `liboffice_plugin` 放入 tsl 安装根目录下 Plugin 文件夹 +- `libTsXlsx` 放入 tsl 安装根目录 ## 帮助文档 -- [Excel 帮助文档](./ExcelFile%E4%BD%BF%E7%94%A8%E5%B8%AE%E5%8A%A9.xlsx) 涵盖了对Excel文件的操作API +- [Excel 帮助文档](./ExcelFile使用帮助.xlsx) -- [TOfficeObj 帮助文档](./TOfficeObj.md) 使用的对象的文档说明,比如说“样式”(TStyle)对象 +- [Word 帮助文档](./DocxFile使用帮助.docx) + + +## Demo + +Demo文件夹提供了一些参考的demo diff --git a/TOfficeObj.md b/TOfficeObj.md deleted file mode 100644 index b99b370..0000000 --- a/TOfficeObj.md +++ /dev/null @@ -1,144 +0,0 @@ -# TOfficeObj 说明文档 - -## TStyle - -- **NumberFormat** : `class` : [**TNumFmts**](#tnumfmts) 数字样式 -- **Alignment** : `class` : [**TAligment**](#taligment) 对齐样式 -- **Font** : `class` : [**TFont**](#tfont) 字体样式 -- **Border** : `class` : [**TBorder**](#tborders) 边框样式 -- **Fill** : `class` : [**TFills**](#tfills) 填充样式 -- **Protection** : `class` : [**TProtection**](#tprotection) 保护样式 - -## TNumFmts - -- **FormatCode** : `string` - -## TAligment - -- **Horizontal** : `string` 水平对齐 - - nil(默认):靠右 - - "center" : 居中 - - "left" : 靠左 - - "fill" : 填充 - - "justify" : 两端对齐 - - "distributed" : 分散对齐 - - "centerContinuous" : 跨列居中 -- **Vertical** : `string` 垂直对齐 - - nil(默认):靠下 - - "center" : 居中 - - "top" : 靠上 - - "justify" : 两端对齐 - - "distributed" : 分散对齐 -- **WrapText** : `boolean` 是否自动换行,默认不换行 -- **ReadingOrder** : `string` 文字方向 - - nil(默认):根据内容 - - "1" : 总是从左到右 - - "2" : 总是从右到左 - -## TFont - -- **Name** : `string`,字体名称 -- **Size** : `float` 字体大小 -- **Bold** : `boolean` 是否加粗,默认不加粗 -- **Italic** : `boolean` 是否倾斜,默认不倾斜 -- **Charset** : `string` 字符集,可不设置 -- **Strikethrough** : `boolean` 是否启用删除线,默认不启用 -- **Script** : `string` 上下标 - - "subscript" : 下标 - - "superscript" : 上标 -- _颜色,只能设置以下一种属性_ - - **Color** : `string` RGB 颜色,如"FFA020F0" - - **ThemeColor** : `int` 主题颜色 -- **Underline** : `string` 下划线,默认无 - - "double" : 双下划线 - - "singleAccounting" : 会计单下划线 - - "doubleAccounting" : 会计双下划线 - -```md -未使用 - -- **FontStyle** : `string` -- **OutlineFont** : `string` -- **shadow** : `string` -- **Background** : `string` -- **TintAndShade** : -- **rFont** : -- **ThemeFont** : -- **ColorIndex** : `string` -``` - -## TBorders - -- **Left** : `class` : [**TBorder**](#tborder) 左边框 -- **Right** : `class` : [**TBorder**](#tborder) 右边框 -- **Top** : `class` : [**TBorder**](#tborder) 上边框 -- **Bottom** : `class` : [**TBorder**](#tborder) 下边框 -- **DiagonalUp** : `boolean` 斜上对角线 -- **DiagonalDown** : `boolean` 斜下对角线 -- **Diagonal** : `class` : [**TBorder**](#tborder) 对角线,设置 **DiagonalUp** 或 **DiagonalDown** 时有效 - -## TBorder - -- **LineStyle** : `string` 线型 - - "hair" - - "dotted" - - "dashDotDot" - - "dashDot" - - "dashed" - - "thin" - - "slantDashDot" - - "mediumDashDodDot" - - "mediumDashDot" - - "mediumDashed" - - "medium" - - "thick" - - "double" -- _颜色,只能设置以下一种属性_ - - **Color** : `string` RGB 颜色,如"FFA020F0" - - **ThemeColor** : `int` 主题颜色 - -## TFills - -只能设置一种填充方式 - -- **Pattern** : `class` : [**TPattern**](#tpattern) 图案填充 -- **Gradient** : `class` : [**TGradient**](#tgradient) 颜色渐变填充 - -## TPattern - -- **PatternType** : `string` 图案样式 -- _颜色:前景色,只能设置以下一种属性_ - - **ForegroundColor** : `string` RGB 颜色 - - **ForegroundThemeColor** : `int` 主题颜色 -- _颜色:背景色,只能设置以下一种属性_ - - **BackgroundColor** : `string` RGB 颜色 - - **BackgroundThemeColor** : `int` 主题颜色 - -## TGradient - -- _颜色 1:渐变的颜色 1,但每个颜色只能设置以下一种属性_ - - **Color1** : `string` RGB 颜色 - - **ThemeColor1** : `int` 主题颜色 -- _颜色 2:渐变的颜色 2,但每个颜色只能设置以下一种属性_ - - **Color2** : `string` RGB 颜色 - - **ThemeColor2** : `int` 主题颜色 -- **Shading** : `int` 底纹样式 - - |
取值
| 样式 | 取值 | 样式 | - | ----------------------------------- | -------------------------------------------------------------------------------- | ---- | ------------------------------------------------- | - | 0 | 水平渐变,颜色 1 从上到下渐变到颜色 2 | 1 | 水平渐变,颜色 2 从上到下渐变到颜色 1 | - | 2 | 水平渐变,三层颜色,颜色 1 从上渐变到中间颜色 2,再从颜色 2 渐变到底部颜色 1 | - | 3 | 垂直渐变,颜色 1 从左到右渐变到颜色 2 | 4 | 垂直渐变,颜色 2 从右到左渐变到颜色 1 | - | 5 | 垂直渐变,三层颜色,颜色 1 从左渐变到中间颜色 2,再从颜色 2 渐变到右边颜色 1 | - | 6 | 斜上渐变,颜色 1 左上渐变到右下颜色 2 | 7 | 斜上渐变,颜色 2 左上渐变到右下颜色 1 | - | 8 | 斜上渐变,三层颜色,颜色 1 从左上渐变到对角线颜色 2,再从颜色 2 渐变到右下颜色 1 | - | 9 | 斜下渐变,颜色 1 右上渐变到左下颜色 2 | 10 | 斜下渐变,颜色 2 左上渐变到右下颜色 1 | - | 11 | 斜下渐变,三层颜色,颜色 1 从左上渐变到对角线颜色 2,再从颜色 2 渐变到右下颜色 1 | - | 12 | 角部辐射渐变,颜色 1 左上角辐射渐变到右下角 | 13 | 角部辐射渐变,颜色 1 右上角辐射渐变到左下角颜色 2 | - | 14 | 角部辐射渐变,颜色 1 左下角辐射渐变到右上角 | 15 | 角部辐射渐变,颜色 1 右下角辐射渐变到左上角颜色 2 | - | 16 | 中心辐射渐变,颜色 1 从中心向四周辐射到颜色 2 | - -## TProtection - -- **Lock** : `boolean` 是否锁定 -- **Hide** : `boolean` 是否隐藏 diff --git a/Windows-X64/office_plugin.dll b/Windows-X64/office_plugin.dll index d91d764..d85b4f3 100644 Binary files a/Windows-X64/office_plugin.dll and b/Windows-X64/office_plugin.dll differ diff --git a/funcext/TSOffice/TOfficeObj.tsf b/funcext/TSOffice/TOfficeObj.tsf index c34aaa6..552596d 100644 --- a/funcext/TSOffice/TOfficeObj.tsf +++ b/funcext/TSOffice/TOfficeObj.tsf @@ -1,5 +1,5 @@ -Function TOfficeObj(n); -Begin +Function TOfficeObj(n); +Begin case lowercase(n) of "nodeinfo": return new NodeInfo(""); @@ -27,12 +27,16 @@ Begin return new TGraphicFrame(); "ttwocellanchor": return new TtwoCellAnchor(); + "tcnvpicpr": + return new TcNvPicPr(); + "tpictureformat": + return new TPictureFormat(); + "tshapeformat": + return new TShapeFormat(); "tchart": return new TChart(); "tlegend": return new TLegend(); - "tplot": - return new TPlot(); "tchartaxis": return new TChartAxis(); "tnumfont": @@ -117,6 +121,8 @@ Begin return new TNumFmts(); "tfills": return new TFills(); + "tgradient": + return new TGradient(); "tpattern": return new TPattern(); "tstop": @@ -127,6 +133,8 @@ Begin return new TProtection(); "tstyle": return new TStyle(); + "txf": + return new TXf(); "theaderfooter": return new THeaderFooter(); "tmargins": @@ -139,24 +147,48 @@ Begin return new TPageLayout(); "tappproperty": return new TAppProperty(); + "tcoreproperty": + return new TCoreProperty(); "tbr": return new TBr(); "twfont": return new TwFont(); "twrpr": return new TwrPr(); + "tnumpr": + return new TNumPr(); + "ttextbox": + return new TTextBox(); "twppr": return new TwpPr(); "tcnvgraphicframepr": return new TcNvGraphicFramePr(); "tnvpicpr": return new TnvPicPr(); + "tcnvpr": + return new TCNvPr(); + "textlst": + return new TExtLst(); + "taext": + return new TAext(); "tprstgeom": return new TprstGeom(); + "tblipfill": + return new TblipFill(); + "twline": + return new TwLine(); "tpicsppr": return new TpicsPpr(); - "tfill": - return new TFill(); + "tblip": + return new TBlip(); + "tstretch": + return new TStretch(); + "tref": + return new TRef(); + "tscheme": + return new TScheme(); + "txdrstyle": + return new TXdrStyle(); "tpic": return new TPic(); "tgraphicdata": @@ -167,20 +199,62 @@ Begin return new TwInline(); "twdrawing": return new TwDrawing(); + "tinstrtext": + return new TInstrText(); "trun": return new TRun(); + "tbookmark": + return new TBookMark(); + "tfldsimple": + return new TFldSimple(); "tparagraph": return new TParagraph(); "twbody": return new TwBody(); + "toptinfo": + return new TOptInfo(); + "trevision": + return new TRevision(); + "tdoccomment": + return new TDocComment(); + "tcol": + return new TCol(); + "tcols": + return new TCols(); + "tpagemargin": + return new TPageMargin(); + "tdocgrid": + return new TDocGrid(); + "treference": + return new TReference(); + "tpageborders": + return new TPageBorders(); + "tpage": + return new TPage(); + "tdocsection": + return new TDocSection(); + "tcellmerge": + return new TcellMerge(); "twtcpr": return new TwTcPr(); "twtc": return new TwTc(); "twtrpr": return new TwTrPr(); + "twshading": + return new TwShading(); + "ttblcellmar": + return new TTblCellMar(); + "ttblprex": + return new TTblPrEx(); "twtr": return new TwTr(); + "twborder": + return new TwBorder(); + "twtblborders": + return new TwTblBorders(); + "twtblppr": + return new TwTblpPr(); "twtblpr": return new TwTblPr(); "twgridcol": @@ -193,50 +267,92 @@ Begin return new TCoreProperties(); "tpicture": return new TPicture(); - "tgradient": - return new TGradient(); + "tpbdr": + return new TpBdr(); + "tlatentstyle": + return new TLatentStyle(); + "ttblstylepr": + return new TtblStylePr(); + "tdocxstyle": + return new TDocxStyle(); + "tdocpartobj": + return new TDocPartObj(); + "tstdpr": + return new TStdPr(); + "tstdendpr": + return new TStdEndPr(); + "tsdtcontent": + return new TSdtContent(); + "ttablecontentimpl": + return new TTableContentImpl(); + "ttabstops": + return new TTabStops(); + "ttabstop": + return new TTabStop(); + "tnumber": + return new TNumber(); + "tlevel": + return new TLevel(); + "tnumstyle": + return new TNumStyle(); + "texceltable": + return new TExcelTable(); + "ttablestyle": + return new TTableStyle(); + "tbreak": + return new TBreak(); End; End; /////////////////////////////////////////////////////////////// /// TFont /////////////////////////////////////////////////////////////// -type TFont=class(NodeInfo) - Function Create(); overload; - Begin - Create('font'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TFont=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'font'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"background", "obj":Background,"attrEx":"","nodeType":"","attrName":""),("name":"b", "obj":Bold,"attrEx":"","nodeType":"empty","attrName":"") - ,("name":"color", "obj":Color,"attrEx":"","nodeType":"","attrName":"rgb"),("name":"color", "obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"") - ,("name":"fontstyle", "obj":FontStyle,"attrEx":"","nodeType":"","attrName":""),("name":"i", "obj":Italic,"attrEx":"","nodeType":"empty","attrName":"") - ,("name":"name", "obj":Name,"attrEx":"","nodeType":"","attrName":""),("name":"outlinefont", "obj":OutlineFont,"attrEx":"","nodeType":"","attrName":"") - ,("name":"shadow", "obj":Shadow,"attrEx":"","nodeType":"","attrName":""),("name":"sz", "obj":Size,"attrEx":"","nodeType":"","attrName":"") - ,("name":"strike", "obj":Strikethrough,"attrEx":"","nodeType":"empty","attrName":""),("name":"subscript", "obj":Subscript,"attrEx":"","nodeType":"","attrName":"") - ,("name":"superscript", "obj":Superscript,"attrEx":"","nodeType":"","attrName":""),("name":"u", "obj":Underline,"attrEx":"","nodeType":"empty_string","attrName":"") - ,("name":"color", "obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":""),("name":"tintandshade", "obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"") - ,("name":"scheme", "obj":ThemeFont,"attrEx":"","nodeType":"","attrName":""),("name":"vertAlign", "obj":Script,"attrEx":"","nodeType":"","attrName":"") - ,("name":"charset", "obj":Charset,"attrEx":"","nodeType":"","attrName":""),("name":"rFont", "obj":rFont,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Background","name":"background","obj":Background,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Bold","name":"b","obj":Bold,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Color","name":"color","obj":Color,"attrEx":"","nodeType":"","attrName":"rgb", "desc":"", "class":"") + ,("field":"ColorIndex","name":"color","obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"FontStyle","name":"fontstyle","obj":FontStyle,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Italic","name":"i","obj":Italic,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Name","name":"name","obj":Name,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"OutlineFont","name":"outlinefont","obj":OutlineFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Shadow","name":"shadow","obj":Shadow,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Size","name":"sz","obj":Size,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Strikethrough","name":"strike","obj":Strikethrough,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Subscript","name":"subscript","obj":Subscript,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Superscript","name":"superscript","obj":Superscript,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Underline","name":"u","obj":Underline,"attrEx":"","nodeType":"empty_string","attrName":"", "desc":"", "class":"") + ,("field":"ThemeColor","name":"color","obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"TintAndShade","name":"tintandshade","obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ThemeFont","name":"scheme","obj":ThemeFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Script","name":"vertAlign","obj":Script,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Charset","name":"charset","obj":Charset,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"rFont","name":"rFont","obj":rFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -268,43 +384,42 @@ End; /////////////////////////////////////////////////////////////// /// TComment /////////////////////////////////////////////////////////////// -type TComment=class(NodeInfo) - Function Create(); overload; - Begin - Create('r'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Visible := new BOOL('Visible'); - Font := new TFont('rPr'); +type TComment=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'r'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Font := new TFont(self, 'rPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":Visible.NodeName, "obj":Visible,"attrEx":"","nodeType":"","attrName":""),("name":Font.NodeName, "obj":Font,"attrEx":"","nodeType":"","attrName":"") - ,("name":"t", "obj":Text,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"t", "obj":Space,"attrEx":"xml:space","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Font","name":Font.NodeName,"obj":Font,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TFont") + ,("field":"Text","name":"t","obj":Text,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Space","name":"t","obj":Space,"attrEx":"xml:space","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; //Attributes //Nodes - Visible; Font; Text; Space; @@ -313,50 +428,50 @@ End; /////////////////////////////////////////////////////////////// /// TComments /////////////////////////////////////////////////////////////// -type TComments=class(NodeInfo) - Function Create(); overload; - Begin - Create('comment/text'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TComments=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'comment/text'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('authorId':AuthorId,'ref':Ref) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("AuthorId", "authorId", AuthorId, ""),("Ref", "ref", Ref, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; - Function AddComment(text); - Begin - o := new TComment("r"); - ExtNodes[ length(ExtNodes) ] := array("name":"r", "obj":o, "attrEx":"", "nodeType":""); - o.Text := text; - o.Font.Bold := ""; - o.Font.Size := 9; - o.Font.rFont := "宋体"; - o.Font.Charset := 134; - return o; - End; - - Function Comment(index); - Begin - return GetNode(index); + Function AddComment(text); + Begin + o := new TComment(self, "r"); + ExtNodes[ length(ExtNodes) ] := array("field":"", "name":"r", "obj":o, "attrEx":"", "nodeType":""); + o.Text := text; + o.Font.Bold := ""; + o.Font.Size := 9; + o.Font.rFont := "宋体"; + o.Font.Charset := 134; + return o; + End; + + Function Comment(index); + Begin + return GetNode(index); End; //Attributes @@ -369,46 +484,46 @@ End; /////////////////////////////////////////////////////////////// /// TRichText /////////////////////////////////////////////////////////////// -type TRichText=class(NodeInfo) - Function Create(); overload; - Begin - Create('si'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TRichText=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'si'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; - Function AddText(text); - Begin - o := new TComment("r"); - ExtNodes[ length(ExtNodes) ] := array("name":"r", "obj":o, "attrEx":"", "nodeType":""); - o.Text := text; - return o; - End; - - Function RichText(index); - Begin - return GetNode(index); + Function AddText(text); + Begin + o := new TComment(self, "r"); + ExtNodes[ length(ExtNodes) ] := array("field":"", "name":"r", "obj":o, "attrEx":"", "nodeType":""); + o.Text := text; + return o; + End; + + Function RichText(index); + Begin + return GetNode(index); End; //Attributes @@ -419,34 +534,36 @@ End; /////////////////////////////////////////////////////////////// /// TxdrFromTo /////////////////////////////////////////////////////////////// -type TxdrFromTo=class(NodeInfo) - Function Create(); overload; - Begin - Create('xdr:from'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TxdrFromTo=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'xdr:from'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"xdr:col", "obj":Col,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"xdr:colOff", "obj":ColOff,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":"xdr:row", "obj":Row,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"xdr:rowOff", "obj":RowOff,"attrEx":"","nodeType":"pcdata","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Col","name":"xdr:col","obj":Col,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"ColOff","name":"xdr:colOff","obj":ColOff,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Row","name":"xdr:row","obj":Row,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"RowOff","name":"xdr:rowOff","obj":RowOff,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -462,32 +579,32 @@ End; /////////////////////////////////////////////////////////////// /// TOff /////////////////////////////////////////////////////////////// -type TOff=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:off'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TOff=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:off'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('x':X,'y':Y) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("X", "x", X, ""),("Y", "y", Y, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -501,32 +618,32 @@ End; /////////////////////////////////////////////////////////////// /// TExt /////////////////////////////////////////////////////////////// -type TExt=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:ext'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TExt=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:ext'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('cx':Cx,'cy':Cy) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Cx", "cx", Cx, ""),("Cy", "cy", Cy, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -540,35 +657,36 @@ End; /////////////////////////////////////////////////////////////// /// TXfrm /////////////////////////////////////////////////////////////// -type TXfrm=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:xfrm'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Off := new TOff('a:off'); - Ext := new TExt('a:ext'); +type TXfrm=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:xfrm'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Off := new TOff(self, 'a:off'); + Ext := new TExt(self, 'a:ext'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":Off.NodeName, "obj":Off,"attrEx":"","nodeType":"","attrName":""),("name":Ext.NodeName, "obj":Ext,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Off","name":Off.NodeName,"obj":Off,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TOff") + ,("field":"Ext","name":Ext.NodeName,"obj":Ext,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TExt") ) union ExtNodes; End; @@ -582,38 +700,39 @@ End; /////////////////////////////////////////////////////////////// /// TClientData /////////////////////////////////////////////////////////////// -type TClientData=class(NodeInfo) - Function Create(); overload; - Begin - Create('x:ClientData'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TClientData=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'x:ClientData'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin ObjectType := "Note"; - MoveWithCells := ""; - SizeWithCells := ""; //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('ObjectType':ObjectType) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("ObjectType", "ObjectType", ObjectType, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"x:MoveWithCells", "obj":MoveWithCells,"attrEx":"","nodeType":"empty","attrName":""),("name":"x:SizeWithCells", "obj":SizeWithCells,"attrEx":"","nodeType":"empty","attrName":"") - ,("name":"x:Anchor", "obj":Anchor,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"x:AutoFill", "obj":AutoFill,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":"x:Row", "obj":Row,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"x:Column", "obj":Column,"attrEx":"","nodeType":"pcdata","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"MoveWithCells","name":"x:MoveWithCells","obj":MoveWithCells,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"SizeWithCells","name":"x:SizeWithCells","obj":SizeWithCells,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Anchor","name":"x:Anchor","obj":Anchor,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"AutoFill","name":"x:AutoFill","obj":AutoFill,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Row","name":"x:Row","obj":Row,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Column","name":"x:Column","obj":Column,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -632,80 +751,86 @@ End; /////////////////////////////////////////////////////////////// /// TGraphicFramePr /////////////////////////////////////////////////////////////// -type TGraphicFramePr=class(NodeInfo) - Function Create(); overload; - Begin - Create('xdr:cNvGraphicFramePr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TGraphicFramePr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'xdr:cNvGraphicFramePr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"xdr:cNvPr", "obj":Name,"attrEx":"name","nodeType":"","attrName":""),("name":"xdr:cNvPr", "obj":Id,"attrEx":"id","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Id","name":"xdr:cNvPr","obj":Id,"attrEx":"id","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Name","name":"xdr:cNvPr","obj":Name,"attrEx":"name","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"cNvGraphicFramePr","name":"xdr:cNvGraphicFramePr","obj":cNvGraphicFramePr,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; //Attributes //Nodes - Name; Id; + Name; + cNvGraphicFramePr; End; /////////////////////////////////////////////////////////////// /// TGraphicFrame /////////////////////////////////////////////////////////////// -type TGraphicFrame=class(NodeInfo) - Function Create(); overload; - Begin - Create('xdr:graphicFrame'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - GraphicFramePr := new TGraphicFramePr('xdr:nvGraphicFramePr'); - Xfrm := new TXfrm('xdr:xfrm'); - Graphic := new TGraphic('a:graphic'); +type TGraphicFrame=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'xdr:graphicFrame'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + GraphicFramePr := new TGraphicFramePr(self, 'xdr:nvGraphicFramePr'); + Xfrm := new TXfrm(self, 'xdr:xfrm'); + Graphic := new TGraphic(self, 'a:graphic'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("macro", "macro", macro, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":GraphicFramePr.NodeName, "obj":GraphicFramePr,"attrEx":"","nodeType":"","attrName":""),("name":Xfrm.NodeName, "obj":Xfrm,"attrEx":"","nodeType":"","attrName":"") - ,("name":Graphic.NodeName, "obj":Graphic,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"GraphicFramePr","name":GraphicFramePr.NodeName,"obj":GraphicFramePr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TGraphicFramePr") + ,("field":"Xfrm","name":Xfrm.NodeName,"obj":Xfrm,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TXfrm") + ,("field":"Graphic","name":Graphic.NodeName,"obj":Graphic,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TGraphic") + ) union ExtNodes; End; //Attributes + macro; //Nodes GraphicFramePr; @@ -716,37 +841,43 @@ End; /////////////////////////////////////////////////////////////// /// TtwoCellAnchor /////////////////////////////////////////////////////////////// -type TtwoCellAnchor=class(NodeInfo) - Function Create(); overload; - Begin - Create('xdr:twoCellAnchor'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - XFrom := new TxdrFromTo('xdr:from'); - XTo := new TxdrFromTo('xdr:to'); - GraphicFrame := new TGraphicFrame('xdr:graphicFrame'); +type TtwoCellAnchor=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'xdr:twoCellAnchor'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + XFrom := new TxdrFromTo(self, 'xdr:from'); + XTo := new TxdrFromTo(self, 'xdr:to'); + GraphicFrame := new TGraphicFrame(self, 'xdr:graphicFrame'); + Pic := new TPic(self, 'xdr:pic'); + ClientData := new TClientData(self, 'xdr:clientData'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('editAs':EditAs) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("EditAs", "editAs", EditAs, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":XFrom.NodeName, "obj":XFrom,"attrEx":"","nodeType":"","attrName":""),("name":XTo.NodeName, "obj":XTo,"attrEx":"","nodeType":"","attrName":"") - ,("name":GraphicFrame.NodeName, "obj":GraphicFrame,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"XFrom","name":XFrom.NodeName,"obj":XFrom,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TxdrFromTo") + ,("field":"XTo","name":XTo.NodeName,"obj":XTo,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TxdrFromTo") + ,("field":"GraphicFrame","name":GraphicFrame.NodeName,"obj":GraphicFrame,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TGraphicFrame") + ,("field":"Pic","name":Pic.NodeName,"obj":Pic,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TPic") + ,("field":"ClientData","name":ClientData.NodeName,"obj":ClientData,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"TClientData") + ) union ExtNodes; End; //Attributes @@ -756,65 +887,226 @@ type TtwoCellAnchor=class(NodeInfo) XFrom; XTo; GraphicFrame; + Pic; + ClientData; End; /////////////////////////////////////////////////////////////// -/// TChart +/// TcNvPicPr /////////////////////////////////////////////////////////////// -type TChart=class(NodeInfo) - Function Create(); overload; - Begin - Create('t:chart'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Series := array(); - XAxis := new TChartAxis('XAxis'); - YAxis := new TChartAxis('YAxis'); - Legend := new TLegend('Legend'); - Plotarea := new TPlot('Plotarea'); +type TcNvPicPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'xdr:cNvPicPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"BegColOff", "obj":BegColOff,"attrEx":"","nodeType":"","attrName":""),("name":"BegRowOff", "obj":BegRowOff,"attrEx":"","nodeType":"","attrName":"") - ,("name":"EndColOff", "obj":EndColOff,"attrEx":"","nodeType":"","attrName":""),("name":"EndRowOff", "obj":EndRowOff,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Name", "obj":Name,"attrEx":"","nodeType":"","attrName":""),("name":"Title", "obj":Title,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Type", "obj":Type,"attrEx":"","nodeType":"","attrName":""),("name":"VaryColors", "obj":VaryColors,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ShowLegendKey", "obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":""),("name":"ShowVal", "obj":ShowVal,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ShowCatName", "obj":ShowCatName,"attrEx":"","nodeType":"","attrName":""),("name":"ShowSerName", "obj":ShowSerName,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ShowBubbleSize", "obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":""),("name":"ShowPercent", "obj":ShowPercent,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ShowLeaderLines", "obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":""),("name":"Ord", "obj":Ord,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Series", "obj":Series,"attrEx":"","nodeType":"","attrName":""),("name":XAxis.NodeName, "obj":XAxis,"attrEx":"","nodeType":"","attrName":"") - ,("name":YAxis.NodeName, "obj":YAxis,"attrEx":"","nodeType":"","attrName":""),("name":Legend.NodeName, "obj":Legend,"attrEx":"","nodeType":"","attrName":"") - ,("name":Plotarea.NodeName, "obj":Plotarea,"attrEx":"","nodeType":"","attrName":""),("name":"ShowBlanksAs", "obj":ShowBlanksAs,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ChartNode", "obj":ChartNode,"attrEx":"","nodeType":"","attrName":""),("name":"C", "obj":C,"attrEx":"","nodeType":"","attrName":"") - ,("name":"xmlObj", "obj":xmlObj,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; - End; - - Function AddSeries(Name, Categories, Value); - Begin - Series union= array(("Name":Name,"Categories":Categories,"Values":Value)); + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"PicLocks","name":"a:picLocks","obj":PicLocks,"attrEx":"noChangeAspect","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes //Nodes + PicLocks; +End; + +/////////////////////////////////////////////////////////////// +/// TPictureFormat +/////////////////////////////////////////////////////////////// +type TPictureFormat=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, ''); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + BegColOff := 0; + BegRowOff := 0; + EndColOff := 0; + EndRowOff := 0; + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"BegColOff","name":"BegColOff","obj":BegColOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"BegRowOff","name":"BegRowOff","obj":BegRowOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"EndColOff","name":"EndColOff","obj":EndColOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"EndRowOff","name":"EndRowOff","obj":EndRowOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + BegColOff; + BegRowOff; + EndColOff; + EndRowOff; +End; + +/////////////////////////////////////////////////////////////// +/// TShapeFormat +/////////////////////////////////////////////////////////////// +type TShapeFormat=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, ''); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"BegColOff","name":"BegColOff","obj":BegColOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"BegRowOff","name":"BegRowOff","obj":BegRowOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"EndColOff","name":"EndColOff","obj":EndColOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"EndRowOff","name":"EndRowOff","obj":EndRowOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + Function AddText(text); + Begin + o := new TaP(self, "a:p"); + o.R.T := text; + o.R.Rpr.Lang := "en-US"; + o.R.Rpr.AltLang := "zh-CN"; + o.R.Rpr.SZ := 2400; + o.Ppr.Algn := "l"; + ExtNodes[ length(ExtNodes) ] := array("field":"", "name":"a:p", "obj":o, "attrEx":"", "nodeType":""); + return o; + End; + + //Attributes + + //Nodes + BegColOff; + BegRowOff; + EndColOff; + EndRowOff; +End; + +/////////////////////////////////////////////////////////////// +/// TChartImpl +/////////////////////////////////////////////////////////////// +type TChartImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 't:chart'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Series := array(); + XAxis := new TChartAxis(self, 'XAxis'); + YAxis := new TChartAxis(self, 'YAxis'); + Legend := new TLegend(self, 'c:legend'); + Plotarea := new TplotArea(self, 'c:plotArea'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Width","name":"Width","obj":Width,"attrEx":"","nodeType":"","attrName":"", "desc":"word图表宽度(cm)", "class":"") + ,("field":"Height","name":"Height","obj":Height,"attrEx":"","nodeType":"","attrName":"", "desc":"word图表高度(cm)", "class":"") + ,("field":"BegColOff","name":"BegColOff","obj":BegColOff,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"BegRowOff","name":"BegRowOff","obj":BegRowOff,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"EndColOff","name":"EndColOff","obj":EndColOff,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"EndRowOff","name":"EndRowOff","obj":EndRowOff,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"Name","name":"Name","obj":Name,"attrEx":"","nodeType":"","attrName":"", "desc":"图表名称", "class":"") + ,("field":"Title","name":"Title","obj":Title,"attrEx":"","nodeType":"","attrName":"", "desc":"图表标题", "class":"") + ,("field":"Type","name":"Type","obj":Type,"attrEx":"","nodeType":"","attrName":"", "desc":"图表类型", "class":"") + ,("field":"VaryColors","name":"VaryColors","obj":VaryColors,"attrEx":"","nodeType":"","attrName":"", "desc":"varyColors (按点) 改变颜色,此元素指定系列中的每个数据标记具有不同的颜色。", "class":"") + ,("field":"ShowLegendKey","name":"ShowLegendKey","obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":"", "desc":"如果数据标签的图例项标示可见,则该属性值为 True,读/写 Boolean。", "class":"") + ,("field":"ShowVal","name":"ShowVal","obj":ShowVal,"attrEx":"","nodeType":"","attrName":"", "desc":"允许用户在图表中显示数据标签的值,读/写 Boolean。", "class":"") + ,("field":"ShowCatName","name":"ShowCatName","obj":ShowCatName,"attrEx":"","nodeType":"","attrName":"", "desc":"允许用户在图表中显示数据标签的分类名称,读/写 Boolean。", "class":"") + ,("field":"ShowSerName","name":"ShowSerName","obj":ShowSerName,"attrEx":"","nodeType":"","attrName":"", "desc":"允许用户在图表中显示数据标签的系列名称,读/写 Boolean。", "class":"") + ,("field":"ShowBubbleSize","name":"ShowBubbleSize","obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":"", "desc":"允许用户在图表中显示数据标签的气泡大小,读/写 Boolean", "class":"") + ,("field":"ShowPercent","name":"ShowPercent","obj":ShowPercent,"attrEx":"","nodeType":"","attrName":"", "desc":"允许用户在图表中显示数据标签的百分比数值,读/写 Boolean。", "class":"") + ,("field":"ShowLeaderLines","name":"ShowLeaderLines","obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":"", "desc":"如果数据系列有引导线,则该属性值为 True,读/写 Boolean。", "class":"") + ,("field":"DataTable","name":"DataTable","obj":DataTable,"attrEx":"","nodeType":"","attrName":"", "desc":"显示数据表,读/写 Boolean。", "class":"") + ,("field":"Ord","name":"Ord","obj":Ord,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"Series","name":"w:ser","obj":Series,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"XAxis","name":XAxis.NodeName,"obj":XAxis,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TChartAxis") + ,("field":"YAxis","name":YAxis.NodeName,"obj":YAxis,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TChartAxis") + ,("field":"Legend","name":Legend.NodeName,"obj":Legend,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TLegend") + ,("field":"Plotarea","name":Plotarea.NodeName,"obj":Plotarea,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TplotArea") + ,("field":"ShowBlanksAs","name":"ShowBlanksAs","obj":ShowBlanksAs,"attrEx":"","nodeType":"","attrName":"", "desc":"此元素指定如何在图表上绘制空白单元格。", "class":"") + ,("field":"ChartNode","name":"ChartNode","obj":ChartNode,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"C","name":"C","obj":C,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"xmlObj","name":"xmlObj","obj":xmlObj,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"Rid","name":"Rid","obj":Rid,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Width; + Height; BegColOff; BegRowOff; EndColOff; @@ -830,6 +1122,7 @@ type TChart=class(NodeInfo) ShowBubbleSize; ShowPercent; ShowLeaderLines; + DataTable; Ord; Series; XAxis; @@ -840,136 +1133,114 @@ type TChart=class(NodeInfo) ChartNode; C; xmlObj; + Rid; End; /////////////////////////////////////////////////////////////// /// TLegend /////////////////////////////////////////////////////////////// -type TLegend=class(NodeInfo) - Function Create(); overload; - Begin - Create('legend'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TLegend=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:legend'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"ShowLegendKey", "obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":""),("name":"Position", "obj":Position,"attrEx":"","nodeType":"","attrName":"") - ,("name":"None", "obj":None,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; - End; - - //Attributes - - //Nodes - ShowLegendKey; - Position; - None; -End; - -/////////////////////////////////////////////////////////////// -/// TPlot -/////////////////////////////////////////////////////////////// -type TPlot=class(NodeInfo) - Function Create(); overload; - Begin - Create('TPlot'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - //TODO... - End; - - Function GetAttrs(); override; - Begin - HandleAttrs(); - return ExtAttr; - End; - - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"ShowBubbleSize", "obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":""),("name":"ShowCatName", "obj":ShowCatName,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ShowLeaderLines", "obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":""),("name":"ShowPercent", "obj":ShowPercent,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ShowSerName", "obj":ShowSerName,"attrEx":"","nodeType":"","attrName":""),("name":"ShowVal", "obj":ShowVal,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"legendPos","name":"c:legendPos","obj":legendPos,"attrEx":"val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Layout","name":"c:layout","obj":Layout,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"overlay","name":"c:overlay","obj":overlay,"attrEx":"val","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; + Property Position write setPosition; + Function setPosition(t); + Begin + m := array("bottom": "b", + "left": "l", + "right": "r", + "top": "t", + "top_right": "tr"); + legendPos := m[t]; + End; + //Attributes //Nodes - ShowBubbleSize; - ShowCatName; - ShowLeaderLines; - ShowPercent; - ShowSerName; - ShowVal; + legendPos; + Layout; + overlay; End; /////////////////////////////////////////////////////////////// /// TChartAxis /////////////////////////////////////////////////////////////// -type TChartAxis=class(NodeInfo) - Function Create(); overload; - Begin - Create('ChartAxis'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - NumFont := new TNumFont('NumFont'); - NameLayout := new TNameLayout('NameLayout'); +type TChartAxis=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'ChartAxis'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + NumFont := new TNumFont(self, 'NumFont'); + NameLayout := new TNameLayout(self, 'NameLayout'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"None", "obj":None,"attrEx":"","nodeType":"","attrName":""),("name":"Crossing", "obj":Crossing,"attrEx":"","nodeType":"","attrName":"") - ,("name":"MajorGridlines", "obj":MajorGridlines,"attrEx":"","nodeType":"","attrName":""),("name":"MinorGridlines", "obj":MinorGridlines,"attrEx":"","nodeType":"","attrName":"") - ,("name":"MajorTickMark", "obj":MajorTickMark,"attrEx":"","nodeType":"","attrName":""),("name":"MinorTickMark", "obj":MinorTickMark,"attrEx":"","nodeType":"","attrName":"") - ,("name":"MinorUnitType", "obj":MinorUnitType,"attrEx":"","nodeType":"","attrName":""),("name":"MajorUnit", "obj":MajorUnit,"attrEx":"","nodeType":"","attrName":"") - ,("name":"MajorUnitType", "obj":MajorUnitType,"attrEx":"","nodeType":"","attrName":""),("name":"TickLabelSkip", "obj":TickLabelSkip,"attrEx":"","nodeType":"","attrName":"") - ,("name":"DisplayUnits", "obj":DisplayUnits,"attrEx":"","nodeType":"","attrName":""),("name":"DisplayUnitsVisible", "obj":DisplayUnitsVisible,"attrEx":"","nodeType":"","attrName":"") - ,("name":"DateAxis", "obj":DateAxis,"attrEx":"","nodeType":"","attrName":""),("name":"ReverseOrder", "obj":ReverseOrder,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Max", "obj":Max,"attrEx":"","nodeType":"","attrName":""),("name":"Min", "obj":Min,"attrEx":"","nodeType":"","attrName":"") - ,("name":"NumFormat", "obj":NumFormat,"attrEx":"","nodeType":"","attrName":""),("name":NumFont.NodeName, "obj":NumFont,"attrEx":"","nodeType":"","attrName":"") - ,("name":"LogBase", "obj":LogBase,"attrEx":"","nodeType":"","attrName":""),("name":NameLayout.NodeName, "obj":NameLayout,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"None","name":"None","obj":None,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Crossing","name":"Crossing","obj":Crossing,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MajorGridlines","name":"MajorGridlines","obj":MajorGridlines,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MinorGridlines","name":"MinorGridlines","obj":MinorGridlines,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MajorTickMark","name":"MajorTickMark","obj":MajorTickMark,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MinorTickMark","name":"MinorTickMark","obj":MinorTickMark,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MinorUnitType","name":"MinorUnitType","obj":MinorUnitType,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MajorUnit","name":"MajorUnit","obj":MajorUnit,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MajorUnitType","name":"MajorUnitType","obj":MajorUnitType,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"TickLabelSkip","name":"TickLabelSkip","obj":TickLabelSkip,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"DisplayUnits","name":"DisplayUnits","obj":DisplayUnits,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"DisplayUnitsVisible","name":"DisplayUnitsVisible","obj":DisplayUnitsVisible,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"DateAxis","name":"DateAxis","obj":DateAxis,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ReverseOrder","name":"ReverseOrder","obj":ReverseOrder,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Max","name":"Max","obj":Max,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Min","name":"Min","obj":Min,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"NumFormat","name":"NumFormat","obj":NumFormat,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"NumFont","name":NumFont.NodeName,"obj":NumFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TNumFont") + ,("field":"LogBase","name":"LogBase","obj":LogBase,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"NameLayout","name":NameLayout.NodeName,"obj":NameLayout,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TNameLayout") ) union ExtNodes; End; @@ -1001,34 +1272,36 @@ End; /////////////////////////////////////////////////////////////// /// TNumFont /////////////////////////////////////////////////////////////// -type TNumFont=class(NodeInfo) - Function Create(); overload; - Begin - Create('NumFont'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TNumFont=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'NumFont'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"Color", "obj":Color,"attrEx":"","nodeType":"","attrName":""),("name":"Bold", "obj":Bold,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Italic", "obj":Italic,"attrEx":"","nodeType":"","attrName":""),("name":"Underline", "obj":Underline,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Color","name":"Color","obj":Color,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Bold","name":"Bold","obj":Bold,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Italic","name":"Italic","obj":Italic,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Underline","name":"Underline","obj":Underline,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -1044,34 +1317,36 @@ End; /////////////////////////////////////////////////////////////// /// TNameLayout /////////////////////////////////////////////////////////////// -type TNameLayout=class(NodeInfo) - Function Create(); overload; - Begin - Create('NameLayout'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TNameLayout=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'NameLayout'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"X", "obj":X,"attrEx":"","nodeType":"","attrName":""),("name":"Y", "obj":Y,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Width", "obj":Width,"attrEx":"","nodeType":"","attrName":""),("name":"Height", "obj":Height,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"X","name":"X","obj":X,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Y","name":"Y","obj":Y,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Width","name":"Width","obj":Width,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Height","name":"Height","obj":Height,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -1087,33 +1362,34 @@ End; /////////////////////////////////////////////////////////////// /// Tpt /////////////////////////////////////////////////////////////// -type Tpt=class(NodeInfo) - Function Create(); overload; - Begin - Create('pt'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type Tpt=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:pt'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('idx':IDx) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("IDx", "idx", IDx, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"v", "obj":V,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"V","name":"c:v","obj":V,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes @@ -1126,34 +1402,35 @@ End; /////////////////////////////////////////////////////////////// /// TStrCache /////////////////////////////////////////////////////////////// -type TStrCache=class(NodeInfo) - Function Create(); overload; - Begin - Create('strRef'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Pt := new Tpt('pt'); +type TStrCache=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:strRef'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Pt := new Tpt(self, 'c:pt'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"ptCount", "obj":PtCount,"attrEx":"","nodeType":"","attrName":""),("name":Pt.NodeName, "obj":Pt,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"PtCount","name":"c:ptCount","obj":PtCount,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Pt","name":Pt.NodeName,"obj":Pt,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"Tpt") ) union ExtNodes; End; @@ -1167,34 +1444,35 @@ End; /////////////////////////////////////////////////////////////// /// TStrRef /////////////////////////////////////////////////////////////// -type TStrRef=class(NodeInfo) - Function Create(); overload; - Begin - Create('strRef'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - StrCache := new TStrCache('strCache'); +type TStrRef=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:strRef'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + StrCache := new TStrCache(self, 'c:strCache'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"f", "obj":F,"attrEx":"","nodeType":"pcdata","attrName":""),("name":StrCache.NodeName, "obj":StrCache,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"F","name":"c:f","obj":F,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"StrCache","name":StrCache.NodeName,"obj":StrCache,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStrCache") ) union ExtNodes; End; @@ -1208,34 +1486,35 @@ End; /////////////////////////////////////////////////////////////// /// TcCat /////////////////////////////////////////////////////////////// -type TcCat=class(NodeInfo) - Function Create(); overload; - Begin - Create('cat'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - StrRef := new TStrRef('strRef'); +type TcCat=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:cat'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + StrRef := new TStrRef(self, 'c:strRef'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":StrRef.NodeName, "obj":StrRef,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"StrRef","name":StrRef.NodeName,"obj":StrRef,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStrRef") + ) union ExtNodes; End; //Attributes @@ -1247,35 +1526,37 @@ End; /////////////////////////////////////////////////////////////// /// TNumCache /////////////////////////////////////////////////////////////// -type TNumCache=class(NodeInfo) - Function Create(); overload; - Begin - Create('numCache'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Pt := new Tpt('pt'); +type TNumCache=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:numCache'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Pt := new Tpt(self, 'c:pt'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"formatCode", "obj":FormatCode,"attrEx":"","nodeType":"","attrName":""),("name":"ptCount", "obj":PtCount,"attrEx":"","nodeType":"","attrName":"") - ,("name":Pt.NodeName, "obj":Pt,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"FormatCode","name":"c:formatCode","obj":FormatCode,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"PtCount","name":"c:ptCount","obj":PtCount,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Pt","name":Pt.NodeName,"obj":Pt,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"Tpt") + ) union ExtNodes; End; //Attributes @@ -1289,34 +1570,35 @@ End; /////////////////////////////////////////////////////////////// /// TNumRef /////////////////////////////////////////////////////////////// -type TNumRef=class(NodeInfo) - Function Create(); overload; - Begin - Create('numRef'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - NumCache := new TNumCache('numCache'); +type TNumRef=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:numRef'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + NumCache := new TNumCache(self, 'c:numCache'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"f", "obj":F,"attrEx":"","nodeType":"pcdata","attrName":""),("name":NumCache.NodeName, "obj":NumCache,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"F","name":"c:f","obj":F,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"NumCache","name":NumCache.NodeName,"obj":NumCache,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TNumCache") ) union ExtNodes; End; @@ -1330,34 +1612,35 @@ End; /////////////////////////////////////////////////////////////// /// TcVal /////////////////////////////////////////////////////////////// -type TcVal=class(NodeInfo) - Function Create(); overload; - Begin - Create('val'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - NumRef := new TNumRef('numRef'); +type TcVal=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:val'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + NumRef := new TNumRef(self, 'c:numRef'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":NumRef.NodeName, "obj":NumRef,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"NumRef","name":NumRef.NodeName,"obj":NumRef,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TNumRef") + ) union ExtNodes; End; //Attributes @@ -1369,34 +1652,35 @@ End; /////////////////////////////////////////////////////////////// /// TTx /////////////////////////////////////////////////////////////// -type TTx=class(NodeInfo) - Function Create(); overload; - Begin - Create('tx'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - StrRef := new TStrRef('strRef'); +type TTx=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:tx'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + StrRef := new TStrRef(self, 'c:strRef'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":StrRef.NodeName, "obj":StrRef,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"StrRef","name":StrRef.NodeName,"obj":StrRef,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStrRef") + ) union ExtNodes; End; //Attributes @@ -1408,34 +1692,35 @@ End; /////////////////////////////////////////////////////////////// /// TSolidFill /////////////////////////////////////////////////////////////// -type TSolidFill=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:solidFill'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SchemeClr := new TSchemeClr('a:schemeClr'); +type TSolidFill=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:solidFill'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SchemeClr := new TSchemeClr(self, 'a:schemeClr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":SchemeClr.NodeName, "obj":SchemeClr,"attrEx":"","nodeType":"","attrName":""),("name":"a:srgbClr", "obj":SrgbClr,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"SchemeClr","name":SchemeClr.NodeName,"obj":SchemeClr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSchemeClr") + ,("field":"SrgbClr","name":"a:srgbClr","obj":SrgbClr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -1449,33 +1734,34 @@ End; /////////////////////////////////////////////////////////////// /// TSchemeClr /////////////////////////////////////////////////////////////// -type TSchemeClr=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:schemeClr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TSchemeClr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:schemeClr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('val':Val) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Val", "val", Val, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"a:lumMod", "obj":LumMod,"attrEx":"","nodeType":"","attrName":""),("name":"a:lumOff", "obj":LumOff,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"LumMod","name":"a:lumMod","obj":LumMod,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"LumOff","name":"a:lumOff","obj":LumOff,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -1490,35 +1776,38 @@ End; /////////////////////////////////////////////////////////////// /// TLn /////////////////////////////////////////////////////////////// -type TLn=class(NodeInfo) - Function Create(); overload; - Begin - Create('t:Ln'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SolidFill := new TSolidFill('a:solidFill'); +type TLn=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 't:Ln'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SolidFill := new TSolidFill(self, 'a:solidFill'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('algn':Algn,'cap':Cap,'cmpd':Cmpd,'w':W) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Algn", "algn", Algn, ""),("Cap", "cap", Cap, ""),("Cmpd", "cmpd", Cmpd, ""),("W", "w", W, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"a:noFill", "obj":NoFill,"attrEx":"","nodeType":"","attrName":""),("name":"a:round", "obj":Round,"attrEx":"","nodeType":"","attrName":"") - ,("name":SolidFill.NodeName, "obj":SolidFill,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"NoFill","name":"a:noFill","obj":NoFill,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"prstDash","name":"a:prstDash","obj":prstDash,"attrEx":"val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Round","name":"a:round","obj":Round,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"SolidFill","name":SolidFill.NodeName,"obj":SolidFill,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSolidFill") + ) union ExtNodes; End; //Attributes @@ -1529,6 +1818,7 @@ type TLn=class(NodeInfo) //Nodes NoFill; + prstDash; Round; SolidFill; End; @@ -1536,34 +1826,35 @@ End; /////////////////////////////////////////////////////////////// /// TContourClr /////////////////////////////////////////////////////////////// -type TContourClr=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:contourClr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SchemeClr := new TSchemeClr('a:schemeClr'); +type TContourClr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:contourClr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SchemeClr := new TSchemeClr(self, 'a:schemeClr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":SchemeClr.NodeName, "obj":SchemeClr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"SchemeClr","name":SchemeClr.NodeName,"obj":SchemeClr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSchemeClr") + ) union ExtNodes; End; //Attributes @@ -1575,34 +1866,35 @@ End; /////////////////////////////////////////////////////////////// /// TSp3D /////////////////////////////////////////////////////////////// -type TSp3D=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:sp3d'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - ContourClr := new TContourClr('a:contourClr'); +type TSp3D=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:sp3d'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + ContourClr := new TContourClr(self, 'a:contourClr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('contourW':ContourW) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("ContourW", "contourW", ContourW, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":ContourClr.NodeName, "obj":ContourClr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"ContourClr","name":ContourClr.NodeName,"obj":ContourClr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TContourClr") + ) union ExtNodes; End; //Attributes @@ -1615,38 +1907,45 @@ End; /////////////////////////////////////////////////////////////// /// TspPr /////////////////////////////////////////////////////////////// -type TspPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('spPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SolidFill := new TSolidFill('a:solidFill'); - Ln := new TLn('a:Ln'); - Sp3D := new TSp3D('a:sp3d'); +type TspPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:spPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SolidFill := new TSolidFill(self, 'a:solidFill'); + Ln := new TLn(self, 'a:ln'); + Sp3D := new TSp3D(self, 'a:sp3d'); + XFrm := new TXfrm(self, 'a:xfrm'); + PrstGeom := new TprstGeom(self, 'a:prstGeom'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"a:noFill", "obj":NoFill,"attrEx":"","nodeType":"","attrName":""),("name":SolidFill.NodeName, "obj":SolidFill,"attrEx":"","nodeType":"","attrName":"") - ,("name":Ln.NodeName, "obj":Ln,"attrEx":"","nodeType":"","attrName":""),("name":Sp3D.NodeName, "obj":Sp3D,"attrEx":"","nodeType":"","attrName":"") - ,("name":"a:effectLst", "obj":EffectLst,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"NoFill","name":"a:noFill","obj":NoFill,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"SolidFill","name":SolidFill.NodeName,"obj":SolidFill,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSolidFill") + ,("field":"Ln","name":Ln.NodeName,"obj":Ln,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TLn") + ,("field":"Sp3D","name":Sp3D.NodeName,"obj":Sp3D,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSp3D") + ,("field":"EffectLst","name":"a:effectLst","obj":EffectLst,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"XFrm","name":XFrm.NodeName,"obj":XFrm,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TXfrm") + ,("field":"PrstGeom","name":PrstGeom.NodeName,"obj":PrstGeom,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TprstGeom") + ) union ExtNodes; End; //Attributes @@ -1657,40 +1956,44 @@ type TspPr=class(NodeInfo) Ln; Sp3D; EffectLst; + XFrm; + PrstGeom; End; /////////////////////////////////////////////////////////////// /// TDpt /////////////////////////////////////////////////////////////// -type TDpt=class(NodeInfo) - Function Create(); overload; - Begin - Create('dPt'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SpPr := new TspPr('spPr'); +type TDpt=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:dPt'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SpPr := new TspPr(self, 'c:spPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"idx", "obj":IDx,"attrEx":"","nodeType":"","attrName":""),("name":"bubble3D", "obj":Bubble3D,"attrEx":"","nodeType":"","attrName":"") - ,("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"IDx","name":"c:idx","obj":IDx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Bubble3D","name":"c:bubble3D","obj":Bubble3D,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"SpPr","name":SpPr.NodeName,"obj":SpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TspPr") + ) union ExtNodes; End; //Attributes @@ -1704,35 +2007,37 @@ End; /////////////////////////////////////////////////////////////// /// TMarker /////////////////////////////////////////////////////////////// -type TMarker=class(NodeInfo) - Function Create(); overload; - Begin - Create('marker'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SpPr := new TspPr('spPr'); +type TMarker=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:marker'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SpPr := new TspPr(self, 'c:spPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"symbol", "obj":Symbol,"attrEx":"","nodeType":"","attrName":""),("name":"size", "obj":Size,"attrEx":"","nodeType":"","attrName":"") - ,("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Symbol","name":"c:symbol","obj":Symbol,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Size","name":"c:size","obj":Size,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"SpPr","name":SpPr.NodeName,"obj":SpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TspPr") + ) union ExtNodes; End; //Attributes @@ -1746,50 +2051,60 @@ End; /////////////////////////////////////////////////////////////// /// TSer /////////////////////////////////////////////////////////////// -type TSer=class(NodeInfo) - Function Create(); overload; - Begin - Create('t:chart'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Tx := new TTx('tx'); - SpPr := new TspPr('spPr'); - DPt := new TDpt('dPt'); - DLbls := new TdLbls('dLbls'); - Marker := new TMarker('marker'); - Cat := new TcCat('cat'); - Val := new TcVal('val'); - XVal := new TcCat('xVal'); - YVal := new TcVal('yVal'); - BubbleSize := new TcVal('bubbleSize'); +type TSer=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:ser'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Tx := new TTx(self, 'c:tx'); + SpPr := new TspPr(self, 'c:spPr'); + DPt := new TDpt(self, 'c:dPt'); + DPtEx := array(); + DLbls := new TdLbls(self, 'c:dLbls'); + Marker := new TMarker(self, 'c:marker'); + Cat := new TcCat(self, 'c:cat'); + Val := new TcVal(self, 'c:val'); + XVal := new TcCat(self, 'c:xVal'); + YVal := new TcVal(self, 'c:yVal'); + BubbleSize := new TcVal(self, 'c:bubbleSize'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"idx", "obj":IDx,"attrEx":"","nodeType":"","attrName":""),("name":"order", "obj":Ord,"attrEx":"","nodeType":"","attrName":"") - ,("name":Tx.NodeName, "obj":Tx,"attrEx":"","nodeType":"","attrName":""),("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"") - ,("name":DPt.NodeName, "obj":DPt,"attrEx":"","nodeType":"","attrName":""),("name":DLbls.NodeName, "obj":DLbls,"attrEx":"","nodeType":"","attrName":"") - ,("name":Marker.NodeName, "obj":Marker,"attrEx":"","nodeType":"","attrName":""),("name":"invertIfNegative", "obj":InvertIfNegative,"attrEx":"","nodeType":"","attrName":"") - ,("name":Cat.NodeName, "obj":Cat,"attrEx":"","nodeType":"","attrName":""),("name":Val.NodeName, "obj":Val,"attrEx":"","nodeType":"","attrName":"") - ,("name":XVal.NodeName, "obj":XVal,"attrEx":"","nodeType":"","attrName":""),("name":YVal.NodeName, "obj":YVal,"attrEx":"","nodeType":"","attrName":"") - ,("name":"smooth", "obj":Smooth,"attrEx":"","nodeType":"","attrName":""),("name":BubbleSize.NodeName, "obj":BubbleSize,"attrEx":"","nodeType":"","attrName":"") - ,("name":"bubble3D", "obj":Bubble3D,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"IDx","name":"c:idx","obj":IDx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Ord","name":"c:order","obj":Ord,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Tx","name":Tx.NodeName,"obj":Tx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TTx") + ,("field":"SpPr","name":SpPr.NodeName,"obj":SpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TspPr") + ,("field":"DPt","name":DPt.NodeName,"obj":DPt,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TDpt") + ,("field":"DPtEx","name":"c:dPt","obj":DPtEx,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"", "class":"TDpt") + ,("field":"DLbls","name":DLbls.NodeName,"obj":DLbls,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TdLbls") + ,("field":"Marker","name":Marker.NodeName,"obj":Marker,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TMarker") + ,("field":"InvertIfNegative","name":"c:invertIfNegative","obj":InvertIfNegative,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Cat","name":Cat.NodeName,"obj":Cat,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcCat") + ,("field":"Val","name":Val.NodeName,"obj":Val,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcVal") + ,("field":"XVal","name":XVal.NodeName,"obj":XVal,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcCat") + ,("field":"YVal","name":YVal.NodeName,"obj":YVal,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcVal") + ,("field":"Smooth","name":"c:smooth","obj":Smooth,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"BubbleSize","name":BubbleSize.NodeName,"obj":BubbleSize,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcVal") + ,("field":"Bubble3D","name":"c:bubble3D","obj":Bubble3D,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes @@ -1800,6 +2115,7 @@ type TSer=class(NodeInfo) Tx; SpPr; DPt; + DPtEx; DLbls; Marker; InvertIfNegative; @@ -1815,36 +2131,40 @@ End; /////////////////////////////////////////////////////////////// /// TdLbls /////////////////////////////////////////////////////////////// -type TdLbls=class(NodeInfo) - Function Create(); overload; - Begin - Create('t:chart'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TdLbls=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:dLbls'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"showLegendKey", "obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":""),("name":"showVal", "obj":ShowVal,"attrEx":"","nodeType":"","attrName":"") - ,("name":"showCatName", "obj":ShowCatName,"attrEx":"","nodeType":"","attrName":""),("name":"showSerName", "obj":ShowSerName,"attrEx":"","nodeType":"","attrName":"") - ,("name":"showPercent", "obj":ShowPercent,"attrEx":"","nodeType":"","attrName":""),("name":"showBubbleSize", "obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":"") - ,("name":"showLeaderLines", "obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"ShowLegendKey","name":"c:showLegendKey","obj":ShowLegendKey,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ShowVal","name":"c:showVal","obj":ShowVal,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ShowCatName","name":"c:showCatName","obj":ShowCatName,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ShowSerName","name":"c:showSerName","obj":ShowSerName,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ShowPercent","name":"c:showPercent","obj":ShowPercent,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ShowBubbleSize","name":"c:showBubbleSize","obj":ShowBubbleSize,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ShowLeaderLines","name":"c:showLeaderLines","obj":ShowLeaderLines,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes @@ -1862,43 +2182,52 @@ End; /////////////////////////////////////////////////////////////// /// TcCharts /////////////////////////////////////////////////////////////// -type TcCharts=class(NodeInfo) - Function Create(); overload; - Begin - Create('t:chart'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TcCharts=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:chart'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin Ser := array(); - DLbls := new TdLbls('dLbls'); + DLbls := new TdLbls(self, 'c:dLbls'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"barDir", "obj":BarDir,"attrEx":"","nodeType":"","attrName":""),("name":"bubbleScale", "obj":BubbleScale,"attrEx":"","nodeType":"","attrName":"") - ,("name":"grouping", "obj":Grouping,"attrEx":"","nodeType":"","attrName":""),("name":"radarStyle", "obj":RadarStyle,"attrEx":"","nodeType":"","attrName":"") - ,("name":"scatterStyle", "obj":ScatterStyle,"attrEx":"","nodeType":"","attrName":""),("name":"ofPieType", "obj":OfPieType,"attrEx":"","nodeType":"","attrName":"") - ,("name":"varyColors", "obj":VaryColors,"attrEx":"","nodeType":"","attrName":""),("name":"wireframe", "obj":Wireframe,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ser", "obj":Ser,"attrEx":"","nodeType":"","attrName":"","arrObj":"array"),("name":"serLines", "obj":SerLines,"attrEx":"","nodeType":"","attrName":"") - ,("name":DLbls.NodeName, "obj":DLbls,"attrEx":"","nodeType":"","attrName":""),("name":"shape", "obj":Shape,"attrEx":"","nodeType":"","attrName":"") - ,("name":"holeSize", "obj":HoleSize,"attrEx":"","nodeType":"","attrName":""),("name":"smooth", "obj":Smooth,"attrEx":"","nodeType":"","attrName":"") - ,("name":"overlap", "obj":Overlap,"attrEx":"","nodeType":"","attrName":""),("name":"axId", "obj":AxID,"attrEx":"","nodeType":"","attrName":"") - ,("name":"axId", "obj":AxID2,"attrEx":"","nodeType":"","attrName":""),("name":"axId", "obj":AxID3,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"BarDir","name":"c:barDir","obj":BarDir,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"BubbleScale","name":"c:bubbleScale","obj":BubbleScale,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Grouping","name":"c:grouping","obj":Grouping,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"RadarStyle","name":"c:radarStyle","obj":RadarStyle,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ScatterStyle","name":"c:scatterStyle","obj":ScatterStyle,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"OfPieType","name":"c:ofPieType","obj":OfPieType,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"VaryColors","name":"c:varyColors","obj":VaryColors,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Wireframe","name":"c:wireframe","obj":Wireframe,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Ser","name":"c:ser","obj":Ser,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"", "class":"TSer") + ,("field":"SerLines","name":"c:serLines","obj":SerLines,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"DLbls","name":DLbls.NodeName,"obj":DLbls,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TdLbls") + ,("field":"Shape","name":"c:shape","obj":Shape,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"HoleSize","name":"c:holeSize","obj":HoleSize,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Smooth","name":"c:smooth","obj":Smooth,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Overlap","name":"c:overlap","obj":Overlap,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"AxID","name":"c:axId","obj":AxID,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"AxID2","name":"c:axId","obj":AxID2,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"AxID3","name":"c:axId","obj":AxID3,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -1928,34 +2257,36 @@ End; /////////////////////////////////////////////////////////////// /// TcScaling /////////////////////////////////////////////////////////////// -type TcScaling=class(NodeInfo) - Function Create(); overload; - Begin - Create('scaling'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TcScaling=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:scaling'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"logBase", "obj":LogBase,"attrEx":"","nodeType":"","attrName":""),("name":"orientation", "obj":Orientation,"attrEx":"","nodeType":"","attrName":"") - ,("name":"max", "obj":Max,"attrEx":"","nodeType":"","attrName":""),("name":"min", "obj":Min,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"LogBase","name":"c:logBase","obj":LogBase,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Orientation","name":"c:orientation","obj":Orientation,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Max","name":"c:max","obj":Max,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Min","name":"c:min","obj":Min,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -1971,34 +2302,35 @@ End; /////////////////////////////////////////////////////////////// /// TcChartLines /////////////////////////////////////////////////////////////// -type TcChartLines=class(NodeInfo) - Function Create(); overload; - Begin - Create('cChartLines'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SpPr := new TspPr('spPr'); +type TcChartLines=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:cChartLines'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SpPr := new TspPr(self, 'c:spPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"SpPr","name":SpPr.NodeName,"obj":SpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TspPr") + ) union ExtNodes; End; //Attributes @@ -2010,113 +2342,113 @@ End; /////////////////////////////////////////////////////////////// /// TcNumFmt /////////////////////////////////////////////////////////////// -type TcNumFmt=class(NodeInfo) - Function Create(); overload; - Begin - Create('numFmt'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TcNumFmt=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:numFmt'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("FormatCode", "formatCode", FormatCode, ""),("SourceLinked", "sourceLinked", SourceLinked, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"formatCode", "obj":FormatCode,"attrEx":"","nodeType":"","attrName":""),("name":"sourceLinked", "obj":SourceLinked,"attrEx":"","nodeType":"","attrName":"") - ) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; End; //Attributes - - //Nodes FormatCode; SourceLinked; + + //Nodes End; /////////////////////////////////////////////////////////////// /// TaR /////////////////////////////////////////////////////////////// -type TaR=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:r'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - RPr := new TaRpr('a:rPr'); +type TaR=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:r'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Rpr := new TaRpr(self, 'a:rPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":RPr.NodeName, "obj":RPr,"attrEx":"","nodeType":"","attrName":""),("name":"a:t", "obj":T,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Rpr","name":Rpr.NodeName,"obj":Rpr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaRpr") + ,("field":"T","name":"a:t","obj":T,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; //Attributes //Nodes - RPr; + Rpr; T; End; /////////////////////////////////////////////////////////////// /// TaEndParaRPr /////////////////////////////////////////////////////////////// -type TaEndParaRPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:endParaRPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TaEndParaRPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:endParaRPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('lang':Lang,'altLang':AltLang,'sz':Sz) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Lang", "lang", Lang, ""),("AltLang", "altLang", AltLang, ""),("Sz", "sz", Sz, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -2131,43 +2463,45 @@ End; /////////////////////////////////////////////////////////////// /// TaP /////////////////////////////////////////////////////////////// -type TaP=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:p'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - PPr := new TaPPr('a:pPr'); - R := new TaR('a:r'); - EndParaRPr := new TaEndParaRPr('a:endParaRPr'); +type TaP=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:p'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Ppr := new TaPPr(self, 'a:pPr'); + R := new TaR(self, 'a:r'); + EndParaRPr := new TaEndParaRPr(self, 'a:endParaRPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":PPr.NodeName, "obj":PPr,"attrEx":"","nodeType":"","attrName":""),("name":R.NodeName, "obj":R,"attrEx":"","nodeType":"","attrName":"") - ,("name":EndParaRPr.NodeName, "obj":EndParaRPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Ppr","name":Ppr.NodeName,"obj":Ppr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaPPr") + ,("field":"R","name":R.NodeName,"obj":R,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaR") + ,("field":"EndParaRPr","name":EndParaRPr.NodeName,"obj":EndParaRPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaEndParaRPr") + ) union ExtNodes; End; //Attributes //Nodes - PPr; + Ppr; R; EndParaRPr; End; @@ -2175,37 +2509,39 @@ End; /////////////////////////////////////////////////////////////// /// TaPPr /////////////////////////////////////////////////////////////// -type TaPPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:pPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - DefRPr := new TaRPr('a:defRPr'); +type TaPPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:pPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + DefRPr := new TaRPr(self, 'a:defRPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Algn", "algn", Algn, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":DefRPr.NodeName, "obj":DefRPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"DefRPr","name":DefRPr.NodeName,"obj":DefRPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaRPr") + ) union ExtNodes; End; //Attributes + Algn; //Nodes DefRPr; @@ -2214,37 +2550,40 @@ End; /////////////////////////////////////////////////////////////// /// TaLatin /////////////////////////////////////////////////////////////// -type TaLatin=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:latin'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TaLatin=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:latin'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('typeface':Typeface) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Typeface", "typeface", Typeface, ""),("Panose", "panose", Panose, ""),("PitchFamily", "pitchFamily", PitchFamily, ""),("Charset", "charset", Charset, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; //Attributes Typeface; + Panose; + PitchFamily; + Charset; //Nodes End; @@ -2252,32 +2591,32 @@ End; /////////////////////////////////////////////////////////////// /// TaEa /////////////////////////////////////////////////////////////// -type TaEa=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:ea'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TaEa=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:ea'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('typeface':Typeface) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Typeface", "typeface", Typeface, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -2290,32 +2629,32 @@ End; /////////////////////////////////////////////////////////////// /// TaCs /////////////////////////////////////////////////////////////// -type TaCs=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:cs'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TaCs=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:cs'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('typeface':Typeface) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Typeface", "typeface", Typeface, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -2328,50 +2667,52 @@ End; /////////////////////////////////////////////////////////////// /// TaRPr /////////////////////////////////////////////////////////////// -type TaRPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:defRPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - SolidFill := new TSolidFill('a:solidFill'); - Latin := new TaLatin('a:latin'); - Ea := new TaEa('a:ea'); - Cs := new TaCs('a:cs'); +type TaRPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:defRPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SolidFill := new TSolidFill(self, 'a:solidFill'); + Latin := new TaLatin(self, 'a:latin'); + Ea := new TaEa(self, 'a:ea'); + Cs := new TaCs(self, 'a:cs'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('altLang':AltLang,'b':B,'baseline':Baseline,'bmk':Bmk,'cap':Cap,'dirty':Dirty,'err':Err,'i':I,'kern':Kern,'kumimoji':Kumimoji,'lang':Lang,'noProof':NoProof,'normalizeH':NormalizeH,'smtId':SmtID,'spc':Spc,'strike':Strike,'sz':Sz,'smtClean':SmtClean,'u':U) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("AltLang", "altLang", AltLang, ""),("Bold", "b", Bold, ""),("Baseline", "baseline", Baseline, ""),("Bmk", "bmk", Bmk, ""),("Cap", "cap", Cap, ""),("Dirty", "dirty", Dirty, ""),("Err", "err", Err, ""),("Italic", "i", Italic, ""),("Kern", "kern", Kern, ""),("Kumimoji", "kumimoji", Kumimoji, ""),("Lang", "lang", Lang, ""),("NoProof", "noProof", NoProof, ""),("NormalizeH", "normalizeH", NormalizeH, ""),("SmtID", "smtId", SmtID, ""),("Spc", "spc", Spc, ""),("Strike", "strike", Strike, ""),("Sz", "sz", Sz, ""),("SmtClean", "smtClean", SmtClean, ""),("U", "u", U, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":SolidFill.NodeName, "obj":SolidFill,"attrEx":"","nodeType":"","attrName":""),("name":Latin.NodeName, "obj":Latin,"attrEx":"","nodeType":"","attrName":"") - ,("name":Ea.NodeName, "obj":Ea,"attrEx":"","nodeType":"","attrName":""),("name":Cs.NodeName, "obj":Cs,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"SolidFill","name":SolidFill.NodeName,"obj":SolidFill,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSolidFill") + ,("field":"Latin","name":Latin.NodeName,"obj":Latin,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaLatin") + ,("field":"Ea","name":Ea.NodeName,"obj":Ea,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaEa") + ,("field":"Cs","name":Cs.NodeName,"obj":Cs,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaCs") ) union ExtNodes; End; //Attributes AltLang; - B; + Bold; Baseline; Bmk; Cap; Dirty; Err; - I; + Italic; Kern; Kumimoji; Lang; @@ -2394,36 +2735,40 @@ End; /////////////////////////////////////////////////////////////// /// TaBodyPr /////////////////////////////////////////////////////////////// -type TaBodyPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:bodyPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TaBodyPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:bodyPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('anchor':Anchor,'anchorCtr':AnchorCtr,'rot':Rot,'bIns':BIns,'compatLnSpc':CompatLnSpc,'forceAA':ForceAA,'fromWordArt':FromWordArt,'horzOverflow':HorzOverflow,'lIns':LIns,'numCol':NumCol,'rIns':RIns,'rtlCol':RtlCol,'spcCol':SpcCol,'spcFirstLastPara':SpcFirstLastPara,'tIns':TIns,'upright':Upright,'vert':Vert,'vertOverflow':VertOverflow,'wrap':Wrap) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Vert", "vert", Vert, ""),("VertOverflow", "vertOverflow", VertOverflow, ""),("HorzOverflow", "horzOverflow", HorzOverflow, ""),("RtlCol", "rtlCol", RtlCol, ""),("Anchor", "anchor", Anchor, ""),("AnchorCtr", "anchorCtr", AnchorCtr, ""),("Rot", "rot", Rot, ""),("BIns", "bIns", BIns, ""),("CompatLnSpc", "compatLnSpc", CompatLnSpc, ""),("ForceAA", "forceAA", ForceAA, ""),("FromWordArt", "fromWordArt", FromWordArt, ""),("LIns", "lIns", LIns, ""),("NumCol", "numCol", NumCol, ""),("RIns", "rIns", RIns, ""),("SpcCol", "spcCol", SpcCol, ""),("SpcFirstLastPara", "spcFirstLastPara", SpcFirstLastPara, ""),("TIns", "tIns", TIns, ""),("Upright", "upright", Upright, ""),("Wrap", "wrap", Wrap, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; //Attributes + Vert; + VertOverflow; + HorzOverflow; + RtlCol; Anchor; AnchorCtr; Rot; @@ -2431,17 +2776,13 @@ type TaBodyPr=class(NodeInfo) CompatLnSpc; ForceAA; FromWordArt; - HorzOverflow; LIns; NumCol; RIns; - RtlCol; SpcCol; SpcFirstLastPara; TIns; Upright; - Vert; - VertOverflow; Wrap; //Nodes @@ -2450,36 +2791,38 @@ End; /////////////////////////////////////////////////////////////// /// TTxPr /////////////////////////////////////////////////////////////// -type TTxPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('txPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - BodyPr := new TaBodyPr('a:bodyPr'); - P := new TaP('a:p'); +type TTxPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'txPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + BodyPr := new TaBodyPr(self, 'a:bodyPr'); + P := new TaP(self, 'a:p'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":BodyPr.NodeName, "obj":BodyPr,"attrEx":"","nodeType":"","attrName":""),("name":"a:lstStyle", "obj":LstStyle,"attrEx":"","nodeType":"","attrName":"") - ,("name":P.NodeName, "obj":P,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"BodyPr","name":BodyPr.NodeName,"obj":BodyPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaBodyPr") + ,("field":"LstStyle","name":"a:lstStyle","obj":LstStyle,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"P","name":P.NodeName,"obj":P,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TaP") + ) union ExtNodes; End; //Attributes @@ -2493,50 +2836,62 @@ End; /////////////////////////////////////////////////////////////// /// TcAxs /////////////////////////////////////////////////////////////// -type TcAxs=class(NodeInfo) - Function Create(); overload; - Begin - Create('catAx'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Scaling := new TcScaling('scaling'); - MajorGridlines := new TcChartLines('majorGridlines'); - MinorGridlines := new TcChartLines('minorGridlines'); - NumFmt := new TcNumFmt('numFmt'); - SpPr := new TspPr('spPr'); - TxPr := new TTxPr('txPr'); +type TcAxs=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:catAx'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Scaling := new TcScaling(self, 'c:scaling'); + MajorGridlines := new TcChartLines(self, 'c:majorGridlines'); + MinorGridlines := new TcChartLines(self, 'c:minorGridlines'); + NumFmt := new TcNumFmt(self, 'c:numFmt'); + SpPr := new TspPr(self, 'c:spPr'); + TxPr := new TTxPr(self, 'c:txPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"axId", "obj":AxID,"attrEx":"","nodeType":"","attrName":""),("name":Scaling.NodeName, "obj":Scaling,"attrEx":"","nodeType":"","attrName":"") - ,("name":"delete", "obj":Del,"attrEx":"","nodeType":"","attrName":""),("name":"axPos", "obj":AxPos,"attrEx":"","nodeType":"","attrName":"") - ,("name":MajorGridlines.NodeName, "obj":MajorGridlines,"attrEx":"","nodeType":"","attrName":""),("name":MinorGridlines.NodeName, "obj":MinorGridlines,"attrEx":"","nodeType":"","attrName":"") - ,("name":NumFmt.NodeName, "obj":NumFmt,"attrEx":"","nodeType":"","attrName":""),("name":"majorTickMark", "obj":MajorTickMark,"attrEx":"","nodeType":"","attrName":"") - ,("name":"minorTickMark", "obj":MinorTickMark,"attrEx":"","nodeType":"","attrName":""),("name":"tickLblPos", "obj":TickLblPos,"attrEx":"","nodeType":"","attrName":"") - ,("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":""),("name":TxPr.NodeName, "obj":TxPr,"attrEx":"","nodeType":"","attrName":"") - ,("name":"crossAx", "obj":CrossAx,"attrEx":"","nodeType":"","attrName":""),("name":"crosses", "obj":Crosses,"attrEx":"","nodeType":"","attrName":"") - ,("name":"crossBetween", "obj":CrossBetween,"attrEx":"","nodeType":"","attrName":""),("name":"majorUnit", "obj":MajorUnit,"attrEx":"","nodeType":"","attrName":"") - ,("name":"minorUnit", "obj":MinorUnit,"attrEx":"","nodeType":"","attrName":""),("name":"auto", "obj":Auto,"attrEx":"","nodeType":"","attrName":"") - ,("name":"lblAlgn", "obj":LblAlgn,"attrEx":"","nodeType":"","attrName":""),("name":"lblOffset", "obj":LblOffset,"attrEx":"","nodeType":"","attrName":"") - ,("name":"tickLblSkip", "obj":TickLblSkip,"attrEx":"","nodeType":"","attrName":""),("name":"tickMarkSkip", "obj":TickMarkSkip,"attrEx":"","nodeType":"","attrName":"") - ,("name":"NoMultiLvlLbl", "obj":NoMultiLvlLbl,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"AxID","name":"c:axId","obj":AxID,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Scaling","name":Scaling.NodeName,"obj":Scaling,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcScaling") + ,("field":"Del","name":"c:delete","obj":Del,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"AxPos","name":"c:axPos","obj":AxPos,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MajorGridlines","name":MajorGridlines.NodeName,"obj":MajorGridlines,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcChartLines") + ,("field":"MinorGridlines","name":MinorGridlines.NodeName,"obj":MinorGridlines,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcChartLines") + ,("field":"NumFmt","name":NumFmt.NodeName,"obj":NumFmt,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcNumFmt") + ,("field":"MajorTickMark","name":"c:majorTickMark","obj":MajorTickMark,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MinorTickMark","name":"c:minorTickMark","obj":MinorTickMark,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"TickLblPos","name":"c:tickLblPos","obj":TickLblPos,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"SpPr","name":SpPr.NodeName,"obj":SpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TspPr") + ,("field":"TxPr","name":TxPr.NodeName,"obj":TxPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TTxPr") + ,("field":"CrossAx","name":"c:crossAx","obj":CrossAx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Crosses","name":"c:crosses","obj":Crosses,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"CrossBetween","name":"c:crossBetween","obj":CrossBetween,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MajorUnit","name":"c:majorUnit","obj":MajorUnit,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"MinorUnit","name":"c:minorUnit","obj":MinorUnit,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Auto","name":"c:auto","obj":Auto,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"LblAlgn","name":"c:lblAlgn","obj":LblAlgn,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"LblOffset","name":"c:lblOffset","obj":LblOffset,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"TickLblSkip","name":"c:tickLblSkip","obj":TickLblSkip,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"TickMarkSkip","name":"c:tickMarkSkip","obj":TickMarkSkip,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"NoMultiLvlLbl","name":"c:NoMultiLvlLbl","obj":NoMultiLvlLbl,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes @@ -2570,40 +2925,43 @@ End; /////////////////////////////////////////////////////////////// /// TplotArea /////////////////////////////////////////////////////////////// -type TplotArea=class(NodeInfo) - Function Create(); overload; - Begin - Create('plotArea'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Chart := new TcCharts('chartname'); - CatAx := new TcAxs('catAx'); - ValAx := new TcAxs('valAx'); - SerAx := new TcAxs('serAx'); - SpPr := new TspPr('spPr'); +type TplotArea=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:plotArea'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Chart := new TcCharts(self, 'c:chartname'); + CatAx := new TcAxs(self, 'c:catAx'); + ValAx := new TcAxs(self, 'c:valAx'); + SerAx := new TcAxs(self, 'c:serAx'); + SpPr := new TspPr(self, 'c:spPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"layout", "obj":Layout,"attrEx":"","nodeType":"","attrName":""),("name":Chart.NodeName, "obj":Chart,"attrEx":"","nodeType":"","attrName":"") - ,("name":CatAx.NodeName, "obj":CatAx,"attrEx":"","nodeType":"","attrName":""),("name":ValAx.NodeName, "obj":ValAx,"attrEx":"","nodeType":"","attrName":"") - ,("name":SerAx.NodeName, "obj":SerAx,"attrEx":"","nodeType":"","attrName":""),("name":SpPr.NodeName, "obj":SpPr,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Layout","name":"c:layout","obj":Layout,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Chart","name":Chart.NodeName,"obj":Chart,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcCharts") + ,("field":"CatAx","name":CatAx.NodeName,"obj":CatAx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcAxs") + ,("field":"ValAx","name":ValAx.NodeName,"obj":ValAx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcAxs") + ,("field":"SerAx","name":SerAx.NodeName,"obj":SerAx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcAxs") + ,("field":"SpPr","name":SpPr.NodeName,"obj":SpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TspPr") ) union ExtNodes; End; @@ -2621,35 +2979,38 @@ End; /////////////////////////////////////////////////////////////// /// TView3D /////////////////////////////////////////////////////////////// -type TView3D=class(NodeInfo) - Function Create(); overload; - Begin - Create('view3D'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TView3D=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'c:view3D'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"rotX", "obj":RotX,"attrEx":"rgb","nodeType":"","attrName":""),("name":"rotY", "obj":RotY,"attrEx":"index","nodeType":"","attrName":"") - ,("name":"rAngAx", "obj":RAngAx,"attrEx":"","nodeType":"","attrName":""),("name":"depthPercent", "obj":DepthPercent,"attrEx":"","nodeType":"","attrName":"") - ,("name":"perspective", "obj":Perspective,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"RotX","name":"c:rotX","obj":RotX,"attrEx":"rgb","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"RotY","name":"c:rotY","obj":RotY,"attrEx":"index","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"RAngAx","name":"c:rAngAx","obj":RAngAx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"DepthPercent","name":"c:depthPercent","obj":DepthPercent,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Perspective","name":"c:perspective","obj":Perspective,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes @@ -2665,35 +3026,38 @@ End; /////////////////////////////////////////////////////////////// /// TBorder /////////////////////////////////////////////////////////////// -type TBorder=class(NodeInfo) - Function Create(); overload; - Begin - Create('border'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TBorder=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'border'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('style':LineStyle) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("LineStyle", "style", LineStyle, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"color", "obj":Color,"attrEx":"rgb","nodeType":"","attrName":""),("name":"color", "obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"") - ,("name":"weight", "obj":Weight,"attrEx":"","nodeType":"","attrName":""),("name":"color", "obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"") - ,("name":"tintandshade", "obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Color","name":"color","obj":Color,"attrEx":"rgb","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ColorIndex","name":"ColorIndex","obj":ColorIndex,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Weight","name":"weight","obj":Weight,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ThemeColor","name":"color","obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"TintAndShade","name":"tintandshade","obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes @@ -2710,57 +3074,50 @@ End; /////////////////////////////////////////////////////////////// /// TBorders /////////////////////////////////////////////////////////////// -type TBorders=class(NodeInfo) - Function Create(); overload; - Begin - Create('border'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Left := new TBorder('left'); - Right := new TBorder('right'); - Top := new TBorder('top'); - Bottom := new TBorder('bottom'); - Diagonal := new TBorder('diagonal'); +type TBorders=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'border'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Left := new TBorder(self, 'left'); + Right := new TBorder(self, 'right'); + Top := new TBorder(self, 'top'); + Bottom := new TBorder(self, 'bottom'); + Diagonal := new TBorder(self, 'diagonal'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"Color", "obj":Color,"attrEx":"","nodeType":"","attrName":""),("name":"ColorIndex", "obj":ColorIndex,"attrEx":"","nodeType":"","attrName":"") - ,("name":"LineStyle", "obj":LineStyle,"attrEx":"","nodeType":"","attrName":""),("name":"Value", "obj":Value,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Weight", "obj":Weight,"attrEx":"","nodeType":"","attrName":""),("name":"ThemeColor", "obj":ThemeColor,"attrEx":"","nodeType":"","attrName":"") - ,("name":"TintAndShade", "obj":TintAndShade,"attrEx":"","nodeType":"","attrName":""),("name":Left.NodeName, "obj":Left,"attrEx":"","nodeType":"","attrName":"") - ,("name":Right.NodeName, "obj":Right,"attrEx":"","nodeType":"","attrName":""),("name":Top.NodeName, "obj":Top,"attrEx":"","nodeType":"","attrName":"") - ,("name":Bottom.NodeName, "obj":Bottom,"attrEx":"","nodeType":"","attrName":""),("name":Diagonal.NodeName, "obj":Diagonal,"attrEx":"","nodeType":"","attrName":"") - ,("name":"diagonalDown", "obj":DiagonalDown,"attrEx":"","nodeType":"","attrName":""),("name":"diagonalUp", "obj":DiagonalUp,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Left","name":Left.NodeName,"obj":Left,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBorder") + ,("field":"Right","name":Right.NodeName,"obj":Right,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBorder") + ,("field":"Top","name":Top.NodeName,"obj":Top,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBorder") + ,("field":"Bottom","name":Bottom.NodeName,"obj":Bottom,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBorder") + ,("field":"Diagonal","name":Diagonal.NodeName,"obj":Diagonal,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBorder") + ,("field":"DiagonalDown","name":"diagonalDown","obj":DiagonalDown,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"DiagonalUp","name":"diagonalUp","obj":DiagonalUp,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; //Attributes //Nodes - Color; - ColorIndex; - LineStyle; - Value; - Weight; - ThemeColor; - TintAndShade; Left; Right; Top; @@ -2773,32 +3130,32 @@ End; /////////////////////////////////////////////////////////////// /// TNumFmts /////////////////////////////////////////////////////////////// -type TNumFmts=class(NodeInfo) - Function Create(); overload; - Begin - Create('numFmts'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TNumFmts=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'numFmts'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('numFmtId':NumFmtId,'formatCode':FormatCode) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("NumFmtId", "numFmtId", NumFmtId, ""),("FormatCode", "formatCode", FormatCode, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -2812,35 +3169,36 @@ End; /////////////////////////////////////////////////////////////// /// TFills /////////////////////////////////////////////////////////////// -type TFills=class(NodeInfo) - Function Create(); overload; - Begin - Create('fill'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Pattern := new TPattern('patternFill'); - Gradient := new TGradient('gradientFill'); +type TFills=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'fill'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Pattern := new TPattern(self, 'patternFill'); + Gradient := new TGradient(self, 'gradientFill'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":Pattern.NodeName, "obj":Pattern,"attrEx":"","nodeType":"","attrName":""),("name":Gradient.NodeName, "obj":Gradient,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Pattern","name":Pattern.NodeName,"obj":Pattern,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TPattern") + ,("field":"Gradient","name":Gradient.NodeName,"obj":Gradient,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TGradient") ) union ExtNodes; End; @@ -2852,36 +3210,82 @@ type TFills=class(NodeInfo) End; /////////////////////////////////////////////////////////////// -/// TPattern +/// TGradientImpl /////////////////////////////////////////////////////////////// -type TPattern=class(NodeInfo) - Function Create(); overload; - Begin - Create('patternFill'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TGradientImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'gradientFill'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('patternType':PatternType) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Shading", "Shading", Shading, ""),("Color1", "color", Color1, ""),("ThemeColor1", "color", ThemeColor1, ""),("Color2", "color", Color2, ""),("ThemeColor2", "color", ThemeColor2, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"fgcolor", "obj":ForegroundColor,"attrEx":"rgb","nodeType":"","attrName":""),("name":"bgcolor", "obj":BackgroundColor,"attrEx":"rgb","nodeType":"","attrName":"") - ,("name":"fgcolor", "obj":ForegroundThemeColor,"attrEx":"theme","nodeType":"","attrName":""),("name":"bgcolor", "obj":BackgroundThemeColor,"attrEx":"theme","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Shading; + Color1; + ThemeColor1; + Color2; + ThemeColor2; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TPattern +/////////////////////////////////////////////////////////////// +type TPattern=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'patternFill'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("PatternType", "patternType", PatternType, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"ForegroundColor","name":"fgColor","obj":ForegroundColor,"attrEx":"rgb","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"BackgroundColor","name":"bgColor","obj":BackgroundColor,"attrEx":"rgb","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ForegroundThemeColor","name":"fgColor","obj":ForegroundThemeColor,"attrEx":"theme","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"BackgroundThemeColor","name":"bgColor","obj":BackgroundThemeColor,"attrEx":"theme","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ForegroundThemeColorTint","name":"fgColor","obj":ForegroundThemeColorTint,"attrEx":"tint","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"BackgroundThemeColorTint","name":"bgColor","obj":BackgroundThemeColorTint,"attrEx":"tint","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -2893,39 +3297,43 @@ type TPattern=class(NodeInfo) BackgroundColor; ForegroundThemeColor; BackgroundThemeColor; + ForegroundThemeColorTint; + BackgroundThemeColorTint; End; /////////////////////////////////////////////////////////////// /// TStop /////////////////////////////////////////////////////////////// -type TStop=class(NodeInfo) - Function Create(); overload; - Begin - Create('stop'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TStop=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'stop'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('position':Position) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Position", "position", Position, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"color", "obj":Color,"attrEx":"rgb","nodeType":"","attrName":""),("name":"color", "obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"") - ,("name":"color", "obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Color","name":"color","obj":Color,"attrEx":"rgb","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ColorIndex","name":"color","obj":ColorIndex,"attrEx":"index","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ThemeColor","name":"color","obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; End; //Attributes @@ -2940,32 +3348,32 @@ End; /////////////////////////////////////////////////////////////// /// TAlignment /////////////////////////////////////////////////////////////// -type TAlignment=class(NodeInfo) - Function Create(); overload; - Begin - Create('alignment'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TAlignment=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'alignment'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('horizontal':Horizontal,'vertical':Vertical,'wrapText':WrapText,'readingOrder':ReadingOrder) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Horizontal", "horizontal", Horizontal, ""),("Vertical", "vertical", Vertical, ""),("WrapText", "wrapText", WrapText, ""),("ReadingOrder", "readingOrder", ReadingOrder, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -2981,32 +3389,32 @@ End; /////////////////////////////////////////////////////////////// /// TProtection /////////////////////////////////////////////////////////////// -type TProtection=class(NodeInfo) - Function Create(); overload; - Begin - Create('protection'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TProtection=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'protection'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('locked':Lock,'hidden':Hide) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Lock", "locked", Lock, ""),("Hide", "hidden", Hide, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -3020,41 +3428,44 @@ End; /////////////////////////////////////////////////////////////// /// TStyle /////////////////////////////////////////////////////////////// -type TStyle=class(NodeInfo) - Function Create(); overload; - Begin - Create('xf'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Border := new TBorders('border'); - Font := new TFont('font'); - NumberFormat := new TNumFmts('numFmt'); - Fill := new TFills('fill'); - Alignment := new TAlignment('alignment'); - Protection := new TProtection('protection'); +type TStyle=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'xf'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Border := new TBorders(self, 'border'); + Font := new TFont(self, 'font'); + NumberFormat := new TNumFmts(self, 'numFmt'); + Fill := new TFills(self, 'fill'); + Alignment := new TAlignment(self, 'alignment'); + Protection := new TProtection(self, 'protection'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":Border.NodeName, "obj":Border,"attrEx":"","nodeType":"","attrName":""),("name":Font.NodeName, "obj":Font,"attrEx":"","nodeType":"","attrName":"") - ,("name":NumberFormat.NodeName, "obj":NumberFormat,"attrEx":"","nodeType":"","attrName":""),("name":Fill.NodeName, "obj":Fill,"attrEx":"","nodeType":"","attrName":"") - ,("name":Alignment.NodeName, "obj":Alignment,"attrEx":"","nodeType":"","attrName":""),("name":Protection.NodeName, "obj":Protection,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Border","name":Border.NodeName,"obj":Border,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBorders") + ,("field":"Font","name":Font.NodeName,"obj":Font,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TFont") + ,("field":"NumberFormat","name":NumberFormat.NodeName,"obj":NumberFormat,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TNumFmts") + ,("field":"Fill","name":Fill.NodeName,"obj":Fill,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TFills") + ,("field":"Alignment","name":Alignment.NodeName,"obj":Alignment,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TAlignment") + ,("field":"Protection","name":Protection.NodeName,"obj":Protection,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TProtection") ) union ExtNodes; End; @@ -3070,37 +3481,93 @@ type TStyle=class(NodeInfo) End; /////////////////////////////////////////////////////////////// -/// THeaderFooter +/// TXf /////////////////////////////////////////////////////////////// -type THeaderFooter=class(NodeInfo) - Function Create(); overload; - Begin - Create('headerFooter'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TXf=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'xf'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Alignment := new TAlignment(self, 'alignment'); + Protection := new TProtection(self, 'protection'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('differentOddEven':DifferentOddEven,'differentFirst':DifferentFirst,'scaleWithDoc':ScaleWithDoc,'alignWithMargins':AlignWithMargin) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("NumFmtId", "numFmtId", NumFmtId, ""),("FontId", "fontId", FontId, ""),("FillId", "fillId", FillId, ""),("BorderId", "borderId", BorderId, ""),("XfId", "xfId", XfId, ""),("ApplyFont", "applyFont", ApplyFont, ""),("ApplyFill", "applyFill", ApplyFill, ""),("ApplyBorder", "applyBorder", ApplyBorder, ""),("ApplyAlignment", "applyAlignment", ApplyAlignment, ""),("ApplyProtection", "applyProtection", ApplyProtection, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"oddHeader", "obj":OddHeader,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"oddFooter", "obj":OddFooter,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":"evenHeader", "obj":EvenHeader,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"evenFooter", "obj":EvenFooter,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":"firstHeader", "obj":FirstHeader,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"firstFooter", "obj":FirstFooter,"attrEx":"","nodeType":"pcdata","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Alignment","name":Alignment.NodeName,"obj":Alignment,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TAlignment") + ,("field":"Protection","name":Protection.NodeName,"obj":Protection,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TProtection") + ) union ExtNodes; + End; + + //Attributes + NumFmtId; + FontId; + FillId; + BorderId; + XfId; + ApplyFont; + ApplyFill; + ApplyBorder; + ApplyAlignment; + ApplyProtection; + + //Nodes + Alignment; + Protection; +End; + +/////////////////////////////////////////////////////////////// +/// THeaderFooter +/////////////////////////////////////////////////////////////// +type THeaderFooter=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'headerFooter'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("DifferentOddEven", "differentOddEven", DifferentOddEven, ""),("DifferentFirst", "differentFirst", DifferentFirst, ""),("ScaleWithDoc", "scaleWithDoc", ScaleWithDoc, ""),("AlignWithMargin", "alignWithMargins", AlignWithMargin, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"OddHeader","name":"oddHeader","obj":OddHeader,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"OddFooter","name":"oddFooter","obj":OddFooter,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"EvenHeader","name":"evenHeader","obj":EvenHeader,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"EvenFooter","name":"evenFooter","obj":EvenFooter,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"FirstHeader","name":"firstHeader","obj":FirstHeader,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"FirstFooter","name":"firstFooter","obj":FirstFooter,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -3122,48 +3589,48 @@ End; /////////////////////////////////////////////////////////////// /// TMargins /////////////////////////////////////////////////////////////// -type TMargins=class(NodeInfo) - Function Create(); overload; - Begin - Create('pageMargins'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - bottom := 0.75; - footer := 0.5; - header := 0.5; +type TMargins=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pageMargins'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin left := 0.75; right := 0.75; top := 0.75; + bottom := 0.75; + header := 0.5; + footer := 0.5; //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('bottom':Bottom,'footer':Footer,'header':Header,'left':Left,'right':Right,'top':Top) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Left", "left", Left, ""),("Right", "right", Right, ""),("Top", "top", Top, ""),("Bottom", "bottom", Bottom, ""),("Header", "header", Header, ""),("Footer", "footer", Footer, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; //Attributes - Bottom; - Footer; - Header; Left; Right; Top; + Bottom; + Header; + Footer; //Nodes End; @@ -3171,55 +3638,33 @@ End; /////////////////////////////////////////////////////////////// /// THyperLink /////////////////////////////////////////////////////////////// -type THyperLink=class(NodeInfo) - Function Create(); overload; - Begin - Create('hyperlink'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - AddIndent := new BOOL('AddIndent'); - FormulaHidden := new BOOL('FormulaHidden'); - IncludeAlignment := new BOOL('IncludeAlignment'); - IncludeBorder := new BOOL('IncludeBorder'); - IncludeFont := new BOOL('IncludeFont'); - IncludeNumber := new BOOL('IncludeNumber'); - IncludePatterns := new BOOL('IncludePatterns'); - IncludeProtection := new BOOL('IncludeProtection'); - Locked := new BOOL('Locked'); - NumberFormat := new LPCTSTR('NumberFormat'); - NumberFormatLocal := new LPCTSTR('NumberFormatLocal'); - ShrinkToFit := new BOOL('ShrinkToFit'); - WrapText := new BOOL('WrapText'); +type THyperLink=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'hyperlink'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('linkType':LinkType,'linkUrl':LinkUrl,'ref':Axis,'display':Display,'tooltip':Tooltip) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("LinkType", "linkType", LinkType, ""),("LinkUrl", "linkUrl", LinkUrl, ""),("Axis", "ref", Axis, ""),("Display", "display", Display, ""),("Tooltip", "tooltip", Tooltip, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":AddIndent.NodeName, "obj":AddIndent,"attrEx":"","nodeType":"","attrName":""),("name":FormulaHidden.NodeName, "obj":FormulaHidden,"attrEx":"","nodeType":"","attrName":"") - ,("name":"HorizontalAlignment", "obj":HorizontalAlignment,"attrEx":"","nodeType":"","attrName":""),("name":IncludeAlignment.NodeName, "obj":IncludeAlignment,"attrEx":"","nodeType":"","attrName":"") - ,("name":IncludeBorder.NodeName, "obj":IncludeBorder,"attrEx":"","nodeType":"","attrName":""),("name":IncludeFont.NodeName, "obj":IncludeFont,"attrEx":"","nodeType":"","attrName":"") - ,("name":IncludeNumber.NodeName, "obj":IncludeNumber,"attrEx":"","nodeType":"","attrName":""),("name":IncludePatterns.NodeName, "obj":IncludePatterns,"attrEx":"","nodeType":"","attrName":"") - ,("name":IncludeProtection.NodeName, "obj":IncludeProtection,"attrEx":"","nodeType":"","attrName":""),("name":"IndentLevel", "obj":IndentLevel,"attrEx":"","nodeType":"","attrName":"") - ,("name":Locked.NodeName, "obj":Locked,"attrEx":"","nodeType":"","attrName":""),("name":"MergeCells", "obj":MergeCells,"attrEx":"","nodeType":"","attrName":"") - ,("name":NumberFormat.NodeName, "obj":NumberFormat,"attrEx":"","nodeType":"","attrName":""),("name":NumberFormatLocal.NodeName, "obj":NumberFormatLocal,"attrEx":"","nodeType":"","attrName":"") - ,("name":"Orientation", "obj":Orientation,"attrEx":"","nodeType":"","attrName":""),("name":ShrinkToFit.NodeName, "obj":ShrinkToFit,"attrEx":"","nodeType":"","attrName":"") - ,("name":"VerticalAlignment", "obj":VerticalAlignment,"attrEx":"","nodeType":"","attrName":""),("name":WrapText.NodeName, "obj":WrapText,"attrEx":"","nodeType":"","attrName":"") - ,("name":"ReadingOrder", "obj":ReadingOrder,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; End; //Attributes @@ -3230,56 +3675,37 @@ type THyperLink=class(NodeInfo) Tooltip; //Nodes - AddIndent; - FormulaHidden; - HorizontalAlignment; - IncludeAlignment; - IncludeBorder; - IncludeFont; - IncludeNumber; - IncludePatterns; - IncludeProtection; - IndentLevel; - Locked; - MergeCells; - NumberFormat; - NumberFormatLocal; - Orientation; - ShrinkToFit; - VerticalAlignment; - WrapText; - ReadingOrder; End; /////////////////////////////////////////////////////////////// /// TSheetView /////////////////////////////////////////////////////////////// -type TSheetView=class(NodeInfo) - Function Create(); overload; - Begin - Create('sheetView'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TSheetView=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'sheetView'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('showGridLines':ShowGridLines,'showRowColHeaders':ShowRowColHeaders,'zoomScale':ZoomScale,'zoomScaleNormal':ZoomScaleNormal) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("ShowGridLines", "showGridLines", ShowGridLines, ""),("ShowRowColHeaders", "showRowColHeaders", ShowRowColHeaders, ""),("ZoomScale", "zoomScale", ZoomScale, ""),("ZoomScaleNormal", "zoomScaleNormal", ZoomScaleNormal, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -3295,46 +3721,48 @@ End; /////////////////////////////////////////////////////////////// /// TPageLayout /////////////////////////////////////////////////////////////// -type TPageLayout=class(NodeInfo) - Function Create(); overload; - Begin - Create('pageSetup'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TPageLayout=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pageSetup'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('scale':Scale,'fitToWidth':FitToWidth,'fitToHeight':FitToHeight,'paperSize':PaperSize,'orientation':Orientation,'blackAndWhite':BlackAndWhite,'firstPageNumber':FirstPageNumber,'errors':CellError,'draft':Draft,'cellComments':CellComments) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("PaperSize", "paperSize", PaperSize, ""),("Scale", "scale", Scale, ""),("FitToWidth", "fitToWidth", FitToWidth, ""),("FitToHeight", "fitToHeight", FitToHeight, ""),("UseFirstPageNumber", "cellComments", UseFirstPageNumber, ""),("FirstPageNumber", "firstPageNumber", FirstPageNumber, ""),("PageOrder", "pageOrder", PageOrder, ""),("Orientation", "orientation", Orientation, ""),("BlackAndWhite", "blackAndWhite", BlackAndWhite, ""),("Draft", "draft", Draft, ""),("CellComments", "cellComments", CellComments, ""),("CellError", "errors", CellError, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; //Attributes + PaperSize; Scale; FitToWidth; FitToHeight; - PaperSize; + UseFirstPageNumber; + FirstPageNumber; + PageOrder; Orientation; BlackAndWhite; - FirstPageNumber; - CellError; Draft; CellComments; + CellError; //Nodes End; @@ -3342,36 +3770,42 @@ End; /////////////////////////////////////////////////////////////// /// TAppProperty /////////////////////////////////////////////////////////////// -type TAppProperty=class(NodeInfo) - Function Create(); overload; - Begin - Create('Properties'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TAppProperty=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'Properties'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"Application", "obj":Application,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"DocSecurity", "obj":DocSecurity,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":"ScaleCrop", "obj":ScaleCrop,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"Company", "obj":Company,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":"LinksUpToDate", "obj":LinksUpToDate,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"SharedDoc", "obj":SharedDoc,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":"HyperlinksChanged", "obj":HyperlinksChanged,"attrEx":"","nodeType":"pcdata","attrName":""),("name":"AppVersion", "obj":AppVersion,"attrEx":"","nodeType":"pcdata","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Application","name":"Application","obj":Application,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"DocSecurity","name":"DocSecurity","obj":DocSecurity,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"ScaleCrop","name":"ScaleCrop","obj":ScaleCrop,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Manager","name":"Manager","obj":Manager,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Company","name":"Company","obj":Company,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"LinksUpToDate","name":"LinksUpToDate","obj":LinksUpToDate,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"SharedDoc","name":"SharedDoc","obj":SharedDoc,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"HyperlinkBase","name":"HyperlinkBase","obj":HyperlinkBase,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"HyperlinksChanged","name":"HyperlinksChanged","obj":HyperlinksChanged,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"AppVersion","name":"AppVersion","obj":AppVersion,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -3381,42 +3815,99 @@ type TAppProperty=class(NodeInfo) Application; DocSecurity; ScaleCrop; + Manager; Company; LinksUpToDate; SharedDoc; + HyperlinkBase; HyperlinksChanged; AppVersion; End; /////////////////////////////////////////////////////////////// -/// TBr +/// TCoreProperty /////////////////////////////////////////////////////////////// -type TBr=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:br'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TCoreProperty=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'cp:coreProperties'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('w:type':Type) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Title","name":"dc:title","obj":Title,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Subject","name":"dc:subject","obj":Subject,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Creator","name":"dc:creator","obj":Creator,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Keywords","name":"cp:keywords","obj":Keywords,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Description","name":"dc:description","obj":Description,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"LastModifiedBy","name":"cp:lastModifiedBy","obj":LastModifiedBy,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"LastPrinted","name":"cp:lastPrinted","obj":LastPrinted,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Category","name":"cp:category","obj":Category,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"ContentStatus","name":"cp:contentStatus","obj":ContentStatus,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Title; + Subject; + Creator; + Keywords; + Description; + LastModifiedBy; + LastPrinted; + Category; + ContentStatus; +End; + +/////////////////////////////////////////////////////////////// +/// TBr +/////////////////////////////////////////////////////////////// +type TBr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:br'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Type", "w:type", Type, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -3429,32 +3920,32 @@ End; /////////////////////////////////////////////////////////////// /// TwFont /////////////////////////////////////////////////////////////// -type TwFont=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:rFonts'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TwFont=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:rFonts'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('w:eastAsia':eastAsia,'w:eastAsiaTheme':eastAsiaTheme,'w:hAnsi':hAnsi,'w:hAnsiTheme':hAnsiTheme,'w:hint':hint,'w:ascii':ascii,'w:asciiTheme':asciiTheme,'w:cs':cs,'w:csTheme':csTheme) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("eastAsia", "w:eastAsia", eastAsia, "东亚字体"),("eastAsiaTheme", "w:eastAsiaTheme", eastAsiaTheme, "东亚主题字体"),("hAnsi", "w:hAnsi", hAnsi, "Specifies a font which shall be used to format all characters in a Unicode range within the parent run which does not fall into one of the three categories defined above, which is called the high ANSI range in WordprocessingML."),("hAnsiTheme", "w:hAnsiTheme", hAnsiTheme, "Specifies a theme font which shall be used to format all characters in a Unicode range within the parent run which does not fall into one of the three categories defined above, which is called the high ANSI range in WordprocessingML. "),("hint", "w:hint", hint, "Specifies the font type which shall be used to format any ambiguous characters in the current run."),("ascii", "w:ascii", ascii, "Specifies a font which shall be used to format all characters in the ASCII range (0 - 127) within the parent run."),("asciiTheme", "w:asciiTheme", asciiTheme, "Specifies a theme font which shall be used to format all characters in the ASCII range (0 - 127) within the parent run."),("cs", "w:cs", cs, "Specifies a font which shall be used to format all characters in a complex script Unicode range within the parent run."),("csTheme", "w:csTheme", csTheme, "Specifies a theme font which shall be used to format all characters in a complex script Unicode range within the parent run. ")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -3475,128 +3966,304 @@ End; /////////////////////////////////////////////////////////////// /// TwrPr /////////////////////////////////////////////////////////////// -type TwrPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:rPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Font := new TwFont('w:rFonts'); +type TwrPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:rPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + rFont := new TwFont(self, 'w:rFonts'); + Del := new TOptInfo(self, 'w:del'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":Font.NodeName, "obj":Font,"attrEx":"","nodeType":"","attrName":""),("name":"w:b", "obj":Bold,"attrEx":"","nodeType":"empty","attrName":"") - ,("name":"w:bCs", "obj":bCs,"attrEx":"","nodeType":"empty","attrName":""),("name":"w:i", "obj":I,"attrEx":"","nodeType":"empty","attrName":"") - ,("name":"w:strike", "obj":Strike,"attrEx":"","nodeType":"empty","attrName":""),("name":"w:dstrike", "obj":dStrike,"attrEx":"w:val","nodeType":"","attrName":"") - ,("name":"w:sz", "obj":Size,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:szCs", "obj":szCs,"attrEx":"w:val","nodeType":"","attrName":"") - ,("name":"w:u", "obj":U,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:vertAlign", "obj":vertAlign,"attrEx":"w:val","nodeType":"","attrName":"") - ,("name":"w:lang", "obj":Lang,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:lang", "obj":eastAsia,"attrEx":"w:eastAsia","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"rFont","name":rFont.NodeName,"obj":rFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwFont") + ,("field":"Bold","name":"w:b","obj":Bold,"attrEx":"","nodeType":"empty","attrName":"", "desc":"黑体", "class":"") + ,("field":"noProof","name":"w:noProof","obj":noProof,"attrEx":"","nodeType":"empty","attrName":"", "desc":"Do Not Check Spelling or Grammar)", "class":"") + ,("field":"Color","name":"w:color","obj":Color,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"字体颜色", "class":"") + ,("field":"bCs","name":"w:bCs","obj":bCs,"attrEx":"","nodeType":"empty","attrName":"", "desc":"复杂脚本黑体", "class":"") + ,("field":"Italic","name":"w:i","obj":Italic,"attrEx":"","nodeType":"empty","attrName":"", "desc":"斜体", "class":"") + ,("field":"Strike","name":"w:strike","obj":Strike,"attrEx":"","nodeType":"empty","attrName":"", "desc":"单个删除线", "class":"") + ,("field":"dStrike","name":"w:dstrike","obj":dStrike,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"两个删除线", "class":"") + ,("field":"kern","name":"w:kern","obj":kern,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"字体紧排", "class":"") + ,("field":"Size","name":"w:sz","obj":Size,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"字体大小", "class":"") + ,("field":"szCs","name":"w:szCs","obj":szCs,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"复杂脚本字体大小", "class":"") + ,("field":"U","name":"w:u","obj":U,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"下划线", "class":"") + ,("field":"vertAlign","name":"w:vertAlign","obj":vertAlign,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"This element specifies the alignment which shall be applied to the contents of this run in relation to the default appearance of the run's text. This allows the text to be repositioned as subscript or superscript without altering the font size of the run properties.", "class":"") + ,("field":"eastAsia","name":"w:lang","obj":eastAsia,"attrEx":"w:eastAsia","nodeType":"","attrName":"", "desc":"Specifies the language which shall be used when processing the contents of this run which use East Asian characters, as determined by the Unicode character values of the run content.", "class":"") + ,("field":"Lang","name":"w:lang","obj":Lang,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"Specifies the language which shall be used to check spelling and grammar (if requested) when processing the contents of this run which use Latin characters, as determined by the Unicode character values of the run content.", "class":"") + ,("field":"bidi","name":"w:lang","obj":bidi,"attrEx":"w:bidi","nodeType":"","attrName":"", "desc":"Specifies the language which shall be used when processing the contents of this run which use complex script characters, as determined by the Unicode character values of the run content.", "class":"") + ,("field":"Del","name":Del.NodeName,"obj":Del,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TOptInfo") + ) union ExtNodes; + End; + + Property Name write writeName; + Function writeName(n); + Begin + rFont.cs := n; + rFont.eastAsia := n; + rFont.hAnsi := n; + rFont.ascii := n; + End; + + //Attributes + + //Nodes + rFont; + Bold; + noProof; + Color; + bCs; + Italic; + Strike; + dStrike; + kern; + Size; + szCs; + U; + vertAlign; + eastAsia; + Lang; + bidi; + Del; +End; + +/////////////////////////////////////////////////////////////// +/// TNumPr +/////////////////////////////////////////////////////////////// +type TNumPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:numPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Level","name":"w:ilvl","obj":Level,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"项目层级", "class":"") + ,("field":"numId","name":"w:numId","obj":numId,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"项目编号ID", "class":"") ) union ExtNodes; End; //Attributes //Nodes - Font; - Bold; - bCs; - I; - Strike; - dStrike; - Size; - szCs; - U; - vertAlign; - Lang; - eastAsia; + Level; + numId; End; /////////////////////////////////////////////////////////////// -/// TwpPr +/// TTextBoxImpl /////////////////////////////////////////////////////////////// -type TwpPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:pPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - rPr := new TwrPr('w:rPr'); +type TTextBoxImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:txbxContent'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + P := new TParagraphImpl(self, 'P'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":rPr.NodeName, "obj":rPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"P","name":P.NodeName,"obj":P,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TParagraphImpl") + ) union ExtNodes; End; //Attributes //Nodes + P; +End; + +/////////////////////////////////////////////////////////////// +/// TwpPr +/////////////////////////////////////////////////////////////// +type TwpPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:pPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + NumPr := new TNumPr(self, 'w:numPr'); + Tabs := new TTabStops(self, 'w:tabs'); + rPr := new TwrPr(self, 'w:rPr'); + Bdr := new TpBdr(self, 'w:pBdr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"StyleId","name":"w:pStyle","obj":StyleId,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"段落样式ID", "class":"") + ,("field":"NumPr","name":NumPr.NodeName,"obj":NumPr,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TNumPr") + ,("field":"Alignment","name":"w:jc","obj":Alignment,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"左、右、居中和对齐", "class":"") + ,("field":"FirstLineChars","name":"w:ind","obj":FirstLineChars,"attrEx":"w:firstLineChars","nodeType":"","attrName":"", "desc":"字符单位中的其他首行缩进", "class":"") + ,("field":"FirstLineIndent","name":"w:ind","obj":FirstLineIndent,"attrEx":"w:firstLine","nodeType":"","attrName":"", "desc":"指定段落第一行缩进的相对差异的值", "class":"") + ,("field":"RightChars","name":"w:ind","obj":RightChars,"attrEx":"w:rightChars","nodeType":"","attrName":"", "desc":"字符单位中的右缩进", "class":"") + ,("field":"RightIndent","name":"w:ind","obj":RightIndent,"attrEx":"w:right","nodeType":"","attrName":"", "desc":"指定段落的右边距和右边距之间的间距", "class":"") + ,("field":"LeftChars","name":"w:ind","obj":LeftChars,"attrEx":"w:leftChars","nodeType":"","attrName":"", "desc":"字符单位中的左缩进", "class":"") + ,("field":"LeftIndent","name":"w:ind","obj":LeftIndent,"attrEx":"w:left","nodeType":"","attrName":"", "desc":"当前文档中第一段的左缩进值", "class":"") + ,("field":"StartIndent","name":"w:ind","obj":StartIndent,"attrEx":"w:start","nodeType":"","attrName":"", "desc":"w:start 控制从左到右段落的左缩进或从右到左段落的右缩进,w:end 控制另一边", "class":"") + ,("field":"EndIndent","name":"w:ind","obj":EndIndent,"attrEx":"w:end","nodeType":"","attrName":"", "desc":"w:start 控制从左到右段落的左缩进或从右到左段落的右缩进,w:end 控制另一边", "class":"") + ,("field":"HangingChars","name":"w:ind","obj":HangingChars,"attrEx":"w:hangingChars","nodeType":"","attrName":"", "desc":"从字符单位的第一行中删除的缩进", "class":"") + ,("field":"Hanging","name":"w:ind","obj":Hanging,"attrEx":"w:hanging","nodeType":"","attrName":"", "desc":"从第一行中删除的缩进", "class":"") + ,("field":"LineSpacingRule","name":"w:spacing","obj":LineSpacingRule,"attrEx":"w:lineRule","nodeType":"","attrName":"", "desc":"该枚举指示 LineSpacing 应该被解释", "class":"") + ,("field":"LineSpacing","name":"w:spacing","obj":LineSpacing,"attrEx":"w:line","nodeType":"","attrName":"", "desc":"当前文档中第一段的行距", "class":"") + ,("field":"AfterLines","name":"w:spacing","obj":AfterLines,"attrEx":"w:afterLines","nodeType":"","attrName":"", "desc":"段落下方的间距(以行单位为单位)", "class":"") + ,("field":"SpaceAfter","name":"w:spacing","obj":SpaceAfter,"attrEx":"w:after","nodeType":"","attrName":"", "desc":"当前文档中第一段的段后间距", "class":"") + ,("field":"BeforeLines","name":"w:spacing","obj":BeforeLines,"attrEx":"w:beforeLines","nodeType":"","attrName":"", "desc":"段落上方的间距(以行单位为单位)行单位", "class":"") + ,("field":"SpaceBefore","name":"w:spacing","obj":SpaceBefore,"attrEx":"w:before","nodeType":"","attrName":"", "desc":"当前文档中第一段的段前间距", "class":"") + ,("field":"OutlineLevel","name":"w:outlineLvl","obj":OutlineLevel,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"设置当前文档中第一段的大纲级别", "class":"") + ,("field":"KeepTogether","name":"w:keepLines","obj":KeepTogether,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"段落是否应保持完整且不应跨越页面边界", "class":"") + ,("field":"KeepWithNext","name":"w:keepNext","obj":KeepWithNext,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"该段是否应与下一段保持在同一页上", "class":"") + ,("field":"PageBreakBefore","name":"w:pageBreakBefore","obj":PageBreakBefore,"attrEx":"","nodeType":"empty","attrName":"", "desc":"该段该段出现在前一段之后的页面顶部", "class":"") + ,("field":"WidowControl","name":"w:widowControl","obj":WidowControl,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"当Word对文档重新分页时,如果段落中的第一行和最后一行与段落的其余部分保持在同一页上", "class":"") + ,("field":"TextAlignment","name":"w:textAlignment","obj":TextAlignment,"attrEx":"","nodeType":"empty","attrName":"", "desc":"该值指示文本内容的水平对齐方式", "class":"") + ,("field":"AdjustRightInd","name":"w:adjustRightInd","obj":AdjustRightInd,"attrEx":"","nodeType":"empty","attrName":"", "desc":"使用文档网格时自动调整右缩进", "class":"") + ,("field":"AutoSpaceDE","name":"w:autoSpaceDE","obj":AutoSpaceDE,"attrEx":"","nodeType":"empty","attrName":"", "desc":"自动调整拉丁语和东亚文本的间距", "class":"") + ,("field":"AutoSpaceDN","name":"w:autoSpaceDN","obj":AutoSpaceDN,"attrEx":"","nodeType":"empty","attrName":"", "desc":"自动调整东亚文本和数字的间距", "class":"") + ,("field":"Tabs","name":Tabs.NodeName,"obj":Tabs,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TTabStops") + ,("field":"rPr","name":rPr.NodeName,"obj":rPr,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TwrPr") + ,("field":"cnfStyle","name":"w:cnfStyle","obj":cnfStyle,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"段落条件格式:此元素指定格式属性的已应用于此段落,如果该段落包含在表格单元格的条件的表格样式的集。https://learn.microsoft.com/zh-cn/dotnet/api/documentformat.openxml.wordprocessing.conditionalformatstyle?view=openxml-2.8.1", "class":"") + ,("field":"textFlow","name":"w:textFlow","obj":textFlow,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"disable", "class":"") + ,("field":"Bdr","name":Bdr.NodeName,"obj":Bdr,"attrEx":"","nodeType":"","attrName":"", "desc":"文字边框", "class":"TpBdr") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + StyleId; + NumPr; + Alignment; + FirstLineChars; + FirstLineIndent; + RightChars; + RightIndent; + LeftChars; + LeftIndent; + StartIndent; + EndIndent; + HangingChars; + Hanging; + LineSpacingRule; + LineSpacing; + AfterLines; + SpaceAfter; + BeforeLines; + SpaceBefore; + OutlineLevel; + KeepTogether; + KeepWithNext; + PageBreakBefore; + WidowControl; + TextAlignment; + AdjustRightInd; + AutoSpaceDE; + AutoSpaceDN; + Tabs; rPr; + cnfStyle; + textFlow; + Bdr; End; /////////////////////////////////////////////////////////////// /// TcNvGraphicFramePr /////////////////////////////////////////////////////////////// -type TcNvGraphicFramePr=class(NodeInfo) - Function Create(); overload; - Begin - Create('wp:TcNvGraphicFramePr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TcNvGraphicFramePr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'wp:TcNvGraphicFramePr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"a:graphicFrameLocks", "obj":noChangeAspect,"attrEx":"noChangeAspect","nodeType":"","attrName":""),("name":"a:graphicFrameLocks", "obj":xmlns,"attrEx":"xmlns:a","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"noChangeAspect","name":"a:graphicFrameLocks","obj":noChangeAspect,"attrEx":"noChangeAspect","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"xmlns","name":"a:graphicFrameLocks","obj":xmlns,"attrEx":"xmlns:a","nodeType":"","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; @@ -3610,239 +4277,640 @@ End; /////////////////////////////////////////////////////////////// /// TnvPicPr /////////////////////////////////////////////////////////////// -type TnvPicPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('pic:nvPicPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TnvPicPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pic:nvPicPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + CNvPr := new TCNvPr(self, 'pic:cNvPr'); + CNvPicPr := new TcNvPicPr(self, 'xdr:cNvPicPr'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"pic:cNvPr", "obj":Name,"attrEx":"name","nodeType":"","attrName":""),("name":"pic:cNvPr", "obj":ID,"attrEx":"id","nodeType":"","attrName":"") - ,("name":"pic:cNvPr", "obj":Descr,"attrEx":"descr","nodeType":"","attrName":"")) union ExtNodes; - End; - - //Attributes - - //Nodes - Name; - ID; - Descr; -End; - -/////////////////////////////////////////////////////////////// -/// TprstGeom -/////////////////////////////////////////////////////////////// -type TprstGeom=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:prstGeom'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - //TODO... - End; - - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('prst':prst) union ExtAttr; - End; - - Function GetChildren(); override; - Begin - HandleChildren(); - return ExtNodes; - End; - - //Attributes - prst; - - //Nodes -End; - -/////////////////////////////////////////////////////////////// -/// TpicsPpr -/////////////////////////////////////////////////////////////// -type TpicsPpr=class(NodeInfo) - Function Create(); overload; - Begin - Create('pic:spPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - PrstGeom := new TprstGeom('a:prstGeom'); - XFrm := new TXfrm('a:xfrm'); - //TODO... - End; - - Function GetAttrs(); override; - Begin - HandleAttrs(); - return ExtAttr; - End; - - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":PrstGeom.NodeName, "obj":PrstGeom,"attrEx":"","nodeType":"","attrName":""),("name":XFrm.NodeName, "obj":XFrm,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"CNvPr","name":CNvPr.NodeName,"obj":CNvPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TCNvPr") + ,("field":"CNvPicPr","name":CNvPicPr.NodeName,"obj":CNvPicPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcNvPicPr") + ,("field":"CNvSpPr","name":"xdr:cNvSpPr","obj":CNvSpPr,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; //Attributes //Nodes - PrstGeom; - XFrm; + CNvPr; + CNvPicPr; + CNvSpPr; End; /////////////////////////////////////////////////////////////// -/// TFill +/// TCNvPr /////////////////////////////////////////////////////////////// -type TFill=class(NodeInfo) - Function Create(); overload; - Begin - Create('pic:blipFill'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TCNvPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pic:cNvPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + ExtLst := new TExtLst(self, 'a:extLst'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("ID", "id", ID, ""),("Name", "name", Name, ""),("Descr", "descr", Descr, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"ExtLst","name":ExtLst.NodeName,"obj":ExtLst,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TExtLst") + ) union ExtNodes; + End; + + //Attributes + ID; + Name; + Descr; + + //Nodes + ExtLst; +End; + +/////////////////////////////////////////////////////////////// +/// TExtLst +/////////////////////////////////////////////////////////////// +type TExtLst=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:extLst'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Ext := new TAext(self, 'a:ext'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"a:blip", "obj":blip,"attrEx":"r:embed","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Ext","name":Ext.NodeName,"obj":Ext,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TAext") + ) union ExtNodes; End; //Attributes //Nodes - blip; + Ext; +End; + +/////////////////////////////////////////////////////////////// +/// TAext +/////////////////////////////////////////////////////////////// +type TAext=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:ext'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Uri", "uri", Uri, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Xmlns16","name":"a16:creationId","obj":Xmlns16,"attrEx":"xmlns:a16","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Id","name":"a16:creationId","obj":Id,"attrEx":"id","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + Uri; + + //Nodes + Xmlns16; + Id; +End; + +/////////////////////////////////////////////////////////////// +/// TprstGeom +/////////////////////////////////////////////////////////////// +type TprstGeom=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:prstGeom'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Prst", "prst", Prst, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"AvLst","name":"a:avLst","obj":AvLst,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + Prst; + + //Nodes + AvLst; +End; + +/////////////////////////////////////////////////////////////// +/// TblipFill +/////////////////////////////////////////////////////////////// +type TblipFill=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pic:blipFill'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Blip := new TBlip(self, 'a:blip'); + Stretch := new TStretch(self, 'a:stretch'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Blip","name":Blip.NodeName,"obj":Blip,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBlip") + ,("field":"Stretch","name":Stretch.NodeName,"obj":Stretch,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStretch") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Blip; + Stretch; +End; + +/////////////////////////////////////////////////////////////// +/// TwLine +/////////////////////////////////////////////////////////////// +type TwLine=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:ln'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SolidFill := new TSolidFill(self, 'a:solidFill'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"SolidFill","name":SolidFill.NodeName,"obj":SolidFill,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSolidFill") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + SolidFill; +End; + +/////////////////////////////////////////////////////////////// +/// TpicsPpr +/////////////////////////////////////////////////////////////// +type TpicsPpr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pic:spPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + XFrm := new TXfrm(self, 'a:xfrm'); + PrstGeom := new TprstGeom(self, 'a:prstGeom'); + Line := new TwLine(self, 'a:ln'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"XFrm","name":XFrm.NodeName,"obj":XFrm,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TXfrm") + ,("field":"PrstGeom","name":PrstGeom.NodeName,"obj":PrstGeom,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TprstGeom") + ,("field":"Line","name":Line.NodeName,"obj":Line,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwLine") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + XFrm; + PrstGeom; + Line; +End; + +/////////////////////////////////////////////////////////////// +/// TBlip +/////////////////////////////////////////////////////////////// +type TBlip=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:blip'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Xmlns", "xmlns:r", Xmlns, ""),("Embed", "r:embed", Embed, ""),("Cstate", "cstate", Cstate, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Xmlns; + Embed; + Cstate; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TStretch +/////////////////////////////////////////////////////////////// +type TStretch=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:stretch'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"FillRect","name":"a:fillRect","obj":FillRect,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + FillRect; +End; + +/////////////////////////////////////////////////////////////// +/// TRef +/////////////////////////////////////////////////////////////// +type TRef=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:stretch'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + SchemeClr := new TScheme(self, 'a:schemeClr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Idx", "idx", Idx, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"SchemeClr","name":SchemeClr.NodeName,"obj":SchemeClr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TScheme") + ) union ExtNodes; + End; + + //Attributes + Idx; + + //Nodes + SchemeClr; +End; + +/////////////////////////////////////////////////////////////// +/// TScheme +/////////////////////////////////////////////////////////////// +type TScheme=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:schemeClr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Val", "val", Val, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Shade","name":"a:shade","obj":Shade,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + Val; + + //Nodes + Shade; +End; + +/////////////////////////////////////////////////////////////// +/// TXdrStyle +/////////////////////////////////////////////////////////////// +type TXdrStyle=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:stretch'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + LnRef := new TRef(self, 'a:lnRef'); + FillRef := new TRef(self, 'a:fillRef'); + EffectRef := new TRef(self, 'a:effectRef'); + FontRef := new TRef(self, 'a:fontRef'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"LnRef","name":LnRef.NodeName,"obj":LnRef,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRef") + ,("field":"FillRef","name":FillRef.NodeName,"obj":FillRef,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRef") + ,("field":"EffectRef","name":EffectRef.NodeName,"obj":EffectRef,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRef") + ,("field":"FontRef","name":FontRef.NodeName,"obj":FontRef,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRef") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + LnRef; + FillRef; + EffectRef; + FontRef; End; /////////////////////////////////////////////////////////////// /// TPic /////////////////////////////////////////////////////////////// -type TPic=class(NodeInfo) - Function Create(); overload; - Begin - Create('pic:pic'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - nvPicPr := new TnvPicPr('pic:nvPicPr'); - Fill := new TFill('pic:blipFill'); - spPr := new TpicsPpr('pic:spPr'); +type TPic=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'pic:pic'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + NvPicPr := new TnvPicPr(self, 'pic:nvPicPr'); + BlipFill := new TblipFill(self, 'pic:blipFill'); + SpPr := new TSpPr(self, 'pic:spPr'); + Style := new TXdrStyle(self, 'xdr:style'); + TxBody := new TTxPr(self, 'xdr:txBody'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('xmlns:pic':xmlns) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Macro", "macro", Macro, ""),("Textlink", "textlink", Textlink, ""),("Xmlns", "xmlns:pic", Xmlns, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":nvPicPr.NodeName, "obj":nvPicPr,"attrEx":"","nodeType":"","attrName":""),("name":Fill.NodeName, "obj":Fill,"attrEx":"","nodeType":"","attrName":"") - ,("name":spPr.NodeName, "obj":spPr,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"NvPicPr","name":NvPicPr.NodeName,"obj":NvPicPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TnvPicPr") + ,("field":"BlipFill","name":BlipFill.NodeName,"obj":BlipFill,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TblipFill") + ,("field":"SpPr","name":SpPr.NodeName,"obj":SpPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSpPr") + ,("field":"Style","name":Style.NodeName,"obj":Style,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TXdrStyle") + ,("field":"TxBody","name":TxBody.NodeName,"obj":TxBody,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TTxPr") + ) union ExtNodes; End; //Attributes - xmlns; + Macro; + Textlink; + Xmlns; //Nodes - nvPicPr; - Fill; - spPr; + NvPicPr; + BlipFill; + SpPr; + Style; + TxBody; End; /////////////////////////////////////////////////////////////// /// TGraphicData /////////////////////////////////////////////////////////////// -type TGraphicData=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:graphicData'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Pic := new TPic('pic:pic'); +type TGraphicData=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:graphicData'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Pic := new TPic(self, 'pic:pic'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('uri':uri) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("uri", "uri", uri, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"c:chart", "obj":R,"attrEx":"xmlns:r","nodeType":"","attrName":""),("name":"c:chart", "obj":Rid,"attrEx":"r:id","nodeType":"","attrName":"") - ,("name":"c:chart", "obj":C,"attrEx":"xmlns:c","nodeType":"","attrName":""),("name":Pic.NodeName, "obj":Pic,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"C","name":"c:chart","obj":C,"attrEx":"xmlns:c","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"R","name":"c:chart","obj":R,"attrEx":"xmlns:r","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Rid","name":"c:chart","obj":Rid,"attrEx":"r:id","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Pic","name":Pic.NodeName,"obj":Pic,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TPic") ) union ExtNodes; End; @@ -3850,43 +4918,44 @@ type TGraphicData=class(NodeInfo) uri; //Nodes + C; R; Rid; - C; Pic; End; /////////////////////////////////////////////////////////////// /// TGraphic /////////////////////////////////////////////////////////////// -type TGraphic=class(NodeInfo) - Function Create(); overload; - Begin - Create('a:graphic'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - GraphicData := new TGraphicData('a:graphicData'); +type TGraphic=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'a:graphic'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + GraphicData := new TGraphicData(self, 'a:graphicData'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('xmlns:a':xmlns) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("xmlns", "xmlns:a", xmlns, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":GraphicData.NodeName, "obj":GraphicData,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"GraphicData","name":GraphicData.NodeName,"obj":GraphicData,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TGraphicData") + ) union ExtNodes; End; //Attributes @@ -3899,57 +4968,63 @@ End; /////////////////////////////////////////////////////////////// /// TwInline /////////////////////////////////////////////////////////////// -type TwInline=class(NodeInfo) - Function Create(); overload; - Begin - Create('wp:inline'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - cNvGraphicFramePr := new TcNvGraphicFramePr('wp:cNvGraphicFramePr'); - Graphic := new TGraphic('a:graphic'); +type TwInline=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'wp:inline'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + cNvGraphicFramePr := new TcNvGraphicFramePr(self, 'wp:cNvGraphicFramePr'); + Graphic := new TGraphic(self, 'a:graphic'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('distR':distR,'distL':distL,'distB':distB,'distT':distT) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("distT", "distT", distT, ""),("distB", "distB", distB, ""),("distL", "distL", distL, ""),("distR", "distR", distR, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"wp:extent", "obj":cy,"attrEx":"cy","nodeType":"","attrName":""),("name":"wp:extent", "obj":cx,"attrEx":"cx","nodeType":"","attrName":"") - ,("name":"wp:effectExtent", "obj":r,"attrEx":"r","nodeType":"","attrName":""),("name":"wp:effectExtent", "obj":b,"attrEx":"b","nodeType":"","attrName":"") - ,("name":"wp:effectExtent", "obj":t,"attrEx":"t","nodeType":"","attrName":""),("name":"wp:effectExtent", "obj":l,"attrEx":"l","nodeType":"","attrName":"") - ,("name":"wp:docPr", "obj":Name,"attrEx":"name","nodeType":"","attrName":""),("name":"wp:docPr", "obj":ID,"attrEx":"id","nodeType":"","attrName":"") - ,("name":"wp:docPr", "obj":Descr,"attrEx":"descr","nodeType":"","attrName":""),("name":cNvGraphicFramePr.NodeName, "obj":cNvGraphicFramePr,"attrEx":"","nodeType":"","attrName":"") - ,("name":Graphic.NodeName, "obj":Graphic,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"cx","name":"wp:extent","obj":cx,"attrEx":"cx","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"cy","name":"wp:extent","obj":cy,"attrEx":"cy","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"l","name":"wp:effectExtent","obj":l,"attrEx":"l","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"t","name":"wp:effectExtent","obj":t,"attrEx":"t","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"r","name":"wp:effectExtent","obj":r,"attrEx":"r","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"b","name":"wp:effectExtent","obj":b,"attrEx":"b","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"ID","name":"wp:docPr","obj":ID,"attrEx":"id","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Name","name":"wp:docPr","obj":Name,"attrEx":"name","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Descr","name":"wp:docPr","obj":Descr,"attrEx":"descr","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"cNvGraphicFramePr","name":cNvGraphicFramePr.NodeName,"obj":cNvGraphicFramePr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TcNvGraphicFramePr") + ,("field":"Graphic","name":Graphic.NodeName,"obj":Graphic,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TGraphic") + ) union ExtNodes; End; //Attributes - distR; - distL; - distB; distT; + distB; + distL; + distR; //Nodes - cy; cx; + cy; + l; + t; r; b; - t; - l; - Name; ID; + Name; Descr; cNvGraphicFramePr; Graphic; @@ -3958,34 +5033,35 @@ End; /////////////////////////////////////////////////////////////// /// TwDrawing /////////////////////////////////////////////////////////////// -type TwDrawing=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:drawing'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - WInline := new TwInline('wp:inline'); +type TwDrawing=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:drawing'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + WInline := new TwInline(self, 'wp:inline'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":WInline.NodeName, "obj":WInline,"attrEx":"","nodeType":"","attrName":"")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"WInline","name":WInline.NodeName,"obj":WInline,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwInline") + ) union ExtNodes; End; //Attributes @@ -3995,83 +5071,230 @@ type TwDrawing=class(NodeInfo) End; /////////////////////////////////////////////////////////////// -/// TRun +/// TInstrText /////////////////////////////////////////////////////////////// -type TRun=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:r'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - rPr := new TwrPr('w:rPr'); - Br := new TBr('w:br'); - Drawing := new TwDrawing('w:drawing'); +type TInstrText=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:instrText'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Space", "xml:space", Space, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":rPr.NodeName, "obj":rPr,"attrEx":"","nodeType":"","attrName":""),("name":"w:t", "obj":Text,"attrEx":"","nodeType":"pcdata","attrName":"") - ,("name":Br.NodeName, "obj":Br,"attrEx":"","nodeType":"","attrName":""),("name":Drawing.NodeName, "obj":Drawing,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Data","name":"Data","obj":Data,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ) union ExtNodes; End; //Attributes + Space; + + //Nodes + Data; +End; + +/////////////////////////////////////////////////////////////// +/// TRunImpl +/////////////////////////////////////////////////////////////// +type TRunImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:r'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + rPr := new TwrPr(self, 'w:rPr'); + Br := new TBr(self, 'w:br'); + Drawing := new TwDrawing(self, 'w:drawing'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("xmlns", "xmlns:w", xmlns, ""),("rsidR", "w:rsidR", rsidR, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"rPr","name":rPr.NodeName,"obj":rPr,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TwrPr") + ,("field":"fldCharType","name":"w:fldChar","obj":fldCharType,"attrEx":"w:fldCharType","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Dirty","name":"w:fldChar","obj":Dirty,"attrEx":"w:dirty","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"InstrText","name":"w:instrText","obj":InstrText,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"InstrTextSpace","name":"w:instrText","obj":InstrTextSpace,"attrEx":"xml:space","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Tab","name":"w:tab","obj":Tab,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Br","name":Br.NodeName,"obj":Br,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBr") + ,("field":"T","name":"w:t","obj":T,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") + ,("field":"Space","name":"w:t","obj":Space,"attrEx":"xml:space","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Drawing","name":Drawing.NodeName,"obj":Drawing,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwDrawing") + ) union ExtNodes; + End; + + //Attributes + xmlns; + rsidR; //Nodes rPr; - Text; + fldCharType; + Dirty; + InstrText; + InstrTextSpace; + Tab; Br; + T; + Space; Drawing; End; /////////////////////////////////////////////////////////////// -/// TParagraph +/// TBookMark /////////////////////////////////////////////////////////////// -type TParagraph=class(NodeInfo, DocumentPart) - Function Create(); overload; - Begin - Create('w:p'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - pPr := new TwpPr('w:pPr'); - Run := new TRun('w:r'); +type TBookMark=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:bookmarkStart'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("name", "w:name", name, ""),("id", "w:id", id, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + name; + id; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TFldSimple +/////////////////////////////////////////////////////////////// +type TFldSimple=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:fldSimple'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Run := new TRun(self, 'w:r'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("instr", "w:instr", instr, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Run","name":Run.NodeName,"obj":Run,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRun") + ) union ExtNodes; + End; + + //Attributes + instr; + + //Nodes + Run; +End; + +/////////////////////////////////////////////////////////////// +/// TParagraphImpl +/////////////////////////////////////////////////////////////// +type TParagraphImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:p'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + pPr := new TwpPr(self, 'w:pPr'); + markStart := new TBookMark(self, 'w:bookmarkStart'); + Run := new TRun(self, 'w:r'); + markEnd := new TBookMark(self, 'w:bookmarkEnd'); + PageNo := new TFldSimple(self, 'w:fldSimple'); + OfRun := new TRun(self, 'w:r'); + TotalPageNo := new TFldSimple(self, 'w:fldSimple'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":pPr.NodeName, "obj":pPr,"attrEx":"","nodeType":"","attrName":""),("name":Run.NodeName, "obj":Run,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"pPr","name":pPr.NodeName,"obj":pPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwpPr") + ,("field":"markStart","name":markStart.NodeName,"obj":markStart,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBookMark") + ,("field":"Run","name":Run.NodeName,"obj":Run,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRun") + ,("field":"markEnd","name":markEnd.NodeName,"obj":markEnd,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TBookMark") + ,("field":"PageNo","name":PageNo.NodeName,"obj":PageNo,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TFldSimple") + ,("field":"OfRun","name":OfRun.NodeName,"obj":OfRun,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRun") + ,("field":"TotalPageNo","name":TotalPageNo.NodeName,"obj":TotalPageNo,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TFldSimple") ) union ExtNodes; End; @@ -4079,80 +5302,640 @@ type TParagraph=class(NodeInfo, DocumentPart) //Nodes pPr; + markStart; Run; + markEnd; + PageNo; + OfRun; + TotalPageNo; End; /////////////////////////////////////////////////////////////// /// TwBody /////////////////////////////////////////////////////////////// -type TwBody=class(NodeInfo, DocumentBody) - Function Create(); overload; - Begin - Create('w:body'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - Parts := array(); +type TwBody=class(NodeInfo, TDocumentBody) + Function Create(); overload; + Begin + Create(nil, 'w:body'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + ps := array(); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"w:p", "obj":Parts,"attrEx":"","nodeType":"","attrName":"","arrObj":"array")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"ps","name":"w:p","obj":ps,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"", "class":"TParagraphImpl") + ) union ExtNodes; End; //Attributes //Nodes - Parts; + ps; +End; + +/////////////////////////////////////////////////////////////// +/// TOptInfo +/////////////////////////////////////////////////////////////// +type TOptInfo=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:cellDel'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Author", "w:author", Author, "作者"),("Date", "w:date", Date, "修改日期"),("ID", "w:id", ID, "disable")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Author; + Date; + ID; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TRevisionImpl +/////////////////////////////////////////////////////////////// +type TRevisionImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:del'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Author", "w:author", Author, "作者"),("Date", "w:date", Date, "修改日期"),("ID", "w:id", ID, "disable")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Author; + Date; + ID; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TDocCommentImpl +/////////////////////////////////////////////////////////////// +type TDocCommentImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:comment'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + P := new TParagraphImpl(self, 'w:p'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Author", "w:author", Author, "作者"),("Date", "w:date", Date, "修改日期"),("ID", "w:id", ID, "disable")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"P","name":P.NodeName,"obj":P,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TParagraphImpl") + ) union ExtNodes; + End; + + //Attributes + Author; + Date; + ID; + + //Nodes + P; +End; + +/////////////////////////////////////////////////////////////// +/// TCol +/////////////////////////////////////////////////////////////// +type TCol=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:cols'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("W", "w:w", W, "Column Width"),("space", "w:space", space, "Space Before Following Column")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + W; + space; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TCols +/////////////////////////////////////////////////////////////// +type TCols=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:cols'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + col := array(); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("equalWidth", "w:equalWidth", equalWidth, "Equal Column Widths"),("num", "w:num", num, "Number of Equal Width Columns"),("sep", "w:sep", sep, "Draw Line Between Columns"),("space", "w:space", space, "Spacing Between Equal Width Columns")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"col","name":"w:col","obj":col,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"Column Definitions", "class":"TCol") + ) union ExtNodes; + End; + + //Attributes + equalWidth; + num; + sep; + space; + + //Nodes + col; +End; + +/////////////////////////////////////////////////////////////// +/// TPageMargin +/////////////////////////////////////////////////////////////// +type TPageMargin=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:pgMar'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("gutter", "w:gutter", gutter, "Specifies the page gutter for each page in the current section."),("footer", "w:footer", footer, "Specifies the distance (in twentieths of a point) from the bottom edge of the page to the bottom edge of the footer."),("header", "w:header", header, "Specifies the distance (in twentieths of a point) from the top edge of the page to the top edge of the header."),("left", "w:left", left, "Specifies the distance (in twentieths of a point) between the left edge of the page and the left edge of the text extents for this document."),("bottom", "w:bottom", bottom, "Specifies the distance (in twentieths of a point) between the bottom of the text margins for the main document and the bottom of the page for all pages in this section."),("right", "w:right", right, "Specifies the distance (in twentieths of a point) between the right edge of the page and the right edge of the text extents for this document."),("top", "w:top", top, "Specifies the distance (in twentieths of a point) between the top of the text margins for the main document and the top of the page for all pages in this section.")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + gutter; + footer; + header; + left; + bottom; + right; + top; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TDocGrid +/////////////////////////////////////////////////////////////// +type TDocGrid=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:docGrid'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("charSpace", "w:charSpace", charSpace, ""),("charSize", "w:charSize", charSize, "Document Grid Character Pitch"),("linePitch", "w:linePitch", linePitch, "Document Grid Line Pitch"),("Type", "w:type", Type, "Document Grid Type")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + charSpace; + charSize; + linePitch; + Type; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TReference +/////////////////////////////////////////////////////////////// +type TReference=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:headerReference'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Type", "w:type", Type, ""),("ID", "r:id", ID, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Type; + ID; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TPageBorders +/////////////////////////////////////////////////////////////// +type TPageBorders=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:pgBorders'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Top := new TwBorder(self, 'w:top'); + Left := new TwBorder(self, 'w:left'); + Bottom := new TwBorder(self, 'w:bottom'); + Right := new TwBorder(self, 'w:right'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("offsetFrom", "w:offsetFrom", offsetFrom, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Top","name":Top.NodeName,"obj":Top,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"Left","name":Left.NodeName,"obj":Left,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"Bottom","name":Bottom.NodeName,"obj":Bottom,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"Right","name":Right.NodeName,"obj":Right,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ) union ExtNodes; + End; + + //Attributes + offsetFrom; + + //Nodes + Top; + Left; + Bottom; + Right; +End; + +/////////////////////////////////////////////////////////////// +/// TPage +/////////////////////////////////////////////////////////////// +type TPage=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:pgSz'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Code", "w:code", Code, "Specifies a printer-specific paper code for the paper type, which shall be used by the printer for pages in this section."),("Height", "w:h", Height, "Specifies the height (in twentieths of a point) for all pages in the current section.")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Weight","name":"w:w","obj":Weight,"attrEx":"","nodeType":"","attrName":"", "desc":"This attribute indicates the width (in twentieths of a point) for all pages in the current section.", "class":"") + ,("field":"Orient ","name":"w:orient ","obj":Orient ,"attrEx":"","nodeType":"","attrName":"", "desc":"Specifies the orientation of all pages in this section.", "class":"") + ) union ExtNodes; + End; + + //Attributes + Code; + Height; + + //Nodes + Weight; + Orient ; +End; + +/////////////////////////////////////////////////////////////// +/// TDocSectionImpl +/////////////////////////////////////////////////////////////// +type TDocSectionImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:sectPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Header := new TReference(self, 'w:headerReference'); + Footer := new TReference(self, 'w:footerReference'); + cols := new TCols(self, 'w:cols'); + docGrid := new TDocGrid(self, 'w:docGrid'); + pgMar := new TPageMargin(self, 'w:pgMar'); + Page := new TPage(self, 'w:pgSz'); + Borders := new TPageBorders(self, 'w:pgBorders'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Header","name":Header.NodeName,"obj":Header,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TReference") + ,("field":"Footer","name":Footer.NodeName,"obj":Footer,"attrEx":"","nodeType":"","attrName":"", "desc":"disable", "class":"TReference") + ,("field":"bidi","name":"w:bidi","obj":bidi,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"Right to Left Section Layout", "class":"") + ,("field":"cols","name":cols.NodeName,"obj":cols,"attrEx":"","nodeType":"","attrName":"", "desc":"Column Definitions", "class":"TCols") + ,("field":"docGrid","name":docGrid.NodeName,"obj":docGrid,"attrEx":"","nodeType":"","attrName":"", "desc":"Document Grid", "class":"TDocGrid") + ,("field":"pgMar","name":pgMar.NodeName,"obj":pgMar,"attrEx":"","nodeType":"","attrName":"", "desc":"Page Margin设置", "class":"TPageMargin") + ,("field":"Page","name":Page.NodeName,"obj":Page,"attrEx":"","nodeType":"","attrName":"", "desc":"页面设置", "class":"TPage") + ,("field":"Borders","name":Borders.NodeName,"obj":Borders,"attrEx":"","nodeType":"","attrName":"", "desc":"页面边框属性", "class":"TPageBorders") + ,("field":"titlePg","name":"w:titlePg","obj":titlePg,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"vAlign","name":"w:vAlign","obj":vAlign,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Type","name":"w:type","obj":Type,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"textDirection","name":"w:textDirection","obj":textDirection,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Header; + Footer; + bidi; + cols; + docGrid; + pgMar; + Page; + Borders; + titlePg; + vAlign; + Type; + textDirection; +End; + +/////////////////////////////////////////////////////////////// +/// TcellMerge +/////////////////////////////////////////////////////////////// +type TcellMerge=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:cellMerge'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Author", "w:author", Author, ""),("Date", "w:date", Date, ""),("ID", "w:id", ID, ""),("vmerge", "w:vmerge", vmerge, ""),("vmergeOrig", "w:vmergeOrig", vmergeOrig, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Author; + Date; + ID; + vmerge; + vmergeOrig; + + //Nodes End; /////////////////////////////////////////////////////////////// /// TwTcPr /////////////////////////////////////////////////////////////// -type TwTcPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:tcPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TwTcPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tcPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Shading := new TwShading(self, 'w:shd'); + CellMar := new TTblCellMar(self, 'w:tcMar'); + Borders := new TwTblBorders(self, 'w:tcBorders'); + Del := new TOptInfo(self, 'w:cellDel'); + Ins := new TOptInfo(self, 'w:cellIns'); + cellMerge := new TcellMerge(self, 'w:cellMerge'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"w:tcW", "obj":Width,"attrEx":"w:w","nodeType":"","attrName":""),("name":"w:tcW", "obj":Type,"attrEx":"w:type","nodeType":"","attrName":"") - ,("name":"w:shd", "obj":Shd,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:shd", "obj":Color,"attrEx":"w:color","nodeType":"","attrName":"") - ,("name":"w:shd", "obj":Fill,"attrEx":"w:fill","nodeType":"","attrName":"")) union ExtNodes; + 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":"") + ,("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":"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":"Del","name":Del.NodeName,"obj":Del,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TOptInfo") + ,("field":"Ins","name":Ins.NodeName,"obj":Ins,"attrEx":"","nodeType":"","attrName":"", "desc":"", "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":"") + ) union ExtNodes; End; //Attributes @@ -4160,43 +5943,56 @@ type TwTcPr=class(NodeInfo) //Nodes Width; Type; - Shd; - Color; - Fill; + Shading; + cnfStyle; + CellMar; + Borders; + gridSpan; + hideMark; + hmerge; + noWrap; + tcFitText; + textDirection; + Del; + Ins; + cellMerge; + vAlign; + vmerge; End; /////////////////////////////////////////////////////////////// /// TwTc /////////////////////////////////////////////////////////////// -type TwTc=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:tc'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - TcPr := new TwTcPr('w:tcPr'); - P := new TParagraph('w:p'); +type TwTc=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tc'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + TcPr := new TwTcPr(self, 'w:tcPr'); + P := new TParagraphImpl(self, 'w:p'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":TcPr.NodeName, "obj":TcPr,"attrEx":"","nodeType":"","attrName":""),("name":P.NodeName, "obj":P,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"TcPr","name":TcPr.NodeName,"obj":TcPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwTcPr") + ,("field":"P","name":P.NodeName,"obj":P,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TParagraphImpl") ) union ExtNodes; End; @@ -4210,34 +6006,44 @@ End; /////////////////////////////////////////////////////////////// /// TwTrPr /////////////////////////////////////////////////////////////// -type TwTrPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:trPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TwTrPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:trPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Del := new TOptInfo(self, 'w:del'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"w:trHeight", "obj":Height,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:trHeight", "obj":Rule,"attrEx":"w:hRule","nodeType":"","attrName":"") - ,("name":"w:jc", "obj":JC,"attrEx":"w:val","nodeType":"","attrName":"")) union ExtNodes; + 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":"") + ,("field":"Del","name":Del.NodeName,"obj":Del,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TOptInfo") + ) union ExtNodes; End; //Attributes @@ -4245,94 +6051,180 @@ type TwTrPr=class(NodeInfo) //Nodes Height; Rule; - JC; + Alignment; + CantSplit; + cnfStyle; + gridAfter; + gridBefore; + hidden; + tblHeader; + Del; End; /////////////////////////////////////////////////////////////// -/// TwTr +/// TwShading /////////////////////////////////////////////////////////////// -type TwTr=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:tr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - TrPr := new TwTrPr('w:trPr'); - Tc := array(); +type TwShading=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:shd'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Val", "w:val", Val, "Specifies the pattern which shall be used to lay the pattern color over the background color for this paragraph shading.This pattern consists of a mask which is applied over the background shading color to get the locations where the pattern color should be shown. Each of these possible masks are shown in the simple type values referenced below."),("Color", "w:color", Color, "foreground: RRGGBB format or auto"),("Fill", "w:fill", Fill, "background: RRGGBB format or auto"),("ThemeColor", "w:themeColor", ThemeColor, "foreground: theme color"),("ThemeFill", "w:themeFill", ThemeFill, "background: theme color"),("ThemeFillShade", "w:themeFillShade", ThemeFillShade, "shading color: theme color"),("ThemeFillTint", "w:themeFillTint", ThemeFillTint, "tint value applied to the supplied theme color (if any) for this shading instance."),("ThemeShade", "w:themeShade", ThemeShade, "Specifies the shade value applied to the supplied theme color (if any) for this shading color."),("ThemeTint", "w:themeTint", ThemeTint, "Specifies the tint value applied to the supplied theme color (if any) for this shading instance.")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Val; + Color; + Fill; + ThemeColor; + ThemeFill; + ThemeFillShade; + ThemeFillTint; + ThemeShade; + ThemeTint; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TTblCellMar +/////////////////////////////////////////////////////////////// +type TTblCellMar=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tblCellMar'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":TrPr.NodeName, "obj":TrPr,"attrEx":"","nodeType":"","attrName":""),("name":"w:tc", "obj":Tc,"attrEx":"","nodeType":"","attrName":"","arrObj":"array") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Top","name":"w:top","obj":Top,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"Table Cell Top Margin, Specifies the value of the width property.", "class":"") + ,("field":"TopType","name":"w:top","obj":TopType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"Table Cell Top Margin, Specifies the units of the width property,auto (Automatically Determined Width),dxa (Width in Twentieths of a Point)nil (No Width)pct (Width in Fiftieths of a Percent)", "class":"") + ,("field":"Left","name":"w:left","obj":Left,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"Table Cell Left Margin, Specifies the value of the width property.", "class":"") + ,("field":"LeftType","name":"w:left","obj":LeftType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"Table Cell Left Margin, Specifies the units of the width property", "class":"") + ,("field":"Bottom","name":"w:bottom","obj":Bottom,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"Table Cell Bottom Margin, Specifies the value of the width property.", "class":"") + ,("field":"BottomType","name":"w:bottom","obj":BottomType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"Table Cell Bottom Margin, Specifies the units of the width property", "class":"") + ,("field":"Right","name":"w:right","obj":Right,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"Table Cell Right Margin, Specifies the value of the width property.", "class":"") + ,("field":"RightType","name":"w:right","obj":RightType,"attrEx":"w:type","nodeType":"","attrName":"", "desc":"Table Cell Right Margin, Specifies the units of the width property", "class":"") ) union ExtNodes; End; //Attributes //Nodes - TrPr; - Tc; + Top; + TopType; + Left; + LeftType; + Bottom; + BottomType; + Right; + RightType; End; /////////////////////////////////////////////////////////////// -/// TwTblPr +/// TTblPrEx /////////////////////////////////////////////////////////////// -type TwTblPr=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:tblPr'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TTblPrEx=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tblPrEx'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Borders := new TwTblBorders(self, 'w:tblBorders'); + Shading := new TwShading(self, 'w:shd'); + CellMar := new TTblCellMar(self, 'w:tblCellMar'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"w:tblStyle", "obj":Style,"attrEx":"w:val","nodeType":"","attrName":""),("name":"w:tblW", "obj":W,"attrEx":"w:w","nodeType":"","attrName":"") - ,("name":"w:tblW", "obj":Type,"attrEx":"w:type","nodeType":"","attrName":""),("name":"w:tblLook", "obj":Val,"attrEx":"w:val","nodeType":"","attrName":"") - ,("name":"w:tblLook", "obj":NoVBand,"attrEx":"w:noVBand","nodeType":"","attrName":""),("name":"w:tblLook", "obj":NoHBand,"attrEx":"w:noHBand","nodeType":"","attrName":"") - ,("name":"w:tblLook", "obj":LastRow,"attrEx":"w:lastRow","nodeType":"","attrName":""),("name":"w:tblLook", "obj":LastColumn,"attrEx":"w:lastColumn","nodeType":"","attrName":"") - ,("name":"w:tblLook", "obj":FirstRow,"attrEx":"w:firstRow","nodeType":"","attrName":""),("name":"w:tblLook", "obj":FirstColumn,"attrEx":"w:firstColumn","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Alignment","name":"w:jc","obj":Alignment,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Borders","name":Borders.NodeName,"obj":Borders,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwTblBorders") + ,("field":"Shading","name":Shading.NodeName,"obj":Shading,"attrEx":"","nodeType":"","attrName":"", "desc":"表头底纹", "class":"TwShading") + ,("field":"CellMar","name":CellMar.NodeName,"obj":CellMar,"attrEx":"","nodeType":"","attrName":"", "desc":"单元格边距设置", "class":"TTblCellMar") + ,("field":"CellSpacing","name":"w:tblCellSpacing","obj":CellSpacing,"attrEx":"w:w","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"CellSpacingType","name":"w:tblCellSpacing","obj":CellSpacingType,"attrEx":"w:type","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":"Autofit","name":"w:tblLayout","obj":Autofit,"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":"") + ,("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":"") ) union ExtNodes; End; //Attributes //Nodes - Style; - W; - Type; + Alignment; + Borders; + Shading; + CellMar; + CellSpacing; + CellSpacingType; + Indent; + IndentType; + Autofit; Val; NoVBand; NoHBand; @@ -4340,37 +6232,317 @@ type TwTblPr=class(NodeInfo) LastColumn; FirstRow; FirstColumn; + Width; + WidthType; +End; + +/////////////////////////////////////////////////////////////// +/// TwTr +/////////////////////////////////////////////////////////////// +type TwTr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + tblPrEx := new TTblPrEx(self, 'w:tblPrEx'); + TrPr := new TwTrPr(self, 'w:trPr'); + Tc := array(); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"tblPrEx","name":tblPrEx.NodeName,"obj":tblPrEx,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TTblPrEx") + ,("field":"TrPr","name":TrPr.NodeName,"obj":TrPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwTrPr") + ,("field":"Tc","name":"w:tc","obj":Tc,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"", "class":"TwTc") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + tblPrEx; + TrPr; + Tc; +End; + +/////////////////////////////////////////////////////////////// +/// TwBorder +/////////////////////////////////////////////////////////////// +type TwBorder=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:top'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Val", "w:val", Val, "Specifies the style of border used on this object."),("Color", "w:color", Color, "Specifies the color for this border."),("ThemeColor", "w:themeColor", ThemeColor, "Specifies a theme color to be applied to the current border."),("ThemeTint", "w:themeTint", ThemeTint, "Specifies the tint value applied to the supplied theme color (if any) for this border instance."),("Size", "w:sz", Size, "Specifies the width of the current border."),("Frame", "w:frame", Frame, "Specifies whether the specified border should be modified to create a frame effect by reversing the border's appearance from the edge nearest the text to the edge furthest from the text."),("Shadow", "w:shadow", Shadow, "Specifies whether this border should be modified to create the appearance of a shadow."),("Space", "w:space", Space, "Specifies the spacing offset that shall be used to place this border on the parent object."),("ThemeShade", "w:themeShade", ThemeShade, "Specifies the shade value applied to the supplied theme color (if any) for this border instance.")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Val; + Color; + ThemeColor; + ThemeTint; + Size; + Frame; + Shadow; + Space; + ThemeShade; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TwTblBorders +/////////////////////////////////////////////////////////////// +type TwTblBorders=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tblBorders'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Top := new TwBorder(self, 'w:top'); + Left := new TwBorder(self, 'w:left'); + Bottom := new TwBorder(self, 'w:bottom'); + Right := new TwBorder(self, 'w:right'); + InsideH := new TwBorder(self, 'w:insideH'); + InsideV := new TwBorder(self, 'w:insideV'); + tr2bl := new TwBorder(self, 'w:tr2bl'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Top","name":Top.NodeName,"obj":Top,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"Left","name":Left.NodeName,"obj":Left,"attrEx":"","nodeType":"","attrName":"", "desc":"左边框属性", "class":"TwBorder") + ,("field":"Bottom","name":Bottom.NodeName,"obj":Bottom,"attrEx":"","nodeType":"","attrName":"", "desc":"底边框属性", "class":"TwBorder") + ,("field":"Right","name":Right.NodeName,"obj":Right,"attrEx":"","nodeType":"","attrName":"", "desc":"右边框属性", "class":"TwBorder") + ,("field":"InsideH","name":InsideH.NodeName,"obj":InsideH,"attrEx":"","nodeType":"","attrName":"", "desc":"水平边框属性", "class":"TwBorder") + ,("field":"InsideV","name":InsideV.NodeName,"obj":InsideV,"attrEx":"","nodeType":"","attrName":"", "desc":"垂直边框属性", "class":"TwBorder") + ,("field":"tr2bl","name":tr2bl.NodeName,"obj":tr2bl,"attrEx":"","nodeType":"","attrName":"", "desc":"行边框属性", "class":"TwBorder") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Top; + Left; + Bottom; + Right; + InsideH; + InsideV; + tr2bl; +End; + +/////////////////////////////////////////////////////////////// +/// TwTblpPr +/////////////////////////////////////////////////////////////// +type TwTblpPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tblpPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + 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; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + bottomFromText; + horizAnchor; + leftFromText; + rightFromText; + tblpX; + tblpXSpec; + tblpY; + tblpYSpec; + topFromText; + vertAnchor; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TwTblPr +/////////////////////////////////////////////////////////////// +type TwTblPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tblPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Shading := new TwShading(self, 'w:shd'); + Borders := new TwTblBorders(self, 'w:tblBorders'); + CellMar := new TTblCellMar(self, 'w:tblCellMar'); + tblpPr := new TwTblpPr(self, 'w:tblpPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + 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":"") + ,("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":"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":"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":"disable", "class":"TwTblpPr") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + StyleID; + Width; + WidthType; + Val; + NoVBand; + NoHBand; + LastRow; + LastColumn; + FirstRow; + FirstColumn; + Shading; + bidiVisual; + Alignment; + Indent; + IndentType; + Borders; + Autofit; + CellMar; + Overlap; + tblpPr; End; /////////////////////////////////////////////////////////////// /// TwGridCol /////////////////////////////////////////////////////////////// -type TwGridCol=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:gridCol'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TwGridCol=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:gridCol'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('w:w':W) union ExtAttr; + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("W", "w:w", W, "")) union ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -4383,34 +6555,35 @@ End; /////////////////////////////////////////////////////////////// /// TwTblGrid /////////////////////////////////////////////////////////////// -type TwTblGrid=class(NodeInfo) - Function Create(); overload; - Begin - Create('w:tblGrid'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TwTblGrid=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tblGrid'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin GridCol := array(); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":"w:gridCol", "obj":GridCol,"attrEx":"","nodeType":"","attrName":"","arrObj":"array")) union ExtNodes; + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"GridCol","name":"w:gridCol","obj":GridCol,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"", "class":"TwGridCol") + ) union ExtNodes; End; //Attributes @@ -4420,85 +6593,80 @@ type TwTblGrid=class(NodeInfo) End; /////////////////////////////////////////////////////////////// -/// TTable +/// TTableImpl /////////////////////////////////////////////////////////////// -type TTable=class(NodeInfo, DocumentTable) - Function Create(); overload; - Begin - Create('w:tbl'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - TblPr := new TwTblPr('w:tblPr'); - TblGrid := new TwTblGrid('w:tblGrid'); +type TTableImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tbl'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + TblPr := new TwTblPr(self, 'w:tblPr'); + TblGrid := new TwTblGrid(self, 'w:tblGrid'); TR := array(); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":TblPr.NodeName, "obj":TblPr,"attrEx":"","nodeType":"","attrName":""),("name":TblGrid.NodeName, "obj":TblGrid,"attrEx":"","nodeType":"","attrName":"") - ,("name":"w:node", "obj":Node,"attrEx":"","nodeType":"","attrName":""),("name":"w:tr", "obj":TR,"attrEx":"","nodeType":"","attrName":"","arrObj":"array") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"TblPr","name":TblPr.NodeName,"obj":TblPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwTblPr") + ,("field":"TblGrid","name":TblGrid.NodeName,"obj":TblGrid,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwTblGrid") + ,("field":"TR","name":"w:tr","obj":TR,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"", "class":"TwTr") ) union ExtNodes; End; - Function Style(styleId); - Begin - TblPr.Style := styleId; - End; - //Attributes //Nodes TblPr; TblGrid; - Node; TR; End; /////////////////////////////////////////////////////////////// /// TCoreProperties /////////////////////////////////////////////////////////////// -type TCoreProperties=class(NodeInfo, CoreProperties) - Function Create(); overload; - Begin - Create('w:p'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin +type TCoreProperties=class(NodeInfo, CoreProperties) + Function Create(); overload; + Begin + Create(nil, 'w:p'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); + Function GetChildren(); override; + Begin + HandleChildren(); return ExtNodes; End; @@ -4508,37 +6676,38 @@ type TCoreProperties=class(NodeInfo, CoreProperties) End; /////////////////////////////////////////////////////////////// -/// TPicture +/// TPictureImpl /////////////////////////////////////////////////////////////// -type TPicture=class(NodeInfo, DocumentPicture) - Function Create(); overload; - Begin - Create('w:p'); - End; - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End; - - Function Init(); - Begin - pPr := new TwpPr('w:pPr'); - Run := new TRun('w:r'); +type TPictureImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:p'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + pPr := new TwpPr(self, 'w:pPr'); + Run := new TRunImpl(self, 'w:r'); //TODO... End; - Function GetAttrs(); override; - Begin - HandleAttrs(); + Function GetAttrs(); override; + Begin + HandleAttrs(); return ExtAttr; End; - Function GetChildren(); override; - Begin - HandleChildren(); - return array(("name":pPr.NodeName, "obj":pPr,"attrEx":"","nodeType":"","attrName":""),("name":Run.NodeName, "obj":Run,"attrEx":"","nodeType":"","attrName":"") + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"pPr","name":pPr.NodeName,"obj":pPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwpPr") + ,("field":"Run","name":Run.NodeName,"obj":Run,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TRunImpl") ) union ExtNodes; End; @@ -4549,149 +6718,4972 @@ type TPicture=class(NodeInfo, DocumentPicture) Run; End; -/////////////////////////////////////////////////////////////////////////////////////////// -///XLSX文档实现 - -Type TGradient = class(NodeInfo) - - Function Create(); overload; - Begin - Create('gradientFill'); - End - - Function Create(name); overload; - Begin - Class(NodeInfo).Create(name); - Init(); - End - - Function Init(); - Begin - End - - Function HandleAttrs(); override; - Begin - case Shading of - 0: degree := 90; - 1: degree := 270; - 2: degree := 90; - 3: degree := nil; - 4: degree := 180; - 5: degree := nil; - 6: degree := 45; - 7: degree := 225; - 8: degree := 45; - 9: degree := 135; - 10: degree := 315; - 11: degree := 135; - 12: - begin - degree := nil; - type := "path"; - end - 13: - begin - degree := nil; - type := "path"; - left := 1; - right := 1; - end - 14: - begin - degree := nil; - type := "path"; - top := 1; - bottom := 1; - end - 15: - begin - degree := nil; - type := "path"; - left := 1; - right := 1; - top := 1; - bottom := 1; - end - 16: - begin - degree := nil; - type := "path"; - left := 0.5; - right := 0.5; - top := "0.5"; - bottom := 0.5; - end - end - End - - Function HandleChildren(); override; - Begin - setColor(); - End - - Function GetAttrs(); override; - Begin - HandleAttrs(); - return array('degree': degree, 'type': type, 'left': left, 'right': right, - 'top': top, 'bottom': bottom) union ExtAttr; - End - - Function GetChildren(); override; - Begin - HandleChildren(); - arr := array(); - if ifObj(topPosition) then arr union= array(('name': topPosition.NodeName, 'obj': topPosition, 'attrEx': '', 'nodeType': '', 'attrName': '', )); - if ifObj(middlePosition) then arr union= array(('name': middlePosition.NodeName, 'obj': middlePosition, 'attrEx': '', 'nodeType': '', 'attrName': '', )); - if ifObj(bottomPosition) then arr union= array(('name': bottomPosition.NodeName, 'obj': bottomPosition, 'attrEx': '', 'nodeType': '', 'attrName': '', )); - return arr union ExtNodes; - End - -private - - Function setColor(); - Begin - if ifnil(Shading) then return; - topPosition := new TStop('stop'); - topPosition.Position := 0; - bottomPosition := new TStop('stop'); - bottomPosition.Position := 1; - - if not ifnil(Color1) then topPosition.Color := Color1; - else topPosition.ThemeColor := ThemeColor1 ? : "0"; - - if ifObj(middlePosition) then - begin - middlePosition.Position := 0.5; - if not ifnil(Color2) then middlePosition.Color := Color2; - else middlePosition.ThemeColor := ThemeColor2 ? : "0"; - if not ifnil(Color1) then bottomPosition.Color := Color1; - else bottomPosition.ThemeColor := ThemeColor1 ? : "0"; - end - else begin - if not ifnil(Color2) then bottomPosition.Color := Color2; - else bottomPosition.ThemeColor := ThemeColor2 ? : "0"; - end - End - -public - Shading; - Color1; - Color2; - ThemeColor1; - ThemeColor2; - -private - // Attributes - type; - degree; - left; - right; - top; - bottom; - - // Nodes - topPosition; - bottomPosition; - middlePosition; - -End +/////////////////////////////////////////////////////////////// +/// TpBdr +/////////////////////////////////////////////////////////////// +type TpBdr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:pBdr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + top := new TwBorder(self, 'w:top'); + left := new TwBorder(self, 'w:left'); + bottom := new TwBorder(self, 'w:bottom'); + right := new TwBorder(self, 'w:right'); + bar := new TwBorder(self, 'w:bar'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"top","name":top.NodeName,"obj":top,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"left","name":left.NodeName,"obj":left,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"bottom","name":bottom.NodeName,"obj":bottom,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"right","name":right.NodeName,"obj":right,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ,("field":"bar","name":bar.NodeName,"obj":bar,"attrEx":"","nodeType":"","attrName":"", "desc":"边框属性", "class":"TwBorder") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + top; + left; + bottom; + right; + bar; +End; + +/////////////////////////////////////////////////////////////// +/// TLatentStyle +/////////////////////////////////////////////////////////////// +type TLatentStyle=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:lsdException'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Name", "w:name", Name, ""),("Count", "w:count", Count, ""),("defLockedState", "w:defLockedState", defLockedState, ""),("defQFormat", "w:defQFormat", defQFormat, ""),("defSemiHidden", "w:defSemiHidden", defSemiHidden, ""),("defUIPriority", "w:defUIPriority", defUIPriority, ""),("defUnhideWhenUsed", "w:defUnhideWhenUsed", defUnhideWhenUsed, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Name; + Count; + defLockedState; + defQFormat; + defSemiHidden; + defUIPriority; + defUnhideWhenUsed; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TtblStylePr +/////////////////////////////////////////////////////////////// +type TtblStylePr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tblStylePr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + pPr := new TwpPr(self, 'w:pPr'); + rPr := new TwrPr(self, 'w:rPr'); + TrPr := new TwTrPr(self, 'w:trPr'); + TblPr := new TwTblPr(self, 'w:tblPr'); + TcPr := new TwTcPr(self, 'w:tcPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + 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":"TcPr","name":TcPr.NodeName,"obj":TcPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwTcPr") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + pPr; + rPr; + TrPr; + TblPr; + TcPr; +End; + +/////////////////////////////////////////////////////////////// +/// TDocxStyleImpl +/////////////////////////////////////////////////////////////// +type TDocxStyleImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:style'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + TblStyle := new TtblStylePr(self, 'w:tblStylePr'); + pPr := new TwpPr(self, 'w:pPr'); + rPr := new TwrPr(self, 'w:rPr'); + TrPr := new TwTrPr(self, 'w:trPr'); + TblPr := new TwTblPr(self, 'w:tblPr'); + TcPr := new TwTcPr(self, 'w:tcPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("StyleID", "w:styleId", StyleID, ""),("Default", "w:default", Default, ""),("wType", "w:type", wType, ""),("CustomStyle ", "w:customStyle ", CustomStyle , "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Name","name":"w:name","obj":Name,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Aliases","name":"w:aliases","obj":Aliases,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"AutoRedefine","name":"w:autoRedefine","obj":AutoRedefine,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"BasedOn","name":"w:basedOn","obj":BasedOn,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Hidden","name":"w:hidden","obj":Hidden,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Link","name":"w:link","obj":Link,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Locked","name":"w:locked","obj":Locked,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Next","name":"w:b","obj":Next,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"Personal","name":"w:personal","obj":Personal,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"PersonalCompose","name":"w:personalCompose","obj":PersonalCompose,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"PersonalReply","name":"w:personalReply","obj":PersonalReply,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"QFormat","name":"w:qFormat","obj":QFormat,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"TblStyle","name":TblStyle.NodeName,"obj":TblStyle,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TtblStylePr") + ,("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":"TcPr","name":TcPr.NodeName,"obj":TcPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwTcPr") + ,("field":"Rsid","name":"w:rsid","obj":Rsid,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"SemiHidden","name":"w:semiHidden","obj":SemiHidden,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ,("field":"UiPriority","name":"w:uiPriority","obj":UiPriority,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"UnhideWhenUsed","name":"w:unhideWhenUsed","obj":UnhideWhenUsed,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + StyleID; + Default; + wType; + CustomStyle ; + + //Nodes + Name; + Aliases; + AutoRedefine; + BasedOn; + Hidden; + Link; + Locked; + Next; + Personal; + PersonalCompose; + PersonalReply; + QFormat; + TblStyle; + pPr; + rPr; + TrPr; + TblPr; + TcPr; + Rsid; + SemiHidden; + UiPriority; + UnhideWhenUsed; +End; + +/////////////////////////////////////////////////////////////// +/// TDocPartObj +/////////////////////////////////////////////////////////////// +type TDocPartObj=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:docPartObj'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"docPartGallery","name":"w:docPartGallery","obj":docPartGallery,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"docPartUnique","name":"w:docPartUnique","obj":docPartUnique,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + docPartGallery; + docPartUnique; +End; + +/////////////////////////////////////////////////////////////// +/// TStdPr +/////////////////////////////////////////////////////////////// +type TStdPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:sdtPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + rPr := new TwrPr(self, 'w:rPr'); + docPartObj := new TDocPartObj(self, 'w:docPartObj'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"rPr","name":rPr.NodeName,"obj":rPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwrPr") + ,("field":"ID","name":"w:id","obj":ID,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"Color","name":"w15:color","obj":Color,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"docPartObj","name":docPartObj.NodeName,"obj":docPartObj,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TDocPartObj") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + rPr; + ID; + Color; + docPartObj; +End; + +/////////////////////////////////////////////////////////////// +/// TStdEndPr +/////////////////////////////////////////////////////////////// +type TStdEndPr=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:sdtEndPr'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + rPr := new TwrPr(self, 'w:rPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"rPr","name":rPr.NodeName,"obj":rPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TwrPr") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + rPr; +End; + +/////////////////////////////////////////////////////////////// +/// TSdtContent +/////////////////////////////////////////////////////////////// +type TSdtContent=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:sdtContent'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TTableContentImpl +/////////////////////////////////////////////////////////////// +type TTableContentImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:sdt'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + stdPr := new TStdPr(self, 'w:sdtPr'); + stdEndPr := new TStdEndPr(self, 'w:sdtEndPr'); + SdtContent := new TSdtContent(self, 'w:sdtContent'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"stdPr","name":stdPr.NodeName,"obj":stdPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStdPr") + ,("field":"stdEndPr","name":stdEndPr.NodeName,"obj":stdEndPr,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TStdEndPr") + ,("field":"SdtContent","name":SdtContent.NodeName,"obj":SdtContent,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TSdtContent") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + stdPr; + stdEndPr; + SdtContent; +End; + +/////////////////////////////////////////////////////////////// +/// TTabStopsImpl +/////////////////////////////////////////////////////////////// +type TTabStopsImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tabs'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Tabs := array(); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"Tabs","name":"w:tab","obj":Tabs,"attrEx":"","nodeType":"","attrName":"","arrObj":"array", "desc":"", "class":"TTabStop") + ) union ExtNodes; + End; + + //Attributes + + //Nodes + Tabs; +End; + +/////////////////////////////////////////////////////////////// +/// TTabStop +/////////////////////////////////////////////////////////////// +type TTabStop=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:tab'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Val", "w:val", Val, "Specifies the type of custom tab stop, which determines the behavior of the tab stop and the alignment which shall be applied to text entered at the current custom tab stop."),("leader", "w:leader", leader, "Specifies the character which shall be used to fill in the space created by a tab which ends at this custom tab stop. This character shall be repeated as required to completely fill the tab spacing generated by the tab character."),("Position", "w:pos", Position, "Specifies the position of the current custom tab stop with respect to the current page margins. ")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Val; + leader; + Position; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TNumber +/////////////////////////////////////////////////////////////// +type TNumber=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:num'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("numId", "w:numId", numId, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"abstractNumId","name":"w:abstractNumId","obj":abstractNumId,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + numId; + + //Nodes + abstractNumId; +End; + +/////////////////////////////////////////////////////////////// +/// TLevel +/////////////////////////////////////////////////////////////// +type TLevel=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:lvl'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + pPr := new TwpPr(self, 'w:pPr'); + rPr := new TwrPr(self, 'w:rPr'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("ilvl", "w:ilvl", ilvl, ""),("tentative", "w:tentative", tentative, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"start","name":"w:start","obj":start,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"numFmt","name":"w:numFmt","obj":numFmt,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"lvlText","name":"w:lvlText","obj":lvlText,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"lvlJc","name":"w:lvlJc","obj":lvlJc,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("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") + ) union ExtNodes; + End; + + //Attributes + ilvl; + tentative; + + //Nodes + start; + numFmt; + lvlText; + lvlJc; + pPr; + rPr; +End; + +/////////////////////////////////////////////////////////////// +/// TNumStyleImpl +/////////////////////////////////////////////////////////////// +type TNumStyleImpl=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'w:abstractNum'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + lvl := new TLevel(self, 'w:lvl'); + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("abstractNumId", "w:abstractNumId", abstractNumId, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"nsid","name":"w:nsid","obj":nsid,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"multiLevelType","name":"w:multiLevelType","obj":multiLevelType,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"tmpl","name":"w:tmpl","obj":tmpl,"attrEx":"w:val","nodeType":"","attrName":"", "desc":"", "class":"") + ,("field":"lvl","name":lvl.NodeName,"obj":lvl,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"TLevel") + ) union ExtNodes; + End; + + //Attributes + abstractNumId; + + //Nodes + nsid; + multiLevelType; + tmpl; + lvl; +End; + +/////////////////////////////////////////////////////////////// +/// TExcelTable +/////////////////////////////////////////////////////////////// +type TExcelTable=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'table'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Xmlns", "xmlns", Xmlns, ""),("Mc", "xmlns:mc", Mc, ""),("Ignorable", "mc:Ignorable", Ignorable, ""),("Xr", "xmlns:xr", Xr, ""),("Xr3", "xmlns:xr3", Xr3, ""),("Id", "id", Id, ""),("Name", "name", Name, ""),("DisplayName", "displayName", DisplayName, ""),("Ref", "ref", Ref, ""),("HeaderRowCount", "HeaderRowCount", HeaderRowCount, ""),("TotalsRowShown", "totalsRowShown", TotalsRowShown, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return array(("field":"AutoFilter","name":"autoFilter","obj":AutoFilter,"attrEx":"ref","nodeType":"","attrName":"", "desc":"", "class":"") + ) union ExtNodes; + End; + + //Attributes + Xmlns; + Mc; + Ignorable; + Xr; + Xr3; + Id; + Name; + DisplayName; + Ref; + HeaderRowCount; + TotalsRowShown; + + //Nodes + AutoFilter; +End; + +/////////////////////////////////////////////////////////////// +/// TTableStyle +/////////////////////////////////////////////////////////////// +type TTableStyle=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'tableStyleInfo'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("TableName", "tableName", TableName, ""),("TableStyle", "name", TableStyle, ""),("ShowFirstColumn", "showFirstColumn", ShowFirstColumn, ""),("ShowLastColumn", "showLastColumn", ShowLastColumn, ""),("ShowRowStripes", "showRowStripes", ShowRowStripes, ""),("ShowColumnStripes", "showColumnStripes", ShowColumnStripes, ""),("HeaderRowCount", "HeaderRowCount", HeaderRowCount, ""),("TotalsRowShown", "totalsRowShown", TotalsRowShown, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + TableName; + TableStyle; + ShowFirstColumn; + ShowLastColumn; + ShowRowStripes; + ShowColumnStripes; + HeaderRowCount; + TotalsRowShown; + + //Nodes +End; + +/////////////////////////////////////////////////////////////// +/// TBreak +/////////////////////////////////////////////////////////////// +type TBreak=class(NodeInfo) + Function Create(); overload; + Begin + Create(nil, 'brk'); + End; + + Function Create(p, name); overload; + Begin + Class(NodeInfo).Create(p, name); + Init(); + End; + + Function Init(); + Begin + Max := 16383; + Man := 1; + //TODO... + End; + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array(("Id", "id", Id, ""),("Max", "max", Max, ""),("Man", "man", Man, "")) union ExtAttr; + End; + + Function GetChildren(); override; + Begin + HandleChildren(); + return ExtNodes; + End; + + //Attributes + Id; + Max; + Man; + + //Nodes +End; + +/////////////////////////////////////////////////////////////////////////////////////////// +///DOCX文档实现 + +Type TRange = Class + Function Create(t); + Begin + //array(("pNode":nodeObj, "pIndex":p, "rNode":nodeObj, "rIndex":r)) + RunArr_ := t; + rPr_ := new TwrPr(); + End; + + ///清除全部选中内容 + Function Clear(); + Begin + _clear(0);//清除全部w:r + End; + + Property Font read readFont; + Function readFont(); + Begin + return rPr_; + End; + + Property Text read readText write writeText; + Function readText(); + Begin + return _text(RunArr_); + End; + + Function writeText(txt); + Begin + r := RunArr_[0:0,:]; + _clear(1);//只保留第1段 + run := new TRun(r[0]['rNode']); + run.SetText(txt); + return r; + End; + + ///应用字体样式 + Function Apply(); + Begin + arr := rPr_.Marshal(); + if length(arr['attributes']) or length(arr['children']) then Begin + for i:=0 to length(RunArr_)-1 do Begin + rPr := class(xlsxXml).GetNode(RunArr_[i]['rNode'], 'w:rPr', 'first'); + class(xlsxXml).UpdateNode(rPr, arr['attributes'], arr['children']); + End; + End; + End; + + Function _clear(first); + Begin + for i:=first to length(RunArr_)-1 do Begin + RunArr_[i]['pNode'].DeleteChild(RunArr_[i]['rNode']); + End; + for i:=first to length(RunArr_)-1 do Begin + pNode := RunArr_[i]['pNode']; + rNode := pNode.FirstChildElement('w:r'); + if not ifObj(rNode) then + pNode.Parent().DeleteChild(pNode); + End; + End; + + rPr_;//字体格式 + RunArr_; +End; + +Type DocObject = Class + Function Create(); + Begin + pageNo_ := 0; + linePos_ := 0.; + End; + + Function Name(); + Begin + return name_; + End; + + ///修改属性,包括样式、边框、底纹、字体等 + Function Apply();virtual; + Begin + End; + + ///前一个对象 + Function Prev();virtual; + Begin + return _next_prev_Impl(node_.PrevElement(name_)); + End; + + ///下一个对象 + Function Next();virtual; + Begin + return _next_prev_Impl(node_.NextElement(name_)); + End; + + ///添加批注 + ///obj:TDocComment对象 + ///返回:成功 true + Function AddComment(obj); + Begin + id := obj.ID; + r := _split_range(obj.sPos, obj.SelectLength); + cnt := length(r); + if cnt then Begin + rNode := r[0]['rNode']; + beg := rNode.Parent().InsertBeforeChild(rNode, 'element', 'w:commentRangeStart'); + beg.SetAttribute('w:id', id); + + rNode := r[cnt-1]['rNode']; + eNode := rNode.Parent().InsertAfterChild(rNode, 'element', 'w:commentRangeEnd'); + eNode.SetAttribute('w:id', id); + + r := rNode.Parent().InsertAfterChild(eNode, 'element', 'w:r'); + cr := r.InsertFirstChild('element', 'w:commentReference'); + cr.SetAttribute('w:id', id); + return true; + End; + return false; + End; + + ///修订插入 + ///obj:TRevision对象 + ///返回:成功 true + Function AddRevision(obj); + Begin + obj.NodeName := 'w:ins'; + obj.name_ := obj.NodeName; + r := _split_range(obj.sPos, 0); + if length(r) then Begin + rNode := r[length(r)-1]['rNode']; + node := rNode.Parent().InsertAfterChild(rNode, obj.Marshal()); + End + else Begin + pPr := node_.FirstChildElement('w:pPr'); + if ifObj(pPr) then + node := node_.InsertAfterChild(pPr, obj.Marshal()); + else + node := node_.InsertFirstChild(obj.Marshal()); + rNode := node.NextElement('w:r'); + End; + if ifObj(rNode) then Begin + data := rNode.Marshal(); + node2 := node.InsertFirstChild(data[0]); + End + else Begin + node2 := node.InsertEndChild('element', 'w:r'); + End; + run := new TRun(node2); + run.SetText(obj.InsText); + obj.Init(node); + return true; + End; + + ///修订删除 + ///obj:TRevision对象 + ///返回:成功 true,失败 false + Function DelRevision(obj); + Begin + r := _split_range(obj.sPos, obj.SelectLength); + for i:=0 to length(r)-1 do Begin + rNode := r[i]['rNode']; + delNode := rNode.Parent().InsertAfterChild(rNode, obj.Marshal()); + rXml := string(rNode.Data()); + rXml := ReplaceStr(rXml, '', ''); + delNode.InsertFirstChild(rXml); + rNode.Parent().DeleteChild(rNode); + End; + return length(r); + End; + + Function _next_prev_Impl(n); + Begin + if ifObj(n) then Begin + case name_ of + 'w:p': + p := new TParagraph(p); + 'w:tbl': + p := new TTable(n); + 'w:r': + p := new TRun(n); + 'w:del','w:ins': + p := new TRevision(n); + End; + if ifObj(p) then Begin + p.name_ := name; + p.node_ := n; + End; + End; + return p; + End; + + ///文本内容 + Function Text();virtual; + Begin + r := TextArray(); + return _text(r); + End; + + ///所有文字信息(包括位置信息) + ///返回:table(包括w:r节点) + Function TextArray();virtual; + Begin + r := array(); + node := node_.FirstChildElement('w:r'); + while ifObj(node) do Begin + r[ind]['pNode'] := node_; + r[ind]['pIndex'] := -1; + r[ind]['rNode'] := node; + r[ind]['rIndex'] := ind; + ind++; + node := node.NextElement('w:r'); + End; + return r; + End; + + ///段落中插入文字 + Function AddText(sPos, txt); + Begin + if sPos < 0 then Begin //段落后追加 + lastNode := node_.LastChild('w:r'); + if ifObj(lastNode) then Begin + rNode := _duplicate_r(lastNode); + End + else Begin + rNode := node_.InsertEndChild('element','w:r'); + p := new TParagraph(node_); + p.CopyFormat(false, rNode); + End; + run := new TRun(rNode); + run.SetText(txt); + t := array(('pNode':node_, 'pIndex':-1, 'rNode':rNode, 'rIndex':-1)); + return new TRange(t); + End; + obj := new TRevision(); + obj.sPos := sPos; + obj.InsText := txt; + AddRevision(obj);//插入文字 + t := obj.Accept(); + return new TRange(t); + End; + + ///返回:TRange对象,(TBody、TParagraph、TCell)全部内容 + Function Range();overload; + Begin + t := TextArray(); + if not istable(t) then + return nil; + return new TRange(t); + End; + + ///sPos:起始位置 + ///rangeLength:内容长度 + ///返回:TRange对象,此函数非只读,执行此函数会重新调整段落中TRun结构 + Function Range(sPos, rangeLength);overload; + Begin + t := _split_range(sPos, rangeLength); + if not istable(t) then + return nil; + return new TRange(t); + End; + + ///返回文档中的位置 + Function Node(); + Begin + return node_; + End; + + Function _split_range(sPos, rangeLength); + Begin + t := array(); + if not ifInt(sPos) or not ifInt(rangeLength) or sPos < 0 then + return t; + r := TextArray(); + rSize := 0; + for i:=0 to length(r)-1 do Begin + run := new TRun(r[i]['rNode']); + txt := UTF8ToAnsi(run.Text()); + txtLen := lengthW(txt); + if rangeLength >= 0 and sPos + rangeLength <= rSize then Begin + return t; + End; + if rangeLength = 0 then Begin //w:ins情况 + if sPos >= txtLen + rSize then Begin //前 + rSize += txtLen; + t[0] := r[i]; + End + else Begin //一分为二,取头部 + if sPos = rSize then + return t;//正好文档开头 + t[0] := r[i]; + r2 := _duplicate_r(r[i]['rNode']); + _adjust_r(r[i]['rNode'], 0, sPos - rSize); + _adjust_r(r2, sPos - rSize, txtLen); + return t; + End; + End + else Begin //w:del情况 + if rangeLength < 0 or (sPos <= rSize and sPos + rangeLength >= rSize + txtLen) then Begin //包含全部w:r + t[ length(t) ] := r[i]; + rSize += txtLen; + End + else if sPos >= txtLen + rSize then Begin //前 + rSize += txtLen; + End + else if sPos >= rSize and sPos < rSize + txtLen and sPos + rangeLength >= rSize + txtLen then Begin //一分为二,取尾部 + if sPos = rSize then Begin //正好整个run + t[ length(t) ] := r[i]; + End + else Begin //一分为二,取尾部 + r2 := _duplicate_r(r[i]['rNode']); + _adjust_r(r[i]['rNode'], 0, sPos - rSize); + _adjust_r(r2, sPos - rSize, txtLen); + tmp := r[i]; + tmp['rNode'] := r2; + tmp['rIndex'] := r[i]['rIndex'] + 1; + t[ length(t) ] := tmp; + End; + rSize += txtLen; + End + else if sPos + rangeLength <= rSize + txtLen then Begin + if sPos + rangeLength = rSize + txtLen then Begin //正好整个run + t[ length(t) ] := r[i]; + End + else if sPos <= rSize then Begin //一分为二,取头部 + t[ length(t) ] := r[i]; + r2 := _duplicate_r(r[i]['rNode']); + _adjust_r(r[i]['rNode'], 0, rangeLength - (rSize - sPos)); + _adjust_r(r2, rangeLength - (rSize - sPos), txtLen); + End + else Begin //一分为三,取中间 + r2 := _duplicate_r(r[i]['rNode']); + r3 := _duplicate_r(r2); + _adjust_r(r[i]['rNode'], 0, sPos - rSize); + _adjust_r(r2, sPos - rSize, rangeLength); + _adjust_r(r3, sPos - rSize + rangeLength, txtLen); + tmp := r[i]; + tmp['rNode'] := r2; + tmp['rIndex'] := r[i]['rIndex'] + 1; + t[0] := tmp; + End; + rSize += txtLen; + return t; + End + End; + End; + return t; + End; + + //复制w:r节点 + Function _duplicate_r(node); + Begin + data := node.Marshal(); + return node.Parent().InsertAfterChild(node, data[0]); + End; + + //调整w:r节点 + Function _adjust_r(node, sPos, rangeLength); + Begin + rSize := 0; + ePos := sPos + rangeLength; + delT := array(); + tNode := node.FirstChildElement('w:t'); + while ifObj(tNode) do Begin + txt := UTF8ToAnsi(tNode.GetText()); + txtLen := lengthW(txt); + if sPos >= rSize + txtLen then Begin //删除头部文字 + delT[cnt++] := tNode; + rSize += txtLen; + End + else if sPos >= rSize and sPos < rSize + txtLen and ePos <= rSize + txtLen then Begin //只取中间文字 + if sPos <> rSize or ePos <> rSize + txtLen then Begin //文字内容有变化 + mCnt := ePos - sPos; + if sPos = rSize then + nStr := leftstr(txt, mCnt); + else if ePos = rSize + txtLen then + nStr := rightstr(txt, mCnt); + else + nStr := midstr(txt, sPos - rSize + 1, mCnt); + tNode.SetValue(AnsiToUTF8(nStr)); + End; + rSize += txtLen; + End + else if sPos >= rSize and sPos < rSize + txtLen and ePos > rSize + txtLen then Begin //只取尾巴文字 + if sPos <> rSize then Begin //文字内容有变化 + mCnt := txtLen - (sPos - rSize); + nStr := rightstr(txt, mCnt); + tNode.SetValue(AnsiToUTF8(nStr)); + End; + End + else if sPos < rSize and ePos >= rSize + txtLen then Begin //取值范围 + rSize += txtLen; + End + else Begin //删除尾部文字 + delT[cnt++] := tNode; + End + rSize += txtLen; + tNode := tNode.NextElement('w:t'); + End; + + for i:=0 to length(delT)-1 do + node.DeleteChild(delT[i]); + End; + + node_; + name_:string; + pageNo_; //页码 + linePos_; //行位置 +End; + +Type TRevision = Class(DocObject, TRevisionImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + Init(node); + End; + + Function Init(node); + Begin + node_ := node; + name_ := 'w:del'; + if ifObj(node_) then Begin + name_ := node_.GetName(); + paragraph_ := new TParagraph(node_); + End; + Date := class(xlsxXml).GetDatetimeStr(now()); + Class(TRevisionImpl).Create(nil, name_); + End; + + ///修订类型 + ///返回:string, 删除:'del'、添加:'ins' + Function Act(); + Begin + return name_ = 'w:del' ? 'del' : 'ins'; + End; + + ///文字内容 + Function Text();override; + Begin + return paragraph_.Text(); + End; + + ///接受修订 + Function Accept(); + Begin + if name_ = 'w:del' then Begin + node_.Parent().DeleteChild(node_); + return nil; + End; + r := array(); + //w:ins + runs := paragraph_.GetRuns(); + node := node_; + for i:=0 to length(runs)-1 do Begin + rData := runs[i].node_.Marshal(); + node := node.Parent().InsertAfterChild(node, rData[0]);//接受修订,复制... + r[length(r)] := array('pNode':node.Parent(), 'pIndex':-1, 'rNode':node, 'rInde':-1); + End; + node_.Parent().DeleteChild(node_); + return r; + End; + + ///拒绝修订 + Function Reject(); + Begin + if name_ = 'w:ins' then Begin + node_.Parent().DeleteChild(node_); + return; + End; + //w:del + runs := paragraph_.GetRuns(); + node := node_; + for i:=0 to length(runs)-1 do Begin + rXml := string(runs[i].node_.Data()); + rXml := ReplaceStr(rXml, '', ''); + node := node.Parent().InsertAfterChild(node, rXml);//接受修订,复制... + End; + node_.Parent().DeleteChild(node_); + End; + + paragraph_; + CommentID:integer; + sPos:integer; + SelectLength:integer; + InsText:string; +End; + +Type TDocComment = Class(TDocCommentImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + node_ := node; + name_ := 'w:comment'; + Date := class(xlsxXml).GetDatetimeStr(now()); + Class(TDocCommentImpl).Create(nil, name_); + End; + + ///批注文字内容 + Function Text(); + Begin + txt := ''; + rCnt := 0; + for i:= 0 to length(commentsArray_)-1 do Begin + if commentsArray_[i]['Name'] := 'w:r' then Begin + if rCnt and commentsArray_[i]['pIndex'] <> commentsArray_[i-1]['pIndex'] then + txt += '\n'; + run := new TRun(commentsArray_[i]['rNode']); + txt += run.Text(); + rCnt ++; + End; + End; + return txt; + End; + + ///删除批注 + Function Delete(); + Begin + commentsArray_[0]['pNode'].DeleteChild( commentsArray_[0]['rNode'] ); + cnt := length(commentsArray_) - 1; + r := commentsArray_[cnt]['rNode'].Next('w:r'); + if ifObj(r) then Begin + commentReference := r.FirstChildElement('w:commentReference'); + if ifObj(commentReference) then Begin + r.DeleteChild( commentReference ); + End; + End; + commentsArray_[cnt]['pNode'].DeleteChild( commentsArray_[cnt]['rNode'] ); + if not ifObj(r.FirstChildElement()) then Begin + r.Parent().DeleteChild( r ); + End; + End; + + CommentID:integer; + sPos:integer; + SelectLength:integer; + commentsArray_; +End; + +Type TDocComments = Class + Function Create(t); + Begin + commentsArray_ := t; + hash_ := sselect distinct ['ID'] from commentsArray_ where ['ID'] >= 0 end; + End; + + ///文档中全部的批注信息个数 + Function Count(); + Begin + return length(hash_); + End; + + ///文档中指定批注信息 + ///index:第index个批注信息 + ///返回:TDocComment对象 + Function Comment(index);overload; + Begin + if index < 0 or index >= length(hash_) then + return nil; + id := hash_[index]; + r := select thisrowindex as 'Index' from commentsArray_ where ['ID'] = id end; + if not istable(r) or length(r) <> 2 then + return nil; + t := select * from commentsArray_ where thisrowindex <= r[1]['Index'] and thisrowindex >= r[0]['Index'] end; + o := new TDocComment(); + o.commentsArray_ := t; + o.CommentID := t[0]['ID']; + return o; + End; + + hash_; + commentsArray_; +End; + +//w:pPr +// 'w:pStyle', 'w:keepNext', 'w:keepLines', 'w:pageBreakBefore', +// 'w:framePr', 'w:widowControl', 'w:numPr', 'w:suppressLineNumbers', +// 'w:pBdr', 'w:shd', 'w:tabs', 'w:suppressAutoHyphens', 'w:kinsoku', +// 'w:wordWrap', 'w:overflowPunct', 'w:topLinePunct', 'w:autoSpaceDE', +// 'w:autoSpaceDN', 'w:bidi', 'w:adjustRightInd', 'w:snapToGrid', +// 'w:spacing', 'w:ind', 'w:contextualSpacing', 'w:mirrorIndents', +// 'w:suppressOverlap', 'w:jc', 'w:textDirection', 'w:textAlignment', +// 'w:textboxTightWrap', 'w:outlineLvl', 'w:divId', 'w:cnfStyle', +// 'w:rPr', 'w:sectPr', 'w:pPrChange' + +//w:p +Type TParagraph = Class(DocObject, TParagraphImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + node_ := node; + name_ := 'w:p'; + Class(TParagraphImpl).Create(nil, 'w:p'); + End; + + Function Root(); override; + Begin + return node_; + End; + + Property Format read readFormat; + Function readFormat(); + Begin + return pPr; + End; + + Property Font read readFont; + Function readFont(); + Begin + return pPr.rPr; + End; + + ///修改段落 + Function Apply(); override; + Begin + arr := Marshal(); + class(xlsxXml).UpdateNode(node_, arr['attributes'], arr['children']); + CopyFormat(false, nil); + End; + + ///修改段落内容 + ///返回:TRun对象 + Function SetText(str); + Begin + t := GetRuns(); + for i:=1 to length(t)-1 do Begin + node_.DeleteChild(t[i].node_); + End; + if length(t) then + rNode := t[0].node_; + else + rNode := node_.InsertEndChild('element', 'w:r'); + run := new TRun(rNode); + run.SetText(str); + return rNode; + End; + + ///制表位TTabStops对象 + ///返回:TTabStops对象 + // + // + // + // + Function TabStops(); + Begin + node := node_.FirstChildElement('w:tabs'); + if not ifObj(node) then + return nil; + return new TTabStops(node); + End; + + Function setParagraphText(rNode, tNode, txt); + Begin + if not ifObj(tNode) then Begin + tNode := rNode.FirstChildElement('w:t'); + if not ifObj(tNode) then + tNode := rNode.InsertFirstChild('element', 'w:t', txt); + End + else + tNode.SetValue(txt); + End; + + ///所有TRun对象列表 + ///返回:TRun对象列表 + Function GetRuns(); + Begin + t := array();//TRun Array + node := node_.FirstChildElement('w:r'); + while ifObj(node) do Begin + n := node; + name := node.GetName(); + node := node.NextElement('w:r'); + if name = 'w:r' then Begin + run := new TRun(n); + End + else if name = 'w:ins' then Begin + r := n.FirstChildElement('w:r'); + if not ifObj(r) then continue; + run := new TRun(r); + End + else + continue; + t[ length(t) ] := run; + End; + return t; + End; + + ///TRun对象 + ///返回:TRun对象 + Function GetRun(i); + Begin + runs := GetRuns(); + if i < 0 or i >= length(runs) then + return nil; + return runs[i]; + End; + + ///段落中添加内容 + ///返回:TRun对象 + Function AddRun(txt, newLine); + Begin + o := new TRun(); + o.Parent := self; + NewChildNode( array("field":"", "name":"w:r", "obj":o, "attrEx":"", "nodeType":"") ); + if ifString(txt) then + o.T := txt; + if newLine then + o.Br.Type := ''; + return o; + End; + + ///段落中全部的修改标记(修订删除、修订插入) + ///返回:TRevision对象列表,array(TRevision...); + Function Revisions();overload; + Begin + return getDocumentObjects(node_, array('w:del', 'w:ins')); + End; + + ///段落指定修改标记(修订删除、修订插入) + ///index:第index个修改标记 + ///返回:TRevision对象 + Function Revisions(index);overload; + Begin + return getDocumentObject(node_, array('w:del', 'w:ins'), index); + End; + + ///段落中所有文本框 + ///返回:TTextBox对象数组 + Function TextBoxs();overload; + Begin + r := array(); + runs := GetRuns(); + for i:=0 to length(runs)-1 do Begin + node := class(xlsxXml).GetNode(runs[i].node_, 'mc:AlternateContent/mc:Fallback/w:pict/v:shape/v:textbox/w:txbxContent'); + if ifObj(node) then Begin + nodeEx := class(xlsxXml).GetNode(runs[i].node_, 'mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:txbx/wps:txbxContent'); + box := new TTextBox(node); + box.Init(node_, nodeEx); + r[length(r)] := box; + End; + End; + return r; + End; + + ///段落中指定文本框 + ///index:第index个文本框 + ///返回:TTextBox对象 + Function TextBoxs(index);overload; + Begin + r := TextBoxs(); + if index >= 0 and index < length(r) then + return r[index]; + return nil; + End; + + ///清除段落格式、字体格式 + Function ClearFormat(); + Begin + pPr := node_.FirstChildElement('w:pPr'); + //清除段落格式 + if ifObj(pPr) then + node_.DeleteChild(pPr); + //清除字体格式 + runs := GetRuns(); + for i:=0 to length(runs)-1 do Begin + runs[i].ClearFormat(); + End; + End; + + ///添加BookMark + ///返回:BookMark的名称,string + Function AddBookMark(bookMarkID); + Begin + pPr := node_.FirstChildElement('w:pPr'); + if ifObj(pPr) then + markStart := node_.InsertAfterChild(pPr, 'element', 'w:bookmarkStart'); + else + markStart := node_.InsertFirstChild('element', 'w:bookmarkStart'); + name := '_Toc' $ bookMarkID; + markStart.SetAttribute('w:name', name); + markStart.SetAttribute('w:id', bookMarkID); + markEnd := node_.InsertEndChild('element', 'w:bookmarkEnd'); + markEnd.SetAttribute('w:id', bookMarkID); + return name; + End; + + Function CopyFormat(del, therNode); + Begin + rPr := class(xlsxXml).GetNode(node_, 'w:pPr/w:rPr'); + r := ifObj(rPr) ? rPr.Marshal() : array(); + if ifObj(therNode) then Begin + _copyFormat(therNode, r, del); + return; + End; + + //复制到所有run + runs := GetRuns(); + for i:=0 to length(runs)-1 do + _copyFormat(runs[i].node_, r, del); + End; + + Function _copyFormat(rNode, r, del); + Begin + tNode := rNode.FirstChildElement('w:t'); + rPr2 := rNode.FirstChildElement('w:rPr'); + if del and ifObj(rPr2) then + rPr2.node_.DeleteChildren(); + else if ifObj(tNode) and not ifObj(rPr2) then + rPr2 := class(xlsxXml).GetNode(rNode, 'w:rPr', 'first'); + if istable(r) and ifObj(rPr2) then + class(xlsxXml).UpdateNode(rPr2, r[0]['attributes'], r[0]['children']); + End; +End; + +//w:tabs +Type TTabStops = Class(DocObject, TTabStopsImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + Class(TTabStopsImpl).Create(nil, 'w:tabs'); + tabArr := array(); + if ifObj(node) then Begin + parent_ := node.Parent(); + node_ := node; + n := node_.FirstChildElement('w:tab'); + while ifObj(n) do Begin + tab := new TTabStop(); + tabArr[ length(tabArr) ] := array("field":"TTabStop", "name":"w:tab", "obj":tab, "attrEx":"", "nodeType":"", "node":n); + n := n.NextElement(); + End; + Tabs := tabArr; + End; + End; + + Function Create(parentNode, name);overload; + Begin + Class(TTabStopsImpl).Create(parentNode, name); + tabArr := array(); + End; + + ///删除制表符 + ///ind:integer,索引 + Function Clear(ind); + Begin + if ind>=0 and ind < length(Tabs) then Begin + if ifObj(Tabs[i]['node']) then + node_.DeleteChild(Tabs[i]['node']); + Tabs := select * from Tabs where thisrowindex <> ind end; + End; + End; + + ///添加制表符 + ///ind:integer,索引 + ///tab:TTabStop对象 + Function Add(ind, tab); + Begin + a := array("field":"TTabStop", "name":"w:tab", "obj":tab, "attrEx":"", "nodeType":"", "node":nil); + if ind = 0 then Begin + if ifObj(node_) then + a['node'] := node_.InsertFirstChild('element', 'w:tab'); + Tabs := array(a) union Tabs; + End + else if ind < 0 or ind >= length(Tabs) then Begin + if ifObj(node_) then + a['node'] := node_.InsertEndChild('element', 'w:tab'); + Tabs union= array(a); + End + else Begin + node := Tabs[length(Tabs)-1]['node']; + if length(Tabs) and ifObj(node) then + a['node'] := node_.InsertAfterChild(node, 'element', 'w:tab'); + arr := Tabs[:ind-1,:]; + arr[ length(arr) ] := a; + b := Tabs[ind:,:]; + Tabs := arr union b; + End; + if ifObj(a['node']) then Begin + arr := tab.Marshal(); + class(xlsxXml).UpdateNode(a['node'], arr['attributes'], arr['children']); + End; + return tab; + End; + + ///获取制表符 + ///返回:TTabStop对象 + Function Get(ind); + Begin + if ind >= 0 or ind < length(Tabs) then + return Tabs[ind]['obj']; + return nil; + End; + + ///获取全部制表符列表 + ///返回:TTabStop对象列表,array(TTab...) + Function TabStops(); + Begin + return sselect ['obj'] from Tabs end; + End; + + ///刷新制表符 + Function Flush(); + Begin + if ifObj(node_) then Begin + for i:=0 to length(Tabs)-1 do Begin + arr := Tabs[i]['obj'].Marshal(); + class(xlsxXml).UpdateNode(Tabs[i]['node'], arr['attributes'], arr['children']); + End; + End; + End; +End; + +//w:r +Type TRun = Class(DocObject, TRunImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + node_ := node; + name_ := 'w:r'; + Class(TRunImpl).Create(nil, 'w:r'); + End; + + Function Create(pNode, name);overload; + Begin + Class(TRunImpl).Create(nil, 'w:r'); + End; + + Property Font read readFont; + Function readFont(); + Begin + return rPr; + End; + + ///应用格式 + Function Apply(); override; + Begin + arr := Marshal(); + class(xlsxXml).UpdateNode(node_, arr['attributes'], arr['children']); + End; + + ///添加tab + Function AddTab(); + Begin + n := node_.InsertFirstChild('element', 'w:tab'); + End; + + ///添加文字 + Function AddText(txt); + Begin + if ifObj(node_) then Begin + _insertText(txt, false); + return; + End; + lines := str2array(txt,'\n'); + for i:=0 to length(lines)-1 do Begin + //line := TrimRight(lines[i]); + if i then + NewChildNode( array("field":"", "name":"w:br", "obj":1, "attrEx":"", "nodeType":"empty") ); + NewChildNode( array("field":"", "name":"w:t", "obj":lines[i], "attrEx":"", "nodeType":"pcdata") ); + End; + End; + + ///修改文字 + Function SetText(txt); + Begin + ClearText();//删除原来文字 + _insertText(txt, false);//添加文字 + End; + + Function _insertText(txt, first); + Begin + lines := str2array(txt,'\n'); + for i:=0 to length(lines)-1 do Begin + t := TrimRight(lines[i]); + if i=0 then Begin + if first then + tNode := node_.InsertFirstChild('element', 'w:t', t); + else + tNode := node_.InsertEndChild('element', 'w:t', t); + End + else Begin + tNode := node_.InsertAfterChild(tNode, 'element', 'w:br');//换行符号 + tNode := node_.InsertAfterChild(tNode, 'element', 'w:t', t); + End; + End; + End; + + ///文字内容 + Function Text();override; + Begin + txt := ''; + tNode := node_.FirstChildElement(); + while ifObj(tNode) do Begin + name := tNode.GetName(); + if name = 'w:t' or name = 'w:delText' then + txt += tNode.GetText(); + //if name = 'w:br' then + // txt += '\n'; + tNode := tNode.NextElement(); + End; + return txt; + End; + + ///清除字体格式 + Function ClearFormat(); + Begin + rPr := node_.FirstChildElement('w:rPr'); + if ifObj(rPr) then + node_.DeleteChild(rPr); + End; + + ///清除全部文字内容 + Function ClearText(); + Begin + n := node_.FirstChildElement('w:t'); + while ifObj(n) do Begin + next := n.NextElement('w:t'); + node_.DeleteChild(n); + n := next; + End; + End; + +End; + +Type TPicture = Class(DocObject, TPictureImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + node_ := node; + name_ := 'w:p'; + Width := 0.; + Height := Width; + Class(TPictureImpl).Create(nil, 'w:p'); + End; + + Property Format read readFormat; + Function readFormat(); + Begin + return Run.Drawing.WInline.Graphic.GraphicData.Pic.spPr; + End; + + ///修改图片格式 + Function Apply(); override; + Begin + arr := Marshal(); + class(xlsxXml).UpdateNode(node_, arr['attributes'], arr['children']); + End; + + Function ScaledDimensions(image); + Begin + ETU := 360045;//1cm单位 + maxX := 17.0;//水平方向17cm + maxY := 23.0;//垂直方向23cm + if Width <= 0 and Height <= 0 then Begin //图像缺省大小 + widthVal := image.Width(); + heightVal := image.Height(); + End + else Begin //用户设置了图片尺寸 + widthVal := ETU * Width; + heightVal := ETU * Height; + if Width <= 0 and image.Height() and image.Width() then Begin //按照图片比例自动缩放 + scaling_factor := image.Width() / image.Height(); + widthVal := round(heightVal * scaling_factor); + End; + + if Height <= 0 and image.Height() and image.Width() then Begin //按照图片比例自动缩放 + scaling_factor := image.Width() / image.Height(); + heightVal := round(widthVal / scaling_factor); + End; + End; + //缺省大小(用户没有设置尺寸,同时TSImage也没有识别图片尺寸) + if widthVal = 0 and heightVal = 0 then + widthVal := 15 * ETU; + if widthVal = 0 then + widthVal := heightVal * 2; + if heightVal = 0 then + heightVal := widthVal / 3; + + //缩放 + ratio := 1; + if widthVal > maxX * ETU then + ratio := maxX * ETU / widthVal; + if heightVal > maxY * ETU then Begin + r2 := maxY * ETU / heightVal; + if r2 < ratio then + ratio := r2; + End; + if ratio < 1 then Begin + heightVal *= ratio; + widthVal *= ratio; + End; + //println('w={}-{},maxx={}, h={}-{},maxh={},ratio={}',integer(image.Width()),integer(widthVal),15 * ETU, integer(image.Height()),integer(heightVal),23 * ETU,ratio); + return array(integer(widthVal), integer(heightVal)); + End; + + Image;//图片内容(Binary) + Descr; + Width;//厘米 + Height;//厘米 +End; + +Type TChart = Class(TChartImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + Class(TChartImpl).Create(nil, 'w:p'); + ChartNode := node; + End; + + Function Init(docx, pNode, cNode); + Begin + pNode_ := pNode; + if not ifObj(cNode) then + return; + rId := cNode.GetAttribute('r:id'); + relsObj := docx.ZipObject().Get('word/_rels/document.xml.rels'); + ridNode := class(xlsxXml).FindRelationship(relsObj, rId); + if not ifObj(ridNode) then + return; + chartFileName := getChartFileName(ridNode.GetAttribute('Target')); + xmlObj := docx.ZipObject().Get(chartFileName); + if not ifObj(xmlObj) then + return; + chartNode := class(xlsxXml).GetNode(xmlObj, 'c:chartSpace/c:chart/c:plotArea'); + End; + + Function Serialize(isWord); + Begin + Plotarea := TOfficeObj('TPlotarea'); + Plotarea.Layout := true; + isWord_ := isWord; + Type := lowercase(Type); + case Type of + 'area','areastacked','areapercentstacked','area3d','area3dstacked','area3dpercentstacked','bar','barstacked','barpercentstacked', + 'bar3dclustered','bar3dstacked','bar3dpercentstacked','bar3dconeclustered','bar3dconestacked','bar3dconepercentstacked', + 'bar3dpyramidclustered','bar3dpyramidstacked','bar3dpyramidpercentstacked','bar3dcylinderclustered','bar3dcylinderstacked', + 'bar3dcylinderpercentstacked','col','colstacked','colpercentstacked','col3d','col3dclustered','col3dstacked','col3dpercentstacked', + 'col3dcone','col3dconeclustered','col3dconestacked','col3dconepercentstacked','col3dpyramid','col3dpyramidclustered', + 'col3dpyramidstacked','col3dpyramidpercentstacked','col3dcylinder','col3dcylinderclustered','col3dcylinderstacked', + 'col3dcylinderpercentstacked','bubble','bubble3d': + drawBaseChart(Plotarea); + 'doughnut': + Begin + drawExtChart(Plotarea, 'c:doughnutChart'); + Plotarea.chart.HoleSize := 75; + End + 'line': + drawLineChart(Plotarea); + 'pie3d': + drawExtChart(Plotarea, 'c:pie3DChart'); + 'pie': + drawExtChart(Plotarea, 'c:pieChart'); + 'pieofpiechart': + Begin + drawExtChart(Plotarea, 'ofPieChart'); + Plotarea.chart.OfPieType := 'pie'; + End + 'barofpiechart': + Begin + drawExtChart(Plotarea, 'c:ofPieChart'); + Plotarea.chart.OfPieType := 'bar'; + End + 'radar': + drawRadarChart(Plotarea); + 'scatter': + drawScatterChart(Plotarea); + 'surface3d','wireframesurface3d': + drawSurface3DChart(Plotarea, 'c:surface3DChart'); + 'contour','wireframecontour': + drawSurface3DChart(Plotarea, 'c:surfaceChart'); + End; + Plotarea.SpPr.noFill := true; + Plotarea.SpPr.Ln.noFill := true; + Plotarea.SpPr.EffectLst := true; + End; + + ///添加图表Series数据 + Function AddSeries(Name, Categories, Value); + Begin + Series union= array(("Name":Name,"Categories":Categories,"Values":Value)); + return length(Series); + End; + + ///清除图表Series数据 + Function ClearSeries(); + Begin + Series := array(); + End; + + ///删除图表Series数据 + Function RemoveSeries(i); + Begin + cnt := length(Series); + if i < 0 or i >= cnt then + return length(Series); + + tmp := Series[:i-1,:]; + tmp union= Series[i+1:,:]; + Series := tmp; + return length(Series); + End; + + ///更新图表 + Function Apply(); + Begin + if not ifObj(ChartNode) then + return; + if ifstring(Title) and Title <> '' then + UpdateTitle(Title); + if length(Series) then Begin //删除已经存在Series + ser := Chart.C ? 'c:ser' : 'ser'; + node := ChartNode.FirstChildElement(ser); + while ifObj(node) do Begin + ChartNode.DeleteChild(node); + node := ChartNode.FirstChildElement(ser); + End; + End; + Plotarea := new TPlotarea(); + Serialize(); + //以下数据不更新,只更新Series + Plotarea.Layout := nil; + Plotarea.CatAx := nil; + Plotarea.ValAx := nil; + Plotarea.SerAx := nil; + Plotarea.SpPr := nil; + tmp := Plotarea.Chart.ExtNodes; + Plotarea.Chart := new TcCharts(); + Plotarea.Chart.ExtNodes := tmp; + class(xlsxXml).UpdateNode(ChartNode, Plotarea.Marshal()); + End; + + ///修改图表标题 + Function UpdateTitle(t); + Begin + task := array('c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t', 'pcdata', t); + class(xlsxXml).SetNodeValue(ChartNode.Root(), task); + End; + + ///显示数据表 + Function ShowDataTable(b); + Begin + if not ifObj(ChartNode) then + return; + node := ChartNode.FirstChildElement('c:dTable'); + if ifObj(node) then + ChartNode.DeleteChild(node); + if not b then + return; + xmlStr := ' + + + + + + + + + + + + + + + + + + + + + '; + ChartNode.InsertEndChild(xmlStr); + End; +private + Function getChartFileName(f); + Begin + if leftstr(f,5) = 'word/' then + return f; + if leftstr(f,3) = '../' then + return 'word/' + f[4:]; + if f[1] = '/' then + return f[2:]; + return f; + End; + + Function updateValue(task); + Begin + for i:=0 to length(task)-1 do Begin + if not C then + task[i][0] := ReplaceStr(task[i][0], 'c:', ''); + class(xlsxXml).SetNodeValue(xmlObj_, task[i]); + End; + End; + + Function getLegendPosition(t); + Begin + m := array("bottom": "b", + "left": "l", + "right": "r", + "top": "t", + "top_right": "tr"); + return m[t]; + End; + + Function drawSurface3DChart(o, name); + Begin + o.chart.NodeName := name; + setChartSer(o); + o.chart.Axid := 754001152; + o.chart.Axid2 := 753999904; + o.chart.Axid3 := 832256642; + setCatAx(o.CatAx); + setValAx(o.ValAx); + setSerAx(o.SerAx); + if Type in array( 'wireframesurface3d', 'wireframecontour' ) then + o.chart.Wireframe := true; + End; + + Function drawScatterChart(o); + Begin + o.chart.NodeName := 'c:scatterChart'; + o.chart.ScatterStyle := 'smoothMarker'; + o.chart.VaryColors := false; + setChartSer(o); + setDLbls(o.chart.DLbls); + o.chart.Axid := 754001152; + o.chart.Axid2 := 753999904; + setCatAx(o.CatAx); + setValAx(o.ValAx); + End; + + Function drawRadarChart(o); + Begin + o.chart.NodeName := 'c:radarChart'; + o.chart.RadarStyle := 'marker'; + o.chart.VaryColors := false; + setChartSer(o); + setDLbls(o.chart.DLbls); + o.chart.Axid := 754001152; + o.chart.Axid2 := 753999904; + setCatAx(o.CatAx); + setValAx(o.ValAx); + End; + + Function drawExtChart(o, name); + Begin + o.chart.NodeName := name; + o.chart.VaryColors := VaryColors; + setChartSer(o); + setDLbls(o.chart.DLbls); + End; + + Function drawLineChart(o); + Begin + o.chart.NodeName := 'c:lineChart'; + o.chart.Grouping := getGrouping(Type); + o.chart.VaryColors := false; + setChartSer(o); + setDLbls(o.chart.DLbls); + o.chart.Smooth := false; + o.chart.Axid := 754001152; + o.chart.Axid2 := 753999904; + setCatAx(o.CatAx); + setValAx(o.ValAx); + End; + + Function drawBaseChart(o); + Begin + o.chart.BarDir := getBarDir(Type); + o.chart.Grouping := getGrouping(Type); + o.chart.VaryColors := VaryColors; + o.chart.Overlap := getVaryColors(Type); + o.chart.Axid := 754001152; + o.chart.Axid2 := 753999904; + o.chart.NodeName := getChartName(Type); + setChartSer(o); + o.chart.Shape := getSharp(Type); + setDLbls(o.chart.DLbls); + setCatAx(o.CatAx); + setValAx(o.ValAx); + End; + + Function setSerAx(SerAx); + Begin + SerAx.AxID := 832256642; + SerAx.Scaling.Max := YAxis.Max; + SerAx.Scaling.Min := YAxis.Min; + CatAx.Scaling.Orientation := YAxis.ReverseOrder ? 'maxMin' : 'minMax'; + SerAx.Del := YAxis.None; + SerAx.AxPos := XAxis.ReverseOrder ? 't' : 'b'; + SerAx.TickLblPos := 'nextTo'; + drawPlotAreaSpPr(SerAx.SpPr); + drawPlotAreaTxPr(SerAx.TxPr); + SerAx.CrossAx := 753999904; + End; + + Function setCatAx(CatAx); + Begin + CatAx.AxID := 754001152; + CatAx.Scaling.Max := XAxis.Max; + CatAx.Scaling.Min := XAxis.Min; + CatAx.Scaling.Orientation := XAxis.ReverseOrder ? 'maxMin' : 'minMax'; + CatAx.Del := XAxis.None; + CatAx.AxPos := XAxis.ReverseOrder ? 't' : 'b'; + CatAx.NumFmt.FormatCode := 'General'; + CatAx.NumFmt.SourceLinked := true; + CatAx.MajorTickMark := 'none'; + CatAx.MinorTickMark := 'none'; + CatAx.TickLblPos := 'nextTo'; + drawPlotAreaSpPr(CatAx.SpPr); + drawPlotAreaTxPr(CatAx.TxPr); + CatAx.CrossAx := 753999904; + CatAx.Crosses := 'autoZero'; + CatAx.Auto := true; + CatAx.LblAlgn := 'ctr'; + CatAx.LblOffset := 100; + CatAx.NoMultiLvlLbl := false; + if XAxis.MajorGridlines then + drawPlotAreaSpPr(CatAx.MajorGridlines.SpPr); + if XAxis.MinorGridlines then + drawPlotAreaSpPr(CatAx.MinorGridlines.SpPr); + if XAxis.TickLabelSkip then + CatAx.TickLabelSkip := XAxis.TickLabelSkip; + End; + + Function setValAx(ValAx); + Begin + ValAx.AxID := 753999904; + ValAx.Scaling.Max := YAxis.Max; + ValAx.Scaling.Min := YAxis.Min; + if ifint(YAxis.LogBase) and YAxis.LogBase >= 2 and YAxis.LogBase <= 1000 then + ValAx.Scaling.LogBase := YAxis.LogBase; + ValAx.Scaling.Orientation := YAxis.ReverseOrder ? 'maxMin' : 'minMax'; + ValAx.Del := YAxis.None; + ValAx.AxPos := YAxis.ReverseOrder ? 'r' : 'l'; + ValAx.NumFmt.FormatCode := chartValAxNumFmtFormatCode(Type); + ValAx.NumFmt.SourceLinked := true; + ValAx.MajorTickMark := 'none'; + ValAx.MinorTickMark := 'none'; + ValAx.TickLblPos := 'nextTo'; + drawPlotAreaSpPr(ValAx.SpPr); + drawPlotAreaTxPr(ValAx.TxPr); + ValAx.CrossAx := 754001152; + ValAx.Crosses := 'autoZero'; + ValAx.CrossBetween := chartValAxCrossBetween(Type); + if XAxis.MajorGridlines then + drawPlotAreaSpPr(ValAx.MajorGridlines.SpPr); + if XAxis.MinorGridlines then + drawPlotAreaSpPr(ValAx.MinorGridlines.SpPr); + ValAx.MajorUnit := YAxis.MajorUnit; + if Type in array('contour', 'wireframecontour') then + ValAx.TickLblPos := 'none'; + End; + + Function chartValAxCrossBetween(t); + Begin + m := array( + 'area': 'midCat', + 'areastacked': 'midCat', + 'areapercentstacked': 'midCat', + 'area3d': 'midCat', + 'area3dstacked': 'midCat', + 'area3dpercentstacked': 'midCat', + 'bar': 'between', + 'barstacked': 'between', + 'barpercentstacked': 'between', + 'bar3dclustered': 'between', + 'bar3dstacked': 'between', + 'bar3dpercentstacked': 'between', + 'bar3dconeclustered': 'between', + 'bar3dconestacked': 'between', + 'bar3dconepercentstacked': 'between', + 'bar3dpyramidclustered': 'between', + 'bar3dpyramidstacked': 'between', + 'bar3dpyramidpercentstacked': 'between', + 'bar3dcylinderclustered': 'between', + 'bar3dcylinderstacked': 'between', + 'bar3dcylinderpercentstacked': 'between', + 'col': 'between', + 'colstacked': 'between', + 'colpercentstacked': 'between', + 'col3d': 'between', + 'col3dclustered': 'between', + 'col3dstacked': 'between', + 'col3dpercentstacked': 'between', + 'col3dcone': 'between', + 'col3dconeclustered': 'between', + 'col3dconestacked': 'between', + 'col3dconepercentstacked': 'between', + 'col3dpyramid': 'between', + 'col3dpyramidclustered': 'between', + 'col3dpyramidstacked': 'between', + 'col3dpyramidpercentstacked': 'between', + 'col3dcylinder': 'between', + 'col3dcylinderclustered': 'between', + 'col3dcylinderstacked': 'between', + 'col3dcylinderpercentstacked': 'between', + 'doughnut': 'between', + 'line': 'between', + 'pie': 'between', + 'pie3d': 'between', + 'pieofpiechart': 'between', + 'barofpiechart': 'between', + 'radar': 'between', + 'scatter': 'between', + 'surface3d': 'midCat', + 'wireframesurface3d': 'midCat', + 'contour': 'midCat', + 'wireframecontour': 'midCat', + 'bubble': 'midCat', + 'bubble3d': 'midCat'); + return m[t]; + End; + + Function chartValAxNumFmtFormatCode(t); + Begin + m := array( + 'area': 'General', + 'areastacked': 'General', + 'areapercentstacked': '0%', + 'area3d': 'General', + 'area3dstacked': 'General', + 'area3dpercentstacked': '0%', + 'bar': 'General', + 'barstacked': 'General', + 'barpercentstacked': '0%', + 'bar3dclustered': 'General', + 'bar3dstacked': 'General', + 'bar3dpercentstacked': '0%', + 'bar3dconeclustered': 'General', + 'bar3dconestacked': 'General', + 'bar3dconepercentstacked': '0%', + 'bar3dpyramidclustered': 'General', + 'bar3dpyramidstacked': 'General', + 'bar3dpyramidpercentstacked': '0%', + 'bar3dcylinderclustered': 'General', + 'bar3dcylinderstacked': 'General', + 'bar3dcylinderpercentstacked': '0%', + 'col': 'General', + 'colstacked': 'General', + 'colpercentstacked': '0%', + 'col3d': 'General', + 'col3dclustered': 'General', + 'col3dstacked': 'General', + 'col3dpercentstacked': '0%', + 'col3dcone': 'General', + 'col3dconeclustered': 'General', + 'col3dconestacked': 'General', + 'col3dconepercentstacked': '0%', + 'col3dpyramid': 'General', + 'col3dpyramidclustered': 'General', + 'col3dpyramidstacked': 'General', + 'col3dpyramidpercentstacked': '0%', + 'col3dcylinder': 'General', + 'col3dcylinderclustered': 'General', + 'col3dcylinderstacked': 'General', + 'col3dcylinderpercentstacked': '0%', + 'doughnut': 'General', + 'line': 'General', + 'pie': 'General', + 'pie3d': 'General', + 'pieofpiechart': 'General', + 'barofpiechart': 'General', + 'radar': 'General', + 'scatter': 'General', + 'surface3d': 'General', + 'wireframesurface3d': 'General', + 'contour': 'General', + 'wireframecontour': 'General', + 'bubble': 'General', + 'bubble3d': 'General'); + return m[t]; + End; + + Function drawPlotAreaTxPr(TxPr); + Begin + TxPr.BodyPr.Rot := -60000000; + TxPr.BodyPr.SpcFirstLastPara := true; + TxPr.BodyPr.VertOverflow := 'ellipsis'; + TxPr.BodyPr.Vert := 'horz'; + TxPr.BodyPr.Wrap := 'square'; + TxPr.BodyPr.Anchor := 'ctr'; + TxPr.BodyPr.AnchorCtr := true; + TxPr.P.PPr.DefRPr.Sz := 900; + TxPr.P.PPr.DefRPr.Bold := false; + TxPr.P.PPr.DefRPr.Italic := false; + TxPr.P.PPr.DefRPr.U := 'none'; + TxPr.P.PPr.DefRPr.Strike := 'noStrike'; + TxPr.P.PPr.DefRPr.Kern := 1200; + TxPr.P.PPr.DefRPr.Baseline := 0; + TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.Val := 'tx1'; + TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.LumMod := 15000; + TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.LumOff := 85000; + TxPr.P.PPr.DefRPr.Latin.Typeface := '+mn-lt'; + TxPr.P.PPr.DefRPr.Ea.Typeface := '+mn-ea'; + TxPr.P.PPr.DefRPr.Cs.Typeface := '+mn-cs'; + TxPr.P.EndParaRPr.Lang := 'en-US'; + End; + + Function drawPlotAreaSpPr(SpPr); + Begin + SpPr.Ln.W := 9525; + SpPr.Ln.Cap := 'flat'; + SpPr.Ln.Cmpd := 'sng'; + SpPr.Ln.Algn := 'ctr'; + SpPr.Ln.SolidFill.SchemeClr.Val := 'tx1'; + SpPr.Ln.SolidFill.SchemeClr.LumMod := 15000; + SpPr.Ln.SolidFill.SchemeClr.LumOff := 85000; + End; + + Function setChartSer(o); + Begin + SerArr := array(); + for i:=0 to length(Series)-1 do Begin + ser := TOfficeObj('TSer'); + SerArr union= array(('name':'c:ser','obj':ser,'attrEx':'','nodeType':'','attrName':'')); + ser.IDx := i + Ord; + ser.Ord := i + Ord; + setTx(ser.Tx.StrRef, Series[i]['Name']); + setSpPr(ser.SpPr, i); + setMarker(ser.Marker, i); + setDpt(ser, i); + //setDLbls(ser.DLbls); + ser.InvertIfNegative := false; + setCat(ser.Cat, i); + setVal(ser.Val, i); + setXVal(ser.XVal, i); + setYVal(ser.YVal, i); + setBubbleSize(ser.BubbleSize, i); + setBubble3D(ser.Bubble3D, i); + End; + o.chart.Ser := SerArr; + End; + + Function setTx(strRef, name); + Begin + if not IsWord_ then Begin + strRef.F := name; + return; + End; + strRef.F := 'Sheet1!$B$1'; + strRef.strCache.ptCount := 1; + strRef.strCache.pt.IDx := 0; + strRef.strCache.pt.V := name; + End; + + Function setBubble3D(Bubble3D, i); + Begin + if Type <> 'bubble3d' then return; + Bubble3D := true; + End; + + Function setBubbleSize(BubbleSize, i); + Begin + if not (Type in array('bubble', 'bubble3d')) then return; + BubbleSize.NumRef.F := Series[i]['Values']; + End; + + Function setYVal(Val, i); + Begin + if not (Type in array('scatter', 'bubble', 'bubble3d')) then return; + setVal(Val, i); + End; + + Function setXVal(xVal, i); + Begin + if not (Type in array('scatter')) then return; + setCat(xVal, i); + End; + + Function setVal(Val, ind); + Begin + if Type in array('scatter', 'bubble', 'bubble3d') then return; + data := Series[ind]['Values']; + if ifstring(data) then + Val.NumRef.F := data; //excel图表(Sheet1!$C$2:$C$6) + else if istable(data) then Begin //word 图表 + cnt := length(data); + [err, axis] := xlsx_call("ColumnNumberToName", 2 * ind + 2); + Val.NumRef.F := fmt('Sheet1!${}$2:${}${}',axis, axis, cnt+1); + Val.NumRef.NumCache.PtCount := cnt; + Val.NumRef.NumCache.formatCode := 'General'; + for i:=0 to cnt-1 do Begin + Tpt := TOfficeObj('Tpt'); + Tpt.IDx := i; + Tpt.V := data[i]; + Val.NumRef.NumCache.NewChildNode( array("field":"", "name":"c:pt", "obj":Tpt, "attrEx":"", "nodeType":"") ); + End; + End; + End; + + Function setCat(Cat, ind); + Begin + if Type in array('scatter', 'bubble', 'bubble3d') then return; + Categories := Series[ind]['Categories']; + if ifstring(Categories) then + cat.StrRef.F := Categories; //excel图表(Sheet1!$B$2:$B$6) + else if istable(Categories) then Begin //word 图表 + cnt := length(Categories); + [err, axis] := xlsx_call("ColumnNumberToName", 2 * ind + 1); + cat.StrRef.F := fmt('Sheet1!${}$2:${}${}',axis, axis, cnt+1); + cat.StrRef.StrCache.PtCount := cnt; + for i:=0 to cnt-1 do Begin + Tpt := TOfficeObj('Tpt'); + Tpt.IDx := i; + Tpt.V := Categories[i]; + cat.StrRef.StrCache.NewChildNode( array("field":"", "name":"c:pt", "obj":Tpt, "attrEx":"", "nodeType":"") ); + End; + End; + End; + + Function setDLbls(DLbls); + Begin + if Type in array('scatter','surface3d', 'wireframesurface3d', 'contour', 'wireframecontour', 'bubble', 'bubble3d') then + return; + DLbls.ShowLegendKey := ShowLegendKey; + DLbls.ShowVal := ShowVal; + DLbls.ShowCatName := ShowCatName; + DLbls.ShowSerName := ShowSerName; + DLbls.ShowBubbleSize := ShowBubbleSize; + DLbls.ShowPercent := ShowPercent; + DLbls.ShowLeaderLines := ShowLeaderLines; + End; + + Function setDpt(o, ind); + Begin + if not (Type in array('pie','pie3d')) then return; + data := Series[ind]['Values']; + if ifstring(data) then Begin + o.Dpt.IDx := 0; + o.Dpt.Bubble3D := false; + setPieSppr(o.Dpt.Sppr); + End + else if istable(data) then Begin + cnt := length(data); + r := array(); + for i:=0 to cnt-1 do Begin + dpt := TOfficeObj('TDpt'); + dpt.IDx := i; + dpt.Bubble3D := false; + if i=0 then + setPieSppr(dpt.sPpr); + r[length(r)] := array('name':'c:dPt','obj':dpt,'attrEx':'','nodeType':'','attrName':''); + End; + o.DptEx := r; + End; + End; + + Function setPieSppr(sPpr); + Begin + SpPr.SolidFill.SchemeClr.Val := 'accent1'; + SpPr.Ln.W := 25400; + SpPr.Ln.Cap := 'rnd'; + SpPr.Ln.SolidFill.SchemeClr.Val := 'lt1'; + SpPr.Sp3D.ContourW := 25400; + SpPr.Sp3D.ContourClr.SchemeClr.Val := 'lt1'; + End; + + Function setMarker(Marker, i); + Begin + if not (Type in array('scatter', 'line')) then return; + if Type = 'scatter' then + Marker.Symbol := 'circle'; + Marker.Size := 5; + if ifstring(Series[i]['Symbol']) then + Marker.Symbol := Series[i]['Symbol']; + if ifint(Series[i]['Size']) then + Marker.Size := Series[i]['Size']; + + if i < 6 then Begin + marker.SpPr.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); + Marker.SpPr.Ln.W := 9252; + Marker.SpPr.Ln.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); + End; + End; + + Function setSppr(SpPr, i); + Begin + if Type = 'line' then Begin + SpPr.Ln.algn := 'ctr'; + SpPr.Ln.cmpd := 'sng'; + SpPr.Ln.cap := 'rnd'; + SpPr.Ln.W := 8000; + //SpPr.Ln.NoFill := true; + SpPr.Ln.prstDash := 'solid'; + SpPr.Ln.round := true; + SpPr.Ln.SolidFill.SchemeClr.Val := 'accent' $ ((Ord+i)%6+1); + return; + End; + if Type = 'scatter' then Begin + w := Series[i]['LineWidth']; + SpPr.Ln.W := 0.25 > w || w > 999 ? 25400 : 12700 * w; + SpPr.Ln.Cap := 'rnd'; + SpPr.Ln.SolidFill.SchemeClr.Val := 'accent' $ ((Ord+i)%6+1); + return; + End; + End; + + Function getSharp(t); + Begin + m := array( + 'bar3dconeclustered': 'cone', + 'bar3dconestacked': 'cone', + 'bar3dconepercentstacked': 'cone', + 'bar3dpyramidclustered': 'pyramid', + 'bar3dpyramidstacked': 'pyramid', + 'bar3dpyramidpercentstacked': 'pyramid', + 'bar3dcylinderclustered': 'cylinder', + 'bar3dcylinderstacked': 'cylinder', + 'bar3dcylinderpercentstacked': 'cylinder', + 'col3dcone': 'cone', + 'col3dconeclustered': 'cone', + 'col3dconestacked': 'cone', + 'col3dconepercentstacked': 'cone', + 'col3dpyramid': 'pyramid', + 'col3dpyramidclustered': 'pyramid', + 'col3dpyramidstacked': 'pyramid', + 'col3dpyramidpercentstacked': 'pyramid', + 'col3dcylinder': 'cylinder', + 'col3dcylinderclustered': 'cylinder', + 'col3dcylinderstacked': 'cylinder', + 'col3dcylinderpercentstacked': 'cylinder'); + return m[t]; + End; + + Function getChartName(t); + Begin + m := array( + 'area': 'areaChart', + 'areastacked': 'areaChart', + 'areapercentstacked': 'areaChart', + 'area3d': 'area3DChart', + 'area3dstacked': 'area3DChart', + 'area3dpercentstacked': 'area3DChart', + 'bar': 'barChart', + 'barstacked': 'barChart', + 'barpercentstacked': 'barChart', + 'bar3dclustered': 'bar3DChart', + 'bar3dstacked': 'bar3DChart', + 'bar3dpercentstacked': 'bar3DChart', + 'bar3dconeclustered': 'bar3DChart', + 'bar3dconestacked': 'bar3DChart', + 'bar3dconepercentstacked': 'bar3DChart', + 'bar3dpyramidclustered': 'bar3DChart', + 'bar3dpyramidstacked': 'bar3DChart', + 'bar3dpyramidpercentstacked': 'bar3DChart', + 'bar3dcylinderclustered': 'bar3DChart', + 'bar3dcylinderstacked': 'bar3DChart', + 'bar3dcylinderpercentstacked': 'bar3DChart', + 'col': 'barChart', + 'colstacked': 'barChart', + 'colpercentstacked': 'barChart', + 'col3d': 'bar3DChart', + 'col3dclustered': 'bar3DChart', + 'col3dstacked': 'bar3DChart', + 'col3dpercentstacked': 'bar3DChart', + 'col3dcone': 'bar3DChart', + 'col3dconeclustered': 'bar3DChart', + 'col3dconestacked': 'bar3DChart', + 'col3dconepercentstacked': 'bar3DChart', + 'col3dpyramid': 'bar3DChart', + 'col3dpyramidclustered': 'bar3DChart', + 'col3dpyramidstacked': 'bar3DChart', + 'col3dpyramidpercentstacked': 'bar3DChart', + 'col3dcylinder': 'bar3DChart', + 'col3dcylinderclustered': 'bar3DChart', + 'col3dcylinderstacked': 'bar3DChart', + 'col3dcylinderpercentstacked': 'bar3DChart', + 'bubble': 'bubbleChart', + 'bubble3D': 'bubbleChart'); + return 'c:' $ m[t]; + End; + + Function getVaryColors(t); + Begin + m := array( + 'barstacked': 100, + 'barpercentstacked': 100, + 'colstacked': 100, + 'colpercentstacked': 100 + ); + return m[t]; + End; + + Function getGrouping(t); + Begin + m := array( + 'area': 'standard', + 'areastacked': 'stacked', + 'areapercentstacked': 'percentstacked', + 'area3d': 'standard', + 'area3dstacked': 'stacked', + 'area3dpercentstacked': 'percentstacked', + 'bar': 'clustered', + 'barstacked': 'stacked', + 'barpercentstacked': 'percentstacked', + 'bar3dclustered': 'clustered', + 'bar3dstacked': 'stacked', + 'bar3dpercentstacked': 'percentstacked', + 'bar3dconeclustered': 'clustered', + 'bar3dconestacked': 'stacked', + 'bar3dconepercentstacked': 'percentstacked', + 'bar3dpyramidclustered': 'clustered', + 'bar3dpyramidstacked': 'stacked', + 'bar3dpyramidpercentstacked': 'percentstacked', + 'bar3dcylinderclustered': 'clustered', + 'bar3dcylinderstacked': 'stacked', + 'bar3dcylinderpercentstacked': 'percentstacked', + 'col': 'clustered', + 'colstacked': 'stacked', + 'colpercentstacked': 'percentstacked', + 'col3d': 'standard', + 'col3dclustered': 'clustered', + 'col3dstacked': 'stacked', + 'col3dpercentstacked': 'percentstacked', + 'col3dcone': 'standard', + 'col3dconeclustered': 'clustered', + 'col3dconestacked': 'stacked', + 'col3dconepercentstacked': 'percentstacked', + 'col3dpyramid': 'standard', + 'col3dpyramidclustered': 'clustered', + 'col3dpyramidstacked': 'stacked', + 'col3dpyramidpercentstacked': 'percentstacked', + 'col3dcylinder': 'standard', + 'col3dcylinderclustered': 'clustered', + 'col3dcylinderstacked': 'stacked', + 'col3dcylinderpercentstacked': 'percentstacked', + 'line': 'standard'); + return m[t]; + End; + + Function getBarDir(t); + Begin + m := array( + 'bar': 'bar', + 'barstacked': 'bar', + 'barpercentstacked': 'bar', + 'bar3dclustered': 'bar', + 'bar3dstacked': 'bar', + 'bar3dpercentstacked': 'bar', + 'bar3dconeclustered': 'bar', + 'bar3dconestacked': 'bar', + 'bar3dconepercentstacked': 'bar', + 'bar3dpyramidclustered': 'bar', + 'bar3dpyramidstacked': 'bar', + 'bar3dpyramidpercentstacked': 'bar', + 'bar3dcylinderclustered': 'bar', + 'bar3dcylinderstacked': 'bar', + 'bar3dcylinderpercentstacked': 'bar', + 'col': 'col', + 'colstacked': 'col', + 'colpercentstacked': 'col', + 'col3d': 'col', + 'col3dclustered': 'col', + 'col3dstacked': 'col', + 'col3dpercentstacked': 'col', + 'col3dcone': 'col', + 'col3dconestacked': 'col', + 'col3dconeclustered': 'col', + 'col3dconepercentstacked': 'col', + 'col3dpyramid': 'col', + 'col3dpyramidclustered': 'col', + 'col3dpyramidstacked': 'col', + 'col3dpyramidpercentstacked': 'col', + 'col3dcylinder': 'col', + 'col3dcylinderclustered': 'col', + 'col3dcylinderstacked': 'col', + 'col3dcylinderpercentstacked': 'col', + 'line': 'standard'); + return m[t]; + End; + + isWord_; +End; + +Type TPageLine = Class + Function Create(w); + Begin + Width := w; + Init(); + End; + + Function Init(); + Begin + MaxLineHeight := 0; + CurrentLine := 0; + txt_ := ''; + End; + + Function Add(ch, rowHeight, rPr); + Begin + newLine := false; + txt := txt_; + [charW, cnt] := _getCharWidth(ch, rPr); + if CurrentLine + charW > Width then Begin + mh := MaxLineHeight; + Init(); //新行 + newLine := true; + End; + CurrentLine += charW; + if rowHeight > MaxLineHeight then + MaxLineHeight := rowHeight; + return array(newLine, mh, cnt, txt); + End; + + Function _getCharWidth(ch, rPr); + Begin + iChar := ord(ch); + cnt := iChar > 127 ? 3 : 1; + ratio := cnt=1 ? 0.5 : 1; + if ifObj(rPr) then Begin + size := max(rPr.Size, rPr.szCs); + if size=0 then size := 21; + return array(size * 10 * ratio, cnt); + End; + return array(210 * ratio, cnt); //默认五号字 + End; + + Width:integer; + MaxLineHeight:integer; + CurrentLine:integer; + txt_:string; +End; + +//页面设置 +Type TSectPr = Class + Function Create(docx, node); + Begin + docx_ := docx; + PageNo := 1; + LinePos := 0; + PageHash := array(); + ContentArr := array(); + if ifObj(node) then + Init(node); + End; + + Function Init(node); + Begin + pgSz := node.FirstChildElement('w:pgSz'); + if ifObj(pgSz) then Begin + w := pgSz.GetAttribute('w:w'); + h := pgSz.GetAttribute('w:h'); + End; + pgMar := node.FirstChildElement('w:pgMar'); + if ifObj(pgMar) then Begin + left := pgMar.GetAttribute('w:left'); + right := pgMar.GetAttribute('w:right'); + top := pgMar.GetAttribute('w:top'); + bottom := pgMar.GetAttribute('w:bottom'); + End; + PageWidth := Class(xlsxXml).SafeStrToIntDef(w, 11906)-Class(xlsxXml).SafeStrToIntDef(left,1800)-Class(xlsxXml).SafeStrToIntDef(right,1800); + PageHeight := Class(xlsxXml).SafeStrToIntDef(h, 16838)-Class(xlsxXml).SafeStrToIntDef(top,1440)-Class(xlsxXml).SafeStrToIntDef(bottom,1440); + docGrid := node.FirstChildElement('w:docGrid'); + LinePitch := ifObj(docGrid) ? Class(xlsxXml).SafeStrToIntDef(docGrid.GetAttribute('w:linePitch'), 312) : 312; + PageLine := new TPageLine(PageWidth); + if istable(ContentArr) then Begin //计算当前章节页码 + //w:p;w:tbl + for i:=0 to length(ContentArr)-1 do Begin + [startPage,PageNo,LinePos] := _CalcPage(ContentArr[i]['obj'], PageNo, LinePos);//计算段落、表格、文本框、图片、形状等的页面及大小 + if ContentArr[i]['mark'] >= 0 then + PageHash[ ContentArr[i]['mark'] ] := startPage;//记录页面 + End; + + //下一章节 + PageNo ++; + ContentArr := array(); + LinePos := 0; + End; + End; + + Function Append(p); + Begin + ContentArr[ length(ContentArr) ] := array('obj':p, 'mark':-1); + End; + + Function Mark(ind); + Begin + if istable(ContentArr) then + ContentArr[ length(ContentArr)-1 ]['mark'] := ind; + End; + + Function GetPageNo(ind); + Begin + if ifInt(PageHash[ind]) then + return PageHash[ind]; + return PageNo; + End; + + //计算页面 + Function _CalcPage(obj, page, lpos, more); + Begin + startPage := page; + curPageNo := page; + curLinePos := lpos; + case obj.Name() of + 'w:p': + [startPage, pgNo, line] := _CalcParagraphPage(obj, curPageNo, curLinePos, more); + 'w:tbl': + [startPage, pgNo, line] := _CalcTablePage(obj, curPageNo, curLinePos); + End; + return array(startPage, pgNo, line); + End; + + //段落 + Function _CalcParagraphPage(p, page, lpos, more); + Begin + startPage := page; + curPageNo := page; + curLinePos := lpos; + height := 0;//单位:点(1点=0.3527毫米=1/72英寸) + ETU := 360045;//1cm单位 + defaultLineHeight := LinePitch; //缺省行距 + ParagraphLineHeight := LinePitch; + + defaultPpr := docx_.StyleObject().defaultPpr_;//缺省段落 + defaultRpr := docx_.StyleObject().defaultRpr_;//缺省字体 + pPr := Class(xlsxXml).ReadPprFormat(p.node_); + //存在段落样式 + StyleId := p.pPr.Value('StyleId'); + if StyleId then Begin + oStyle := docx_.StyleObject().GetStyleById(StyleId); + if ifObj(oStyle) then Begin + stylePpr := oStyle.ReadPprFormat(); //读段落属性(缓存到StyleObject中) + if not ifObj(pPr) then Begin + pPr := stylePpr; + End + else + Class(xlsxXml).CopyPprFormat(pPr, stylePpr); + //Class(xlsxXml).CopyPprFormat(pPr, defaultPpr); + + defaultRpr := oStyle.ReadRprFormat(); //读段落字体属性(缓存到StyleObject中) + End; + End + else if ifObj(defaultPpr) then Begin //缺省样式 + if not ifObj(pPr) then Begin + pPr := defaultPpr; + End + else + Class(xlsxXml).CopyPprFormat(pPr, defaultPpr); + End; + + LineRatio := 1.0; + if ifObj(pPr) then Begin + if pPr.LineSpacingRule = 'exact' and pPr.LineSpacing then //固定行距 + defaultLineHeight := _pPr.LineSpacing; + else if pPr.LineSpacing then Begin + LineRatio := pPr.LineSpacing / 240; + //LineRatio := 1.0; + defaultLineHeight := LineRatio * defaultLineHeight; //多倍行距 + End; + ParagraphLineHeight := _GetHeightRatio(pPr, pPr.rPr, LineRatio) * defaultLineHeight; //缺省段落高度(字体) + End; + + //段前 + before := (ifObj(pPr)) ? pPr.SpaceBefore : 0; + after := ifObj(pPr) ? pPr.SpaceAfter : 0; + //段中 + runs := p.GetRuns(); + for i:=0 to length(runs)-1 do Begin + run := runs[i]; + rPr := Class(xlsxXml).ReadRprFormat(run.node_); + if not ifObj(rPr) then + rPr := defaultRpr; + else + Class(xlsxXml).CopyRprFormat(rPr, defaultRpr); +//_dumpRpr(rpr); + RunLineHeight := _GetHeightRatio(pPr, rPr, LineRatio) * defaultLineHeight; //缺省段落高度 + pic := run.node_.FirstChildElement('w:drawing/wp:inline/wp:extent');//图片 + if not ifObj(pic) then + pic := run.node_.FirstChildElement('mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/wp:extent');//文本框 + if ifObj(pic) then Begin + cy := Class(xlsxXml).SafeStrToIntDef(pic.GetAttribute('cy'), LinePitch); + height := cy / ETU / 0.0325; + _addLine(startPage, curPageNo, curLinePos, height, before, linesCnt ? false : true, txt); //加入一行 + linesCnt ++; + continue; + End + + node := run.node_.FirstChildElement(); + while ifObj(node) do Begin + name := node.GetName(); + if name = 'w:br' then Begin + _addLine(startPage, curPageNo, curLinePos, (PageLine.MaxLineHeight ? PageLine.MaxLineHeight : RunLineHeight) + (linesCnt ? 0 : more), 0, linesCnt ? false : true, ''); //加入一行 + PageLine.Init(); + linesCnt ++; + End + else if name = 'w:t' then Begin + txt := node.GetText(); + txtLen := length(txt); + n := 0; + while n < txtLen do Begin + if ifObj(pPr) and PageLine.CurrentLine = 0 then Begin //缩进、悬挂 + PageLine.CurrentLine += _getHanging(linesCnt, pPr); + End; + [newLine, LineHeight, cnt, t] := PageLine.Add(txt[n+1], RunLineHeight, rPr); + PageLine.txt_ += txt[n+1:n+cnt]; + n += cnt; + if newLine then Begin + _addLine(startPage, curPageNo, curLinePos, LineHeight + (linesCnt ? 0 : more), before, linesCnt ? false : true, t); //加入一行 + PageLine.CurrentLine += _getHanging(linesCnt+1, pPr); + linesCnt ++; + End; + End; + End; + node := node.NextElement(); + End; + End; + if linesCnt = 0 and PageLine.CurrentLine = 0 then Begin //空行 + _addLine(startPage, curPageNo, curLinePos, ParagraphLineHeight + more, 0, true, ''); //加入一行 + End + else if PageLine.CurrentLine then Begin + _addLine(startPage, curPageNo, curLinePos, PageLine.MaxLineHeight, before, linesCnt ? false : true, PageLine.txt_); //加入一行 + PageLine.Init(); + linesCnt ++; + End + else Begin + PageLine.Init(); + End; + //段后 +//_dumpPpr(pPr); +//println('Begin Orer=curLinePos={}',curLinePos); + curLinePos += after; +//println('End Orer=curLinePos={}\n\n\n\n',curLinePos); + return array(startPage, curPageNo, curLinePos); + End; + + //表格 + Function _CalcTablePage(tbl, page, lpos); + Begin + startPage := page; + curPageNo := page; + curLinePos := lpos; + topH := Class(xlsxXml).SafeStrToIntDef(tbl.tblPr.Borders.Top.Value('Val'), 4); //缺省0.5磅,一磅=20点 + bottomH := Class(xlsxXml).SafeStrToIntDef(tbl.tblPr.Borders.bottom.Value('Val'), 4); //缺省0.5磅 + insideVH := Class(xlsxXml).SafeStrToIntDef(tbl.tblPr.Borders.insideV.Value('Val'), 4); //缺省0.5磅 + iRow := 0; + trNode := tbl.node_.FirstChildElement('w:tr'); + while ifObj(trNode) do Begin + maxPageNo := curPageNo; + maxLinePos := curLinePos; + tr := new TwTr(nil, 'w:tr'); + tr.RootObj := trNode; + vh := Class(xlsxXml).SafeStrToIntDef(tr.tblPrEx.Borders.insideV.Value('Val'), insideVH); //行的上边框 + tcNode := trNode.FirstChildElement('w:tc'); + while ifObj(tcNode) do Begin //计算每一个单元格占用页面 + tcPageNo := curPageNo; + tcLinePos := curLinePos; + iCol := 0; + pNode := tcNode.FirstChildElement(); + while ifObj(pNode) do Begin + name := pNode.GetName(); + obj := _getDocObject(pNode, name); + if ifObj(obj) then Begin + [tcStartPage,tcPageNo,tcLinePos] := _CalcPage(ContentArr[i]['obj'], tcPageNo, tcLinePos, iCol = 0 ? (iRow = 0 ? topH * 2.5 : vh * 2.5) : 0); + iCol ++; + End; + pNode := pNode.NextElement(); + End; + if iCol = 0 then Begin //空单元格 + _addLine(tcStartPage, tcPageNo, tcLinePos, (iRow = 0 ? topH * 2.5 : vh * 2.5) + LinePitch, 0, false, ''); + End; + if maxPageNo < tcPageNo then Begin + maxPageNo := tcPageNo; + maxLinePos := tcLinePos; + End + else if maxPageNo = tcPageNo and maxLinePos < tcLinePos then Begin + maxLinePos := tcLinePos; + End; + tcNode := tcNode.NextElement('w:tc'); + End; + iRow++; + trNode := trNode.NextElement('w:tr'); + curPageNo := maxPageNo; + curLinePos := maxLinePos; + End; + //底边框 + _addLine(startPage, curPageNo, curLinePos, bottomH * 2.5, 0, false, ''); + + return array(startPage, curPageNo, curLinePos); + End; + + Function _addLine(startPage, curPageNo, curLinePos, height, before, firstLine, t); + Begin +//println('换行:curLinePos={},height={}, before={}, txt={}',curLinePos, height, before, t); + if curLinePos + height > PageHeight then Begin //放不下,换页 + curPageNo++; + curLinePos := height; +//println('换页:curLinePos={},txt={}',curLinePos, t); + End + else + curLinePos += height + (curLinePos = 0 ? 0 : before); + if firstLine then + startPage := curPageNo; + End; + + Function _GetHeightRatio(pPr, rPr, LineRatio); + Begin + if lineRule = 'exact' then //固定行距 + return 1.0; + if not ifObj(rPr) then + return 1.0; + + return _Font2LineHeight(rPr, LineRatio); //字体大小对应的行距(倍数) + End; + + Function _Font2LineHeight(rPr, LineRatio); + Begin + size := max(rPr.Size, rPr.szCs); + if size = 0 then size := 21;//缺省五号字 + if rPr.rFont.hint in array('eastAsia', 'zh-CN') or rPr.rFont.eastAsia <> '' then Begin + return ceil(size*10/(LinePitch*LineRatio-200/3)); + End; + + return ceil(size*10/(LinePitch*LineRatio-38)); + End; + + docx_; + PageWidth:integer; + PageHeight:integer; + LinePitch:integer; //行距 + PageNo; + LinePos; + ContentArr; + PageHash; + PageLine; +End; + +//w:body +Type TDocumentBody = Class(DocObject) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + name_ := 'w:body'; + InitNode(node); + End; + + Function InitNode(node); + Begin + node_ := node; + //设置最后一个段落 + _setLastParagraph(); + End; + + Function _setLastParagraph(); + Begin + lastParagraph_ := nil; + if ifObj(node_) then Begin + last := node_.LastChild(); + while ifObj(last) do Begin + name := last.GetName(); + if name in array('w:p', 'w:tbl') then Begin + lastParagraph_ := last; + break; + End; + last := last.Prev(); + End; + End; + End; + + ///返回文档中全部对象列表(TParagraph、TTable等) + Function Parts(); + Begin + return getDocumentObjects(node_, ''); + End; + + ///word文档所有段落 + ///返回:TParagraph对象数组 + Function Paragraphs(); + Begin + parts := getDocumentObjects(node_, 'w:p'); + r := array(); + for i:=0 to length(parts)-1 do Begin + r[i] := new TParagraph(); + r[i].name_ := 'w:p'; + r[i].node_ := parts[i].node_; + End; + return r; + End; + + ///添加新段落 + ///paragraph: TParagraph对象 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;DocumentPart对象 在posOpt之后新添加段落 + ///[styleId]: int 样式ID + ///返回TParagraph对象 + Function AddParagraph(paragraph, posOpt, styleId); + Begin + if ifString(styleId) and styleId <> '' then Begin + paragraph.Format.StyleId := styleId; + End; + addPart(posOpt, paragraph); + p := new TParagraph(); + p.node_ := paragraph.node_; + p.name_ := 'w:p'; + //复制段落字体属性 + p.CopyFormat(false); + _set_lastParagraph_(p.node_);//设置最后一个段落 + return p; + End; + + ///删除指定段落 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 第N段;posOpt段落 + ///返回:true + Function DelParagraph(posOpt); + Begin + node := findNode(posOpt, false); + if ifInt(node) then Begin + if node = 0 then + node := node_.FirstChildElement('w:p'); + else if node = -1 then + node := lastParagraph_; + End; + if not ifObj(node) then + return false; + next := node.NextElement('w:p'); + node_.DeleteChild(node); + if not ifObj(next) then + _setLastParagraph(); + return true; + End; + + ///添加标题 + ///title: string + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;DocumentPart对象 在posOpt之后新添加段落 + ///level: int 标题级别(0-9) + ///返回TParagraph对象 + Function AddHeading(title, posOpt, styleId); + Begin + paragraph := new TParagraph(); + paragraph.Run.T := title; + if ifObj(document_) then Begin + id := document_.GetBookMarkID(); + paragraph.MarkStart.Name := '_Toc' $ id; + paragraph.MarkStart.ID := id; + paragraph.MarkEnd.ID := id; + End; + return AddParagraph(paragraph, posOpt, styleId); + End; + + ///插入分页符 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;DocumentPart对象 在posOpt之后新添加段落 + ///返回TParagraph对象 + Function AddBreak(posOpt, tp); + Begin + paragraph := new TParagraph(); + if tp <> '' then + paragraph.Run.Br.Type := tp; + return AddParagraph(paragraph, posOpt); + End; + + ///word文档所有内容的文本串数组,包含段落信息 + ///返回:array(("pNode":nodeObj, "pIndex":p, "rNode":nodeObj, "rIndex":r)) + Function TextArray();override; + Begin + r := array(); + ps := getDocumentObjects(node_, 'w:p'); + for i:=0 to length(ps)-1 do Begin + pArr := ps[i].TextArray(); + if length(pArr) then Begin + update pArr set ['pIndex'] = i end; + r union= pArr; + End + else Begin + r[ length(r) ] := array('pNode':ps[i].node_, 'pIndex':i, 'rNode':nil, 'rIndex':-1);//空段落 + End; + End; + return r; + End; + + ///word文档所有表格个数 + ///返回:int + Function TablesCount(); + Begin + t := getDocumentObjects(node_, 'w:tbl'); + return length(t); + End; + + ///word文档指定表格 + ///n: int 第n个表格 + ///返回:TTable对象 + Function GetTable(i); + Begin + t := getDocumentObjects(node_, 'w:tbl'); + if i < 0 or i >= length(t) then return 0; + tbl := new TTable(t[i].node_); + return tbl; + End; + + ///创建数据表 + ///data: table,数据表 + ///[IncludeHeader: bool] 是否包括表头,默认FALSE + ///[IncludeIndex: bool] 是否自动添加索引号,默认FALSE + ///返回: tbl TTable对象 + Function CreateTable(data, IncludeHeader, IncludeIndex); + Begin + if not IsTable(data) then + raise "Invalid Data."; + fields := FieldNames(data); + if IsTable(fields) then Begin + r := nils(length(data),length(fields)); + r[:,:] := data; + data := r; + End; + if IncludeIndex then Begin + n := length(data)-1; + r := array(0->n); + data := `r | data; + End; + if IncludeHeader and IsTable(fields) then Begin + if IncludeIndex then + fields := array("Index") union fields; + data := array(fields) union data; + End; + tbl := new TTable(); + //tbl.TblPr.StyleId := 'Normal Table'; + tbl.TblPr.Width := 0; + tbl.TblPr.WidthType := 'auto'; + tbl.TblPr.Borders.Top.Val := 'single'; + tbl.TblPr.Borders.Left.Val := 'single'; + tbl.TblPr.Borders.Bottom.Val := 'single'; + tbl.TblPr.Borders.Right.Val := 'single'; + tbl.TblPr.Borders.InsideH.Val := 'single'; + tbl.TblPr.Borders.InsideV.Val := 'single'; + tbl.TblPr.CellMar.Top := 0; + tbl.TblPr.CellMar.Left := 108; + tbl.TblPr.CellMar.Bottom := 0; + tbl.TblPr.CellMar.Right := 108; + tbl.TblPr.CellMar.TopType := 'dxa'; + tbl.TblPr.CellMar.LeftType := 'dxa'; + tbl.TblPr.CellMar.BottomType := 'dxa'; + tbl.TblPr.CellMar.RightType := 'dxa'; + //tbl.TblPr.FirstColumn := 1; + //tbl.TblPr.FirstRow := 1; + //tbl.TblPr.LastColumn := 0; + //tbl.TblPr.LastRow := 0; + //tbl.TblPr.NoVBand := 1; + //tbl.TblPr.NoHBand := 0; + //tbl.TblPr.Val := '04A0'; + + width := getBlockWidth(); + [rowCount, colCount] := MSize(data); + colWidth := colCount ? integer(width / colCount) : 0; + gridArr := array(); + for i:=0 to colCount-1 do Begin + gcol := new TwGridCol(); + gcol.W := colWidth; + gridArr union= array(('name':'w:gridCol','obj':gcol,'attrEx':'','nodeType':'','attrName':'')); + End; + tbl.TblGrid.GridCol := gridArr; + + trArr := array(); + for i:=0 to length(data)-1 do Begin + tr := new TWtr(); + trArr union= array(('name':'w:tr','obj':tr,'attrEx':'','nodeType':'','attrName':'')); + tcArr := array(); + for j:=0 to colCount-1 do Begin + tc := new TCell(); + tcArr union= array(('name':'w:tc','obj':tc,'attrEx':'','nodeType':'','attrName':'')); + tc.TcPr.Width := colWidth; + tc.TcPr.Type := 'dxa'; + tc.AddText(data[i, j]); + { + tc.P.pPr.rPr.Lang := 'en-US'; + tc.P.pPr.rPr.eastAsia := 'zh-CN'; + tc.P.Run.rPr.Lang := 'en-US'; + tc.P.Run.rPr.eastAsia := 'zh-CN'; + tc.P.Run.AddText( getText(data[i, j]) ); + } + End; + tr.Tc := tcArr; + End; + tbl.TR := trArr; + return tbl; + End; + + ///插入数据表 + ///tbl: TTable对象 + ///[posOpt: 段落位置],0 在DOCX文件开头;-1 文件尾;N 在第N段之后;DocumentPart对象 在posOpt之后新添加表格 + Function InsertTable(tbl, posOpt); + Begin + addPart(posOpt, tbl); + tblBorders := class(xlsxXml).GetNode(tbl.node_, 'w:tblPr/w:tblBorders'); + tblCellMar := class(xlsxXml).GetNode(tbl.node_, 'w:tblPr/w:tblCellMar'); + if ifObj(tblBorders) or ifObj(tblCellMar) then Begin + borders := ifObj(tblBorders) ? tblBorders.Marshal() : nil; + cellmar := ifObj(tblCellMar) ? tblCellMar.Marshal() : nil; + tr := tbl.node_.FirstChildElement('w:tr'); + while ifObj(tr) do Begin + if ifObj(tblCellMar) then Begin + c := class(xlsxXml).GetNode(tr, 'w:tblPrEx/w:tblCellMar', 'first'); + class(xlsxXml).UpdateNode(c, cellmar[0]['attributes'], cellmar[0]['children']); + End; + if ifObj(tblBorders) then Begin + b := class(xlsxXml).GetNode(tr, 'w:tblPrEx/w:tblBorders', 'first'); + class(xlsxXml).UpdateNode(b, borders[0]['attributes'], borders[0]['children']); + End; + tr := tr.NextElement('w:tr'); + End; + End; + node_.Parent().SetAttribute('mc:Ignorable', 'w14 w15 wp14'); + node_.Parent().SetAttribute('xmlns:w15', 'http://schemas.microsoft.com/office/word/2012/wordml'); + //last := node_.InsertAfterChild(tbl.node_, 'element', 'w:p'); + _set_lastParagraph_(tbl.node_); + + p := new TTable(tbl.node_); + //node := node_.FirstChildElement('w:sectPr'); + //node.DeleteAttribute('w:rsidSect'); + //node.DeleteAttribute('w:rsidRPr'); + //node.DeleteAttribute('w:rsidR'); + //cols := node.FirstChildElement('w:cols'); + //cols.SetAttribute('w:num',1); + return p; + End; + + ///插入图片 + ///picture: TPicture对象 + ///[posOpt: 段落位置],0 在DOCX文件开头;-1 文件尾;N 在第N段之后;DocumentPart对象 在posOpt之后新添加表格 + Function AddPicture(picture, posOpt); + Begin + if not ifBinary(picture.Image) or length(picture.Image)=0 then + raise 'Invalid Image Data.'; + image := new TSImage(picture.Image); + xml := zipfile_.Get('word/_rels/document.xml.rels'); + files := sselect ['FileName'] from zipfile_.Files() where AnsiStartsText('word/media/image', ['FileName']) end; + for i:=0 to length(files)-1 do Begin + if zipfile_.Diff(files[i], picture.Image) = 0 then Begin + prefix := ReplaceStr(files[i], 'word/', ''); + [rid, imageFile] := class(xlsxXml).FindRelationshipRid(xml, prefix); + End; + End; + if rid = 0 then Begin + imageCnt := length(files) + 1; + imageFile := 'media/image' $ imageCnt $ '.' $ image.ExtFileName; + [rid, target] := class(xlsxXml).FindRelationshipRid(xml, ''); + rid ++; + class(xlsxXml).AddRelationshipRid(xml, imageFile, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', 'rId' $ rid); + zipfile_.Add('word/' + imageFile, picture.Image); + contentXml := zipfile_.Get('[Content_Types].xml'); + class(xlsxXml).AddDefaultContentType(contentXml, image.ExtFileName, 'image/' $ image.ExtFileName); + End; + [cx, cy] := picture.ScaledDimensions(image);//extent 元素通过其属性指定此对象的高度和宽度为 [cx,cy] ETU (英语公制单位) + //println('cx={},cy={},w={},h={}',cx,cy,image.px_width,image.px_height); + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.BlipFill.blip.Embed := 'rId' $ rid; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.BlipFill.Stretch.FillRect := 1; + picId := getPictureMaxId() + 1; + picture.Run.Drawing.WInline.ID := picId; + picture.Run.Drawing.WInline.Name := '图片 ' $ picId; + picture.Run.Drawing.WInline.Descr := picture.Descr; + picture.Run.Drawing.WInline.cNvGraphicFramePr.xmlns := 'http://schemas.openxmlformats.org/drawingml/2006/main'; + picture.Run.Drawing.WInline.cNvGraphicFramePr.noChangeAspect := 1; + picture.Run.Drawing.WInline.Graphic.xmlns := 'http://schemas.openxmlformats.org/drawingml/2006/main'; + picture.Run.Drawing.WInline.Graphic.GraphicData.uri := 'http://schemas.openxmlformats.org/drawingml/2006/picture'; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.xmlns := 'http://schemas.openxmlformats.org/drawingml/2006/picture'; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.nvPicPr.CNvPr.ID := picture.Run.Drawing.WInline.ID; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.nvPicPr.CNvPr.Name := picture.Run.Drawing.WInline.Name; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.nvPicPr.CNvPr.Descr := picture.Run.Drawing.WInline.Descr; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.nvPicPr.cNvPicPr.NodeName := 'pic:cNvPicPr'; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.nvPicPr.cNvPicPr.PicLocks := 1; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.spPr.PrstGeom.prst := 'rect'; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.spPr.PrstGeom.avLst := true; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.spPr.XFrm.Off.X := 0; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.spPr.XFrm.Off.Y := 0; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.spPr.XFrm.Ext.CX := cx; + picture.Run.Drawing.WInline.Graphic.GraphicData.Pic.spPr.XFrm.Ext.CY := cy; + picture.Run.Drawing.WInline.distR := 114300; + picture.Run.Drawing.WInline.distL := 114300; + picture.Run.Drawing.WInline.distB := 0; + picture.Run.Drawing.WInline.distT := 0; + picture.Run.Drawing.WInline.cy := cy; + picture.Run.Drawing.WInline.cx := cx; + //picture.Run.Drawing.WInline.r := 0; + //picture.Run.Drawing.WInline.b := 5080; + //picture.Run.Drawing.WInline.t := 0; + //picture.Run.Drawing.WInline.l := 0; + addPart(posOpt, picture); + + p := new TPicture(picture.node_); + _set_lastParagraph_(picture.node_); + return p; + End; + + ///文档中全部的批注信息 + ///返回:TDocComments对象 + Function Comments();overload; + Begin + t := array(); + [startCnt, endCnt, tCnt, index] := array(0, 0, 0, 0); + p := node_.FirstChildElement('w:p'); + while ifObj(p) do Begin + child := p.FirstChildElement(); + rIndex := 0; + while ifObj(child) do Begin + id := -1; + name := child.GetName(); + if name = 'w:commentRangeStart' then Begin + startCnt ++; + id := strtoint(child.GetAttribute('w:id')); + t[ tCnt++ ] := array('pNode':p, 'rNode':child, 'Name':name, 'Start':startCnt, 'End':endCnt, 'ID':id, 'pIndex':index); + End + else if name = 'w:commentRangeEnd' then Begin + endCnt ++; + id := strtoint(child.GetAttribute('w:id')); + t[ tCnt++ ] := array('pNode':p, 'rNode':child, 'Name':name, 'Start':startCnt, 'End':endCnt, 'ID':id, 'pIndex':index); + End + else if name = 'w:r' and startCnt > endCnt then Begin + t[ tCnt++ ] := array('pNode':p, 'rNode':child, 'Name':name, 'Start':startCnt, 'End':endCnt, 'ID':-1, 'pIndex':index); + End; + child := child.NextElement(); + End; + index ++; + p := p.NextElement('w:p'); + End; + return new TDocComments(t); + End; + + //返回TDocSection对象集合 + Function Sections();overload; + Begin + index := 0; + r := array(); + node := node_.FirstChildElement(); + while ifObj(node) do Begin + name := node.GetName(); + if name = 'w:sectPr' then Begin + section := new TDocSection(node, index++, zipfile_); + r[length(r)] := section; + End + else if name = 'w:p' then Begin + child := class(xlsxXml).GetNode(node, 'w:pPr/w:sectPr', false); + if ifObj(child) then Begin + section := new TDocSection(node, index++, zipfile_); + r[length(r)] := section; + End; + End; + node := node.NextElement(); + End; + return r; + End; + + //index:integer 章节索引 + //返回:指定TDocSection对象 + Function Sections(index);overload; + Begin + if index < 0 then Begin //返回文档最后一个章节(缺省章节) + node := node_.LastChild('w:sectPr'); + if ifObj(node) then + return new TDocSection(node, -1, zipfile_); + return nil; + End; + arr := Sections(); + if length(arr) >= index then + return nil; + return arr[index]; + End; + + //添加章节 + //section:TDocSection对象 + //posOpt: 位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;DocumentPart对象 在posOpt之后新添加章节 + //返回:TDocSection对象 + Function AddSection(section, posOpt);overload; + Begin + section.zipfile_ := zipfile_; + p := new TParagraph(); + p.pPr.NewChildNode( array("field":"", "name":"w:sectPr", "obj":section, "attrEx":"", "nodeType":"") ); + p := AddParagraph(p, posOpt, '');//段落对象 + return new TDocSection(p.node_.FirstChildElement('w:sectPr'), -2, zipfile_); + End; + + Function GetHeadingListImpl(docx, posOpt, UpperHeadingLevel, LowerHeadingLevel, numIds, bHeadList); + Begin + r := array(); + if ifObj(posOpt) then + pNode := posOpt.NextElement(); + else + pNode := node_.FirstChildElement(); + sectPr := new TSectPr(docx, nil); + while ifObj(pNode) do Begin + name := pNode.GetName(); + if ifarray(numIds) and name = 'w:sectPr' then + sectPr.Init(pNode); + else if name = 'w:p' then Begin + sectNode := pNode.FirstChildElement('w:sectPr'); + if ifObj(sectNode) then Begin //章节 + sectPr.Init(pNode); + End + else Begin + p := new TParagraph(pNode); + //统计数字项目编号 + numArr := array(); + ilvl := -1; + numId := ''; + if ifarray(numIds) then Begin + sectPr.Append(p); + numId := p.Format.NumPr.Value('numId'); + lvlStr := p.Format.NumPr.Value('Level'); + if numId and lvlStr then Begin + ilvl := Class(xlsxXml).SafeStrToIntDef(lvlStr, -1); + if ilvl >= 0 and ilvl < 10 then Begin + if not istable(numIds[numId]) then + numIds[numId] := array(0,0,0,0,0,0,0,0,0,0); + prev := numIds[numId, ilvl]; + if prev then Begin + for i:=ilvl+1 to 9 do + numIds[numId, i] := 0; + End; + numIds[numId, ilvl]++; + numArr := numIds[numId]; + End; + End; + End; + if bHeadList then Begin //统计大纲显示(目录) + styleId := p.Format.Value('StyleId'); + if styleId <> '' then Begin + obj := docx.StyleObject().GetStyleById(styleId); + if ifObj(obj) then Begin + level := obj.HeadingLevel(); + iLevel := Class(xlsxXml).SafeStrToIntDef(level, -1); + if iLevel+1 >= UpperHeadingLevel and iLevel+1 <= LowerHeadingLevel then Begin + r[ind]['Level'] := strtoint(level); + r[ind]['Paragraph'] := p; + r[ind]['Text'] := p.Text(); + r[ind]['numId'] := numId; //数字项目编号 + r[ind]['ilvl'] := ilvl; //级别 + r[ind]['numArr'] := numArr; //累加数字编码 + sectPr.Mark(ind);//标记段落 + ind++; + End; + End; + End; + End; + End; + End + else if ifarray(numIds) and name = 'w:tbl' then Begin + tbl := TOfficeObj('TTable'); + tbl.InitNode(pNode); + sectPr.Append(tbl); + rows := tbl.Rows(); + cols := tbl.Cols(); + for i:=1 to rows do Begin + for j:=1 to cols do Begin + cell := tbl.Cell(i, j); + [a, b] := cell.GetHeadingListImpl(docx, nil, UpperHeadingLevel, LowerHeadingLevel, numIds, false);//表格内递归查找,统计数字项目编号,但不显示在大纲中 + End; + End; + End; + pNode := pNode.NextElement(); + End; + + if ifarray(numIds) then Begin //设置页面 + for i:=0 to length(r)-1 do Begin + r[i]['pageNo'] := sectPr.GetPageNo(i); + End; + End; + return r; + End; + + Function getPictureMaxId(); + Begin + id := 0; + pNode := node_.FirstChildElement('w:p'); + while ifObj(pNode) do Begin + rNode := pNode.FirstChildElement('w:r'); + while ifObj(rNode) do Begin + node := class(xlsxXml).GetNode(rNode, 'w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blibFill/a:blib'); + if ifObj(node) then Begin + v := node.GetAttribute('r:embed'); + if v <> '' then Begin + iVal := strtoint(v); + if iVal > id then id := iVal; + End; + End; + rNode := rNode.NextElement('w:r'); + End; + pNode := pNode.NextElement('w:p'); + End; + return id; + End; + + Function addPart(posOpt, o); + Begin + node := posOpt; + if ifObj(posOpt) and (not posOpt is Class(XmlNode)) then + node := posOpt.Node(); + node := findNode(node, true); + nodeArr := o.Marshal(); + if ifObj(node) then Begin + o.node_ := node_.InsertAfterChild(node, nodeArr); //XmlNode节点对象或DocObject对象 + End + else if node = 0 then Begin + o.node_ := node_.InsertFirstChild(nodeArr); + End + else if node < 0 then Begin + o.node_ := node_.InsertEndChild(nodeArr); + End + else Begin + raise 'Invalid input param.'; + End; + End; + + Function findNode(posOpt, b); + Begin + if not ifObj(lastParagraph_) then + return 0; + if ifObj(posOpt) then + return posOpt; + if b and posOpt = 0 then Begin + return 0; + End; + if posOpt < 0 then + return lastParagraph_; + + if ifInt(posOpt) then Begin + node := node_.FirstChildElement(); + ind := 0; + while ifObj(node) do Begin + name := node.GetName(); + if name = 'w:p' or name = 'w:tbl' then + ind ++; + if ind = posOpt + ifthen(b, 0, 1) then + return node; + node := node.NextElement(); + End; + End; + if b then + return lastParagraph_; + return 0; + End; + + Function getText(t); + Begin + if not ifstring(t) then return '' $ t; + return t; + txt := ReplaceStr(t, '\t', ''); + txt := ReplaceStr(txt, '\r\n', ''); + txt := ReplaceStr(txt, '\n', ''); + return txt; + End; + + Function getBlockWidth(); + Begin + sectPr := node_.FirstChildElement('w:sectPr'); + try + width := sectPr.FirstChildElement('w:pgSz').GetAttribute('w:w'); + left := sectPr.FirstChildElement('w:pgMar').GetAttribute('w:left'); + right := sectPr.FirstChildElement('w:pgMar').GetAttribute('w:right'); + return strtoint(width) - strtoint(left) - strtoint(right); + except + End; + return strtoint(width); + End; + + Function _set_lastParagraph_(node); + Begin + if ifObj(lastParagraph_) then + lastParagraph_.BigChild(node); + else + lastParagraph_ := node; + End; + + zipfile_; + lastParagraph_; + document_; +End; + +Type TDocHeaderFooter = Class(TDocumentBody) + Function Create(rid, obj, name); + Begin + rID_ := rid; + xmlObj_ := obj; + node := xmlObj_.FirstChildElement(name); + Index := -1; + Class(TDocumentBody).Create(node); + name_ := name; + End; + + ///添加页码 + ///fmt:string,页码格式(eg:"第 {0} 页,共 {1} 页") + ///font:字体格式 + Function AddPageNumber(fmt, font); + Begin + r := array(); + fmtLen := length(fmt); + txt := ''; + while i < fmtLen do Begin + if fmt[i+1] = '{' and i + 2 <= fmtLen and fmt[i+3] = '}' then Begin + if txt <> '' then + r[ cnt++ ] := txt; + r[ cnt++ ] := fmt[i+1:i+3]; + txt := ''; + i += 3; + End + else Begin + txt += fmt[i+1]; + i ++; + End; + End; + if txt <> '' then + r[ cnt++ ] := txt; + p := TOfficeObj('TParagraph'); + class(xlsxXml).CopyRprFormat(p.pPr.rPr, font); + for i:=0 to length(r)-1 do Begin + run := p.AddRun(); + if r[i] = '{0}' then Begin //页码 + run.fldCharType := 'begin'; + class(xlsxXml).CopyRprFormat(run.rPr, font); + PageNo := p.AddRun(); + PageNo.InstrText := ' PAGE \\* MERGEFORMAT '; + PageNo.InstrTextSpace := 'preserve'; + class(xlsxXml).CopyRprFormat(PageNo.rPr, font); + run := p.AddRun(); + run.fldCharType := 'end'; + class(xlsxXml).CopyRprFormat(run.rPr, font); + End + else if r[i] = '{1}' then Begin //总页数 + run.fldCharType := 'begin'; + class(xlsxXml).CopyRprFormat(run.rPr, font); + TotalPageNo := p.AddRun(); + TotalPageNo.InstrText := ' NUMPAGES \\* MERGEFORMAT '; + TotalPageNo.InstrTextSpace := 'preserve'; + class(xlsxXml).CopyRprFormat(TotalPageNo.rPr, font); + run := p.AddRun(); + run.fldCharType := 'end'; + class(xlsxXml).CopyRprFormat(run.rPr, font); + End + else Begin + run.space := 'preserve'; + run.T := r[i]; + class(xlsxXml).CopyRprFormat(Run.rPr, font); + End; + End; + return AddParagraph(p, -1, nil); + End; + + rId_:integer; + xmlFileName_:string; + root_; + xmlObj_; +End; + +Type TDocSection = Class(DocObject, TDocSectionImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + Create(node, -1, nil); + End; + + Function Create(node, index, z);overload; + Begin + Index_ := index; + name_ := 'w:sectPr'; + node_ := node; + zipfile_ := z; + Class(TDocSectionImpl).Create(nil, name_); + End; + + ///返回指定页眉 + ///type:页眉类型,(default、evet、first) + ///default, Header for odd pages or all if no even header. + ///first, Header for first page of section. + ///even, Header for even pages of recto/verso section. + Function Header(type); + Begin + return _getHeaderFooter('w:headerReference', type); + End; + + ///返回指定页脚 + ///type:页眉类型,(default、evet、first) + ///default, Header for odd pages or all if no even header. + ///first, Header for first page of section. + ///even, Header for even pages of recto/verso section. + Function Footer(type); + Begin + return _getHeaderFooter('w:footerReference', type); + End; + + ///添加页眉 + ///type:页眉类型,(default、evet、first) + ///default, Header for odd pages or all if no even header. + ///first, Header for first page of section. + ///even, Header for even pages of recto/verso section. + Function AddHeader(type); + Begin + return _AddHeaderFooter('header', (ifNil(type) or type = '') ? 'default' : type); + End; + + ///添加页脚 + ///type:页眉类型,(default、evet、first) + ///default, Header for odd pages or all if no even header. + ///first, Header for first page of section. + ///even, Header for even pages of recto/verso section. + Function AddFooter(type); + Begin + return _AddHeaderFooter('footer', (ifNil(type) or type = '') ? 'default' : type); + End; + + Function _AddHeaderFooter(headerFooter, hfType); + Begin + if headerFooter = 'header' then Begin + name := 'w:hdr'; + type := 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/header'; + ContentType := 'application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml'; + obj := _getHeaderFooter('w:headerReference', hfType); //页眉已经存在 + fileContent := ''; + End + else Begin + name := 'w:ftr'; + type := 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer'; + ContentType := 'application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml'; + obj := _getHeaderFooter('w:footerReference', hfType); //页脚已经存在 + fileContent := ''; + End + if ifObj(obj) then return obj; + rels := zipfile_.Get('word/_rels/document.xml.rels'); + [rid, target] := class(xlsxXml).FindRelationshipRid(rels, '');//最大rId + rid ++; + files := sselect ['FileName'] from zipfile_.Files() where AnsiStartsText('word/' $ headerFooter, ['FileName']) end; + fid := length(files) + 1;//文件ID号 + target := headerFooter $ fid $ '.xml'; + class(xlsxXml).AddRelationshipRid(rels, target, type, 'rId'$rid, nil);//添加rId + PartName := '/word/' $ headerFooter $ fid $ '.xml'; + contentXml := zipfile_.Get('[Content_Types].xml'); + class(xlsxXml).AddOverrideContentType(contentXml, partName, contentType);//添加Contet_Types + fname := 'word/' $ headerFooter $ fid $ '.xml'; + zipfile_.Add(fname, fileContent);//创建页脚、页眉文件 + node := node_.InsertFirstChild('element', headerFooter = 'header' ? 'w:headerReference' : 'w:footerReference'); + node.SetAttribute('w:type', hfType); + node.SetAttribute('r:id', 'rId'$rid); + return new TDocHeaderFooter(rid, zipfile_.Get(fname), name);//返回页脚、页眉对象 + End; + + Function _getRid(key, type); + Begin + if ifNil(type) or type = '' then + type := 'default'; + node := node_.FirstChildElement(key); + while ifObj(node) do Begin + name := node.GetName(); + if name = key then Begin + if type = node.GetAttribute('w:type') then + return node.GetAttribute('r:id'); + End; + node := node.NextElement(key); + End; + return ''; + End; + + Function _getHeaderFooter(key, type); + Begin + rid := _getRid(key, type); + if rid='' then return nil; + rels := zipfile_.Get('word/_rels/document.xml.rels'); + theNode := class(xlsxXml).FindRelationship(rels, rid); + if not ifObj(theNode) then + return nil; + fname := 'word/' $ theNode.GetAttribute('Target'); + xml := zipfile_.Get(fname); + if ifObj(xml) then + return new TDocHeaderFooter(rid, xml, key = 'w:headerReference' ? 'w:hdr' : 'w:ftr'); + return nil; + End; + + Index_:integer; + zipfile_; //压缩文件对象 +End; + +//node_ -> w:p/w:r/mc:AlternateContent/mc:Choice/mc:Fallback/w:pict/v:shape/v:textbox/w:txbxContent +Type TTextBox = Class(TDocumentBody, TTextBoxImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + Class(TTextBoxImpl).Create(nil, 'w:txbxContent'); + Class(TDocumentBody).Create(node); + name_ := 'w:txbxContent'; + End; + + Function Create(pNode, name);overload; + Begin + Create(nil); + End; + + Function Init(pNode, nodeEx); + Begin + pNode_ := pNode; + NodeEx_ := nodeEx; + End; + + Function Apply();override; + Begin + data := node_.Marshal(); + NodeEx_.DeleteChildren(); + class(xlsxXml).UpdateNode(NodeEx_, data[0]['attributes'], data[0]['children']); + End; + + pNode_;// + NodeEx_;//w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:txbx/wps:txbxContent +End; + +//w:tr +Type TRow = Class(DocObject, TwTr) + Function Create(node); + Begin + node_ := node; + Class(TwTr).Create(nil, 'w:tr'); + End; + + Property Format read readFormat; + Function readFormat(); + Begin + return TrPr; + End; + + Property FormatEx read readFormatEx; + Function readFormatEx(); + Begin + return tblPrEx; + End; + + Function Apply();virtual; + Begin + arr := Marshal(); + class(xlsxXml).UpdateNode(node_, arr['attributes'], arr['children']); + End; +End; + +//w:tc +Type TCell = Class(TDocumentBody, TWTc) + Function Create();overload; + Begin + Create(nil); + End; + Function Create(node);overload; + Begin + Class(TDocumentBody).Create(node); + Create(nil, 'w:tc'); + End; + + Function Create(pNode, name);overload; + Begin + Class(TWTc).Create(pNode, 'w:tc'); + name_ := 'w:tc'; + mergeSpan_ := 0; + pPr_ := new TwpPr(); + End; + + Property Format read readFormat; + Function readFormat(); + Begin + return TcPr; + End; + + Property PFormat read readPFormat; + Function readPFormat(); + Begin + return pPr_; + End; + + Function Apply(); override; + Begin + arr := Marshal(); + class(xlsxXml).UpdateNode(node_, arr['attributes'], arr['children']); + + arr := pPr_.Marshal(); + if length(arr['attributes']) or length(arr['children']) then Begin + pNode := node_.FirstChildElement('w:p'); + while ifObj(pNode) do Begin + pPr := class(xlsxXml).GetNode(pNode, 'w:pPr', 'first'); + class(xlsxXml).UpdateNode(pPr, arr['attributes'], arr['children']); + pNode := pNode.NextElement(); + End; + End; + End; + + ///添加文字 + Function AddText(txt); + Begin + if not ifString(txt) then + lines := array('' $ txt); + else + lines := str2array(txt, '\n'); + for i:=0 to length(lines)-1 do Begin + newp := new TParagraph(); + newp.pPr.rPr.Lang := 'en-US'; + newp.pPr.rPr.eastAsia := 'zh-CN'; + newp.Run.rPr.Lang := 'en-US'; + newp.Run.rPr.eastAsia := 'zh-CN'; + newp.Run.T := lines[i]; + NewChildNode( array("field":"", "name":"w:p", "obj":newp, "attrEx":"", "nodeType":"") ); + End; + if not istable(lines) then + P.Run.T := ''; + End; + + Function Clear(); + Begin + node := node_.FirstChildElement('w:p'); + while ifObj(node) do Begin + n := node.NextElement(); + if ind = 0 then + node.DeleteChildren(); + else + node_.DeleteChild(node); + ind++; + node := n; + End; + End; + + Function Row(); + Begin + return new TRow(node_.Parent()); + End; + + Function Append(c); + Begin + ps := c.Paragraphs(); + for i:=0 to length(ps)-1 do Begin + data := ps[i].node_.Marshal(); + w := node_.InsertEndChild(data[0]); + End; + End; + + mergeSpan_:integer; + pPr_;//段落格式 +End; + +//w:tbl +Type TTable = Class(DocObject, TTableImpl) + Function Create();overload; + Begin + Create(nil); + End; + + Function Create(node);overload; + Begin + name_ := 'w:tbl'; + Class(TTableImpl).Create(nil, 'w:tbl'); + if ifObj(node) then + InitNode(node); + End; + + Function Root();override; + Begin + return node_; + End; + + Function InitNode(node); + Begin + node_ := node; + cells_ := array(); + iCol_ := 0; + row := node.FirstChildElement('w:tr'); + while ifObj(row) do Begin + col := row.FirstChildElement('w:tc'); + iCol := 0; + while ifObj(col) do Begin + c := new TCell(col); + cells_[iRow, iCol] := c; + iCol ++; + mergeSpan := _getVSpan(col);//合并单元格 + if mergeSpan > 0 then Begin + c.mergeSpan_ := mergeSpan; + for j:=1 to mergeSpan-1 do Begin + cells_[iRow, iCol] := nil; + iCol ++; + End; + End; + if iCol > iCol_ then iCol_ := iCol; + col := col.NextElement('w:tc'); + End; + iRow ++; + row := row.NextElement('w:tr'); + End; + End; + + Property Format read readFormat; + Function readFormat(); + Begin + return TblPr; + End; + + Property FormatEx read readFormatEx; + Function readFormatEx(); + Begin + return TblPr.tblpPr; + End; + + ///修改表格属性 + Function Apply(); override; + Begin + arr := Marshal(); + class(xlsxXml).UpdateNode(node_, arr['attributes'], arr['children']); + End; + + ///列数 + Function Cols(); + Begin + return iCol_; + End; + + ///行数 + Function Rows(); + Begin + return length(cells_); + End; + + ///获取单元格 + Function Cell(row, col); + Begin + if row > length(cells_) then return nil; + return cells_[row-1, col-1]; + End; + + ///设置列宽 + Function ColumnWidth(n, wth); + Begin + if n >0 and n <= length(TblGrid.GridCol) then Begin + TblGrid.GridCol[n-1]['obj'].W := wth; + for i:=0 to length(TR)-1 do Begin + r := TR[i]['obj']; + if n <= length(r.TC) then Begin + r.TC[n-1]['obj'].TcPr.Width := wth; + End; + End; + End; + End; + + ///合并单元格 + ///del: bool,是否删除其它单元格内容(只保留左上单元格内容) + Function Merge(top, left, bottom, right, del);overload; + Begin + // + // + rowCount := Rows(); + if left > right or top > bottom or left > iCol_ or top > rowCount or (left = right and top = bottom) then + return 'Invalid input param.'; + //合并其它单元格 + [left2, right2, top2, bottom2] := array(left, right, top, bottom); + //println('merge(left2, right2, top2, bottom2)={}',array(left2, right2, top2, bottom2)); + for i:=left to right do Begin + if top > 1 then Begin + c1 := Cell(top - 1, i); + c2 := Cell(top, i); + if (c2 = nil or c2.mergeSpan_ > 0) and (c1 = nil or c1.mergeSpan_ > 0) then Begin + top2 := _getTop(top - 1, i, top2); + End; + End; + + if bottom < rowCount then Begin + c1 := Cell(bottom, i); + c2 := Cell(bottom + 1, i); + if (c2 = nil or c2.mergeSpan_ > 0) and (c1 = nil or c1.mergeSpan_ > 0) then Begin + bottom2 := _getBottom(bottom + 1, rowCount, i, bottom2); + End; + End; + End; + for i:=top to bottom do Begin + if left > 1 then Begin + c1 := Cell(i, left - 1); + c2 := Cell(i, left); + if c2 = nil and (c1 = nil or c1.mergeSpan_ > 0) then + left2 := _getLeft(i, left - 1, left2); + End; + + if right < iCol_ then Begin + c1 := Cell(i, right); + c2 := Cell(i, right + 1); + if c2 = nil and (c1 = nil or c1.mergeSpan_ > 0) then + right2 := _getRight(i, right + 1, right2); + End; + End; + //println('merge(left2, right2, top2, bottom2)={}\n',array(left2, right2, top2, bottom2)); + val := right2 - left2 + 1; + theCell := Cell(top2, left2); + for row:=top2 to bottom2 do Begin + c := Cell(row, left2); + c.mergeSpan_ := val; + gridSpan := class(xlsxXml).GetNode(c.node_, 'w:tcPr/w:gridSpan', true); + gridSpan.SetAttribute('w:val', val); + node := class(xlsxXml).GetNode(c.node_, 'w:tcPr/w:vMerge', true); + node.SetAttribute('w:val', row=top2 ? 'restart' : 'continue'); + if row <> top2 then Begin + if not del then + theCell.Append(c); + c.Clear(); + End; + + for col:=left2 + 1 to right2 do Begin + c := Cell(row, col); + if ifObj(c) then Begin + if not del then + theCell.Append(c); + c.node_.Parent().DeleteChild(c.node_); + cells_[row-1, col-1] := nil; + End; + End; + End; + + return 'ok'; + End; + + ///合并单元格 + ///hcell: string,左上角坐标,eg: 'B2' + ///vcell: string,右下角坐标,eg: 'C4' + ///del: bool,是否删除其它单元格内容(只保留左上单元格内容) + Function Merge(hCell, vCell, del);overload; + Begin + [err1, left, top] := xlsx_call("CellNameToCoordinates", hCell); + [err2, right, bottom] := xlsx_call("CellNameToCoordinates", vCell); + if err1 or err2 then + return 'Invalid input Coordinates.'; + return Merge(top, left, bottom, right, del); + End; + + Function _getLeft(row, iCol, left2); + Begin + for i:=iCol downto 1 do Begin + c := Cell(row, i); + if ifObj(c) then Begin + if i < left2 then + left2 := i; + break; + End; + End; + return left2; + End; + + Function _getRight(row, iCol, right2); + Begin + for i:=iCol to iCol_ do Begin + c := Cell(row, i); + if ifObj(c) then + break; + if i > right2 then + right2 := i; + End; + return right2; + End; + + Function _getTop(top, iCol, top2); + Begin + for i:=top downto 1 do Begin + c := Cell(i, iCol); + if ifObj(c) and c.mergeSpan_ < 1 then Begin + break; + End; + if i < top2 then + top2 := i; + End; + return top2; + End; + + Function _getBottom(bottom, rowCount, iCol, bottom2); + Begin + for i:=bottom to rowCount do Begin + c := Cell(i, iCol); + if ifObj(c) and c.mergeSpan_ < 1 then Begin + break; + End; + if i > bottom2 then + bottom2 := i; + End; + return bottom2; + End; + + Function _getVSpan(node); + Begin + vMerge := class(xlsxXml).GetNode(node, 'w:tcPr/w:vMerge'); + if ifObj(vMerge) and vMerge.GetAttribute('w:val') in array('restart', 'continue') then Begin + nSpan := class(xlsxXml).GetNode(node, 'w:tcPr/w:gridSpan'); + if ifObj(nSpan) then Begin + return strtoint(nSpan.GetAttribute('w:val')); + End; + End; + return -1; + End; + + iCol_:integer; + cells_; +End; + +Type TCoreProperties = Class(DocObject) + Property Author read readAuthor write writeAuthor; + Property Category read readCategory write writeCategory; + Property Description read readDescription write writeDescription; + Property Subject read readSubject write writeSubject; + Property Title read readTitle write writeTitle; + Property Version read readVersion write writeVersion; + Property Rversion read readRversion write writeRversion; + Property KeyWords read readKeyWords write writeKeyWords; + Property Created read readCreated write writeCreated; + Property Modified read readModified write writeModified; + Property LastModifiedBy read readLastModifiedBy write writeLastModifiedBy; +private + Function readAuthor(); + Begin + return class(xlsxXml).GetNode(node_, 'dc:creator'); + End; + + Function readCategory(); + Begin + return class(xlsxXml).GetNode(node_, 'cp:category'); + End; + + Function readDescription(); + Begin + return class(xlsxXml).GetNode(node_, 'dc:description'); + End; + + Function readSubject(); + Begin + return class(xlsxXml).GetNode(node_, 'dc:subject'); + End; + + Function readTitle(); + Begin + return class(xlsxXml).GetNode(node_, 'dc:title'); + End; + + Function readVersion(); + Begin + return class(xlsxXml).GetNode(node_, 'cp:version'); + End; + + Function readRversion(); + Begin + return class(xlsxXml).GetNode(node_, 'cp:rversion'); + End; + + Function readKeyWords(); + Begin + return class(xlsxXml).GetNode(node_, 'cp:keywords'); + End; + + Function readLastModifiedBy(); + Begin + return class(xlsxXml).GetNode(node_, 'cp:lastModifiedBy'); + End; + + Function readCreated(); + Begin + return class(xlsxXml).GetNode(node_, 'dcterms:created'); + End; + + Function readModified(); + Begin + return class(xlsxXml).GetNode(node_, 'dcterms:modified'); + End; + + Function propNode(k); + Begin + n := node_.FirstChildElement(k); + if ifObj(n) then return n; + return node_.InsertEndChild('element', k); + End; + + Function writeAuthor(v); + Begin + return propNode('dc:creator').SetValue(v); + End; + + Function writeCategory(v); + Begin + return propNode('cp:category').SetValue(v); + End; + + Function writeDescription(v); + Begin + return propNode('dc:description').SetValue(v); + End; + + Function writeSubject(v); + Begin + return propNode('dc:subject').SetValue(v); + End; + + Function writeTitle(v); + Begin + return propNode('dc:title').SetValue(v); + End; + + Function writeVersion(v); + Begin + return propNode('cp:version').SetValue(v); + End; + + Function writeRversion(v); + Begin + return propNode('cp:rversion').SetValue(v); + End; + + Function writeKeyWords(v); + Begin + return propNode('cp:keywords').SetValue(v); + End; + + Function writeLastModifiedBy(v); + Begin + return propNode('cp:lastModifiedBy').SetValue(v); + End; + + Function writeCreated(v); + Begin + return propNode('dcterms:created').SetValue(class(xlsxXml).GetDatetimeStr(v)); + End; + + Function writeModified(v); + Begin + return propNode('dcterms:modified').SetValue(class(xlsxXml).GetDatetimeStr(v)); + End; +End; + +//w:latentStyles +// Attributes(w:name、w:count、w:defLockedState、w:defQFormat、w:defSemiHidden、w:defUIPriority、w:defUnhideWhenUsed) + + +//w:style +// 'w:name', 'w:aliases', 'w:basedOn', 'w:next', 'w:link', +// 'w:autoRedefine', 'w:hidden', 'w:uiPriority', 'w:semiHidden', +// 'w:unhideWhenUsed', 'w:qFormat', 'w:locked', 'w:personal', +// 'w:personalCompose', 'w:personalReply', 'w:rsid', 'w:pPr', 'w:rPr', +// 'w:tblPr', 'w:trPr', 'w:tcPr', 'w:tblStylePr' +Type TDocxStyle = Class(TDocxStyleImpl) + Function Create(); overload; + Begin + create(nil); + End; + + Function Create(node); overload; + Begin + Init(node); + Class(TDocxStyleImpl).Create(nil, 'w:style'); + End; + + Function Init(node); + Begin + if ifObj(node) then Begin + node_ := node; + wType := node.GetAttribute('w:type'); + styleId := node.GetAttribute('w:styleId'); + nameObj := node.FirstChildElement('w:name'); + if ifObj(nameObj) then + Name := nameObj.GetAttribute('w:val'); + End; + End; + + ///显示大纲级别 + Function HeadingLevel(); + Begin + node := class(xlsxXml).GetNode(node_, 'w:pPr/w:outlineLvl'); + if ifObj(node) then + return node.GetAttribute('w:val'); + return ''; + End; + + Function ReadPprFormat(); + Begin + if ifObj(pPr_) then + return pPr_; + pPr_ := Class(xlsxXml).ReadPprFormat(node_); + return pPr_; + End; + + Function ReadRprFormat(); + Begin + if ifObj(rPr_) then + return rPr_; + rPr_ := Class(xlsxXml).ReadRprFormat(node_); + return rPr_; + End; + + Function Apply(); + Begin + if ifObj(rPr_) then Begin + arr := rPr_.Marshal(); + if length(arr['attributes']) or length(arr['children']) then Begin + class(xlsxXml).UpdateNode(rPr_.Root(), arr['attributes'], arr['children']); + End; + End; + + if ifObj(pPr_) then Begin + arr := pPr_.Marshal(); + if length(arr['attributes']) or length(arr['children']) then Begin + class(xlsxXml).UpdateNode(pPr_.Root(), arr['attributes'], arr['children']); + End; + End; + End; + + node_; + pPr_; + rPr_; +End; + +Type TNumStyle = Class(TNumStyleImpl) + Function Create(); overload; + Begin + create(nil); + End; + + Function Create(node); overload; + Begin + Init(node); + Class(TNumStyleImpl).Create(nil, 'w:num'); + End; + + Function Init(node); + Begin + if ifObj(node) then Begin + node_ := node; + abstractNumId := node.GetAttribute('w:abstractNumId'); + typeNode := node.FirstChildElement('w:multiLevelType'); + if ifObj(typeNode) then + multiLevelType := typeNode.GetAttribute('w:val'); + fmtNode := class(xlsxXml).GetNode(node, 'w:lvl/w:numFmt'); + if ifObj(fmtNode) then + numFmt := fmtNode.GetAttribute('w:val'); + End; + End; + + Function Root();override; + Begin + return node_; + End; + + ///数字项目编号样式ID + Function Id(); + Begin + return abstractNumId; + End; + + ///数字项目编号字符串 + Function GetText(ilvl, arr); + Begin + if numFmt = 'bullet' then + return ''; + if not ifarray(levels_) then Begin + levels_ := array(); + node := node_.FirstChildElement('w:lvl'); + while ifObj(node) do Begin + startObj := node.FirstChildElement('w:start'); + fmtObj := node.FirstChildElement('w:numFmt'); + textObj := node.FirstChildElement('w:lvlText'); + start := ifObj(startObj) ? Class(xlsxXml).SafeStrToIntDef(startObj.GetAttribute('w:val'), 1) : 1; + fmt := ifObj(fmtObj) ? fmtObj.GetAttribute('w:val') : ''; + lvlText := ifObj(textObj) ? textObj.GetAttribute('w:val') : ''; + levels_[length(levels_)] := array('node':node, 'text':lvlText, 'numFmt':fmt, 'start':start); + node := node.NextElement('w:lvl'); + End; + End; + if ilvl < 0 or ilvl >= length(levels_) then + return ''; + str := levels_[ilvl]['text']; + for i:=ilvl downto 0 do Begin + srcFmt := '%' $ (i + 1); + destStr := _getNumStr(arr[i], levels_[i]['numFmt'], levels_[i]['start']-1); + str := ReplaceStr(str, srcFmt, destStr); + End; + return str; + End; + + Function _getNumStr(index, fmt, start); + Begin + num := index + start; + if fmt = 'decimal' or num >= 10000 then //数字项目编号 14.1.1 + return '' $ num; + //中文编号 + chNum := array('零','一','二','三','四','五','六','七','八','九','十','十一','十二','十三','十四','十五','十六','十七','十八','十九'); + if num < 20 then + return chNum[num]; + v4 := int(num/1000); + s4 := v4 ? chNum[v4] + '千' : ''; + v3 := int((num % 1000) / 100); + s3 := v3 ? chNum[v3] + '百' : (s4 <> '' ? '零' : ''); + v2 := int((num % 100) / 10); + s2 := v2 ? chNum[v2] + '十' : ((s4+s3) <> '' ? '零' : ''); + v1 := num % 10; + s1 := v1 ? chNum[v1] : ''; + if s3='零' and s2='零' then s3 := ''; + if s1='' and s2='零' then s2 := ''; + return s4 + s3 + s2 + s1; + End; + + numFmt; + node_; + levels_; +End; + +Function _getDocObject(node, name); +Begin + p := nil; + case name of + 'w:del','w:ins': + p := new TRevision(node); + 'w:p': + p := new TParagraph(); + 'w:tbl': + p := new TTable(node); + 'w:r': + p := new TRun(); + End; + if ifObj(p) then Begin + p.node_ := node; + p.name_ := name; + End; + return p; +End; + +///返回全部列表 +Function getDocumentObjects(parent, prefix); +Begin + ps := array(); + node := parent.FirstChildElement(); + while ifObj(node) do Begin + name := node.GetName(); + if length(prefix) = 0 or (ifstring(prefix) and name = prefix) or (istable(prefix) and (name in prefix)) then Begin + p := _getDocObject(node, name); + if p = nil then Begin + p := new DocObject(); + p.node_ := node; + p.name_ := name; + End; + ps[ length(ps) ] := p; + End; + node := node.NextElement(); + End; + return ps; +End; + +Function getDocumentObject(parent, prefix, index); +Begin + node := parent.FirstChildElement(); + cnt := 0; + while ifObj(node) do Begin + name := node.GetName(); + if length(prefix) = 0 or (ifstring(prefix) and name = prefix) or (istable(prefix) and (name in prefix)) then Begin + if cnt then Begin //第index个对象 + p := _getDocObject(node, name); + if ifObj(p) then Begin + return p; + End; + End; + cnt ++; + End; + node := node.NextElement(); + End; + return nil; +End; + +Function _text(r); +Begin + txt := ''; + for i:= 0 to length(r)-1 do Begin + if i and r[i]['pIndex'] > 0 and r[i]['pIndex'] <> r[i-1]['pIndex'] then + txt += '\n'; + if ifObj(r[i]['rNode']) then Begin + run := new TRun(r[i]['rNode']); + txt += run.Text(); + End; + End; + return txt; +End; + +Function _getHanging(linesCnt, pPr); +Begin + wth := pPr.LeftIndent + pPr.RightIndent; + if linesCnt = 0 then Begin + if pPr.Hanging then + wth -= pPr.Hanging; + else if pPr.FirstLineIndent then + wth += pPr.FirstLineIndent; + End; +//_dumpPpr(pPr); +//println('>>>>>行首,lines={}, wth={}', linesCnt, wth); + return wth; +End; + +Function _dumpPpr(pPr); +Begin + if not ifObj(pPr) then + return println('pPr is null'); + println('SpaceBefore={},SpaceAfter={},LineSpacing={},LineSpacingRule={},Left={},Right={},Hanging={},FirstLineIndent={}', + pPr.SpaceBefore, pPr.SpaceAfter, pPr.LineSpacing,pPr.LineSpacingRule,pPr.LeftIndent,pPr.RightIndent,pPr.Hanging,pPr.FirstLineIndent); +End; + +Function _dumpRpr(rPr); +Begin + if not ifObj(rPr) then + return println('rPr is null'); + println('sz={},szCs={},hint={},eastAsia={}', + rPr.Size,rPr.szCs,rPr.rFont.hint,rPr.rFont.eastAsia); +End;/////////////////////////////////////////////////////////////////////////////////////////// +///XLSX文档实现 + +Type TGradient = class(TGradientImpl) + + Function Create(); + Begin + Class(TGradientImpl).Create(); + End; + + Function HandleAttrs(); override; + Begin + case Shading of + 0: degree := 90; + 1: degree := 270; + 2: degree := 90; + 3: degree := nil; + 4: degree := 180; + 5: degree := nil; + 6: degree := 45; + 7: degree := 225; + 8: degree := 45; + 9: degree := 135; + 10: degree := 315; + 11: degree := 135; + 12: + begin + degree := nil; + type := "path"; + end + 13: + begin + degree := nil; + type := "path"; + left := 1; + right := 1; + end + 14: + begin + degree := nil; + type := "path"; + top := 1; + bottom := 1; + end + 15: + begin + degree := nil; + type := "path"; + left := 1; + right := 1; + top := 1; + bottom := 1; + end + 16: + begin + degree := nil; + type := "path"; + left := 0.5; + right := 0.5; + top := "0.5"; + bottom := 0.5; + end + end + End + + Function HandleChildren(); override; + Begin + setColor(); + End + + Function GetAttrs(); override; + Begin + HandleAttrs(); + return array( + ('degree', 'degree', degree), + ('type', 'type', type), + ('left', 'left', left), + ('right', 'right', right), + ('top', 'top', top), + ('bottom', 'bottom', bottom), + ) union ExtAttr; + End + + Function GetChildren(); override; + Begin + HandleChildren(); + return array( + ('field': 'stop', 'name': 'stop', 'obj': topPosition, 'attrEx': '', 'nodeType': '', 'attrName': ''), + ('field': 'stop', 'name': 'stop', 'obj': middlePosition, 'attrEx': '', 'nodeType': '', 'attrName': ''), + ('field': 'stop', 'name': 'stop', 'obj': bottomPosition, 'attrEx': '', 'nodeType': '', 'attrName': ''), + ) union ExtNodes; + End + +private + + Function setColor(); + Begin + if ifnil(Shading) then return; + topPosition := new TStop(); + topPosition.Position := 0; + bottomPosition := new TStop(); + bottomPosition.Position := 1; + middlePosition := new TStop(); + + if not ifnil(Color1) then topPosition.Color := Color1; + else topPosition.ThemeColor := ThemeColor1 ? : "0"; + + if Shading in array(2, 5, 8, 11) then + begin + middlePosition.Position := 0.5; + if not ifnil(Color2) then middlePosition.Color := Color2; + else middlePosition.ThemeColor := ThemeColor2 ? : "0"; + if not ifnil(Color1) then bottomPosition.Color := Color1; + else bottomPosition.ThemeColor := ThemeColor1 ? : "0"; + end + else begin + if not ifnil(Color2) then bottomPosition.Color := Color2; + else bottomPosition.ThemeColor := ThemeColor2 ? : "0"; + end + End + +private + // Attributes + type; + degree; + left; + right; + top; + bottom; + + // Nodes + topPosition; + bottomPosition; + middlePosition; + +End + diff --git a/funcext/TSOffice/TSDocxFile.tsf b/funcext/TSOffice/TSDocxFile.tsf new file mode 100644 index 0000000..ad11d9d --- /dev/null +++ b/funcext/TSOffice/TSDocxFile.tsf @@ -0,0 +1,420 @@ +Type TSDocxFile = Class + ///Version: V1.0 2022-09-20 + ///适用于 Microsoft Word docx格式文件 + ///纯TSL模块实现 + ///Word(docx)文件读写接口 + + ///缺省构造函数 + Function Create(); overload; + Begin + init(); + End; + + ///构造函数,打开已经存在的docx文件 + ///alias: string,文件目录别名 + ///fname: string,文件名 + Function Create(alias, fname); overload; + Begin + init(); + OpenFile(alias, fname); + End; + + Function Destory(); + Begin + End; + + Function init(); + Begin + zipfile_ := new ZipFile(); + xml_ := new xlsxXml(); + End; + + ///打开docx文件 + ///alias: string,文件目录别名 + ///fname: string,文件名 + ///返回:[err, errmsg] + Function OpenFile(alias, fname); + Begin + if not ifObj(zipfile_) then return array(-1, 'Create ZipFile object fail.'); + [err, errmsg] := zipfile_.Open(alias, fname); + if err=0 then Begin + document_ := new docxDocument(zipfile_, xml_); + End; + return array(err, errmsg); + End; + + ///新建docx文件 + ///返回:[err, info] + Function NewFile(); + Begin + path := GetPath(); + if path[1] = '/' then + defaultFileName := path + '/funcext/TSOffice/template/default.docx'; + else + defaultFileName := path + '\\funcext\\TSOffice\\template\\default.docx'; + return OpenFile('', defaultFileName); + End; + + ///保存文件 + ///返回: [err, info] + Function Save(); + Begin + return zipfile_.Save(); + End; + + ///另存为 + ///alias: string,文件目录别名 + ///fname: string,文件名 + ///返回: [err, info] + Function SaveAs(alias, fname); + Begin + return zipfile_.Save(alias, fname); + End; + + ///真实文件名 + ///返回:string + Function FileName(); + Begin + return zipfile_.FileName(); + End; + + ///word文档所有段落 + ///返回:TParagraph对象数组 + Function Paragraphs(); + Begin + return document_.Body().Paragraphs(); + End; + + ///添加新段落 + ///paragraph: TParagraph对象 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加段落 + ///[styleId]: 样式ID(integer或string) + ///返回TParagraph对象 + Function AddParagraph(paragraph, posOpt, styleId); + Begin + return document_.Body().AddParagraph(paragraph, posOpt, styleId); + End; + + ///添加标题 + ///title: string + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加段落 + ///level: int 标题级别(0-9) + ///返回TParagraph对象 + Function AddHeading(title, posOpt, level); + Begin + styleName := level = 0 ? 'Title' : 'Heading ' $ level; + style := StyleObject().GetStyle(styleName); + if not ifObj(style) and ifInt(level) and level >= 0 and level <= 9 then + style := StyleObject().AddDefaultStyle(GetPath(), styleName); + return document_.Body().AddHeading(title, posOpt, ifObj(style) ? style.StyleId : nil); + End; + + ///插入分页符 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加段落 + ///返回TParagraph对象 + Function AddPageBreak(posOpt); + Begin + return document_.Body().AddBreak(posOpt, 'page'); + End; + + ///插入换行符 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加段落 + ///返回TParagraph对象 + Function AddLineBreak(posOpt); + Begin + return document_.Body().AddBreak(posOpt, ''); + End; + + ///插入分栏符 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加段落 + ///返回TParagraph对象 + Function AddColumnBreak(posOpt); + Begin + return document_.Body().AddBreak(posOpt, 'column'); + End; + + ///删除指定段落 + ///posOpt: 段落位置,0 DOCX文件开头;-1 文件尾;N 第N段;posOpt段落 + ///返回:true + Function DelParagraph(posOpt); + Begin + return document_.Body().DelParagraph(posOpt); + End; + + ///word文档所有内容的文本串 + ///返回:string + Function Text(); + Begin + return document_.Body().Text(); + End; + + ///word文档所有内容的文本串数组,包含段落信息 + ///返回:array(("pNode":nodeObj, "pIndex":p, "rNode":nodeObj, "rIndex":r)) + Function TextArray(); + Begin + return document_.Body().TextArray(); + End; + + ///返回:Boby对象 + Function Body(); + Begin + return document_.Body(); + End; + + ///word文档所有表格个数 + ///返回:int + Function TablesCount(); + Begin + return document_.Body().TablesCount(); + End; + + ///word文档指定表格 + ///n: int 第n个表格 + ///返回:TTable对象 + Function GetTable(n); + Begin + return document_.Body().GetTable(n); + End; + + ///创建数据表 + ///data: table,数据表 + ///[IncludeHeader: bool] 是否包括表头,默认FALSE + ///[IncludeIndex: bool] 是否自动添加索引号,默认FALSE + ///返回: TTable对象 + Function CreateTable(data, IncludeHeader, IncludeIndex); + Begin + return document_.Body().CreateTable(data, IncludeHeader, IncludeIndex); + End; + + ///插入数据表 + ///tbl: TTable对象 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加表格 + ///返回: TTable对象 + Function InsertTable(tbl, posOpt); + Begin + return document_.Body().InsertTable(tbl, posOpt); + End; + + ///返回CoreProperties对象 + Function Properties(); + Begin + core := TOfficeObj('TCoreProperties'); + core.node_ := zipfile_.Get('docProps/core.xml').FirstChildElement('cp:coreProperties'); + return core; + End; + + ///返回TDocSection集合 + Function Sections();overload; + Begin + return document_.Body().Sections(); + End; + + ///提供对节和页面设置设置的访问 + ///还提供对页眉和页脚的访问 + ///index:integer 章节索引 + ///返回:TDocSection对象 + Function Sections(index);overload; + Begin + return document_.Body().Sections(index); + End; + + ///添加章节 + ///session:TDocSection对象 + ///posOpt: 位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加章节 + ///返回:TDocSection对象 + Function AddSection(session, posOpt);overload; + Begin + return document_.Body().AddSection(session, posOpt); + End; + + ///插入图片 + ///picture: TPicture对象 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加图片 + ///返回:TPicture对象 + Function AddPicture(picture, posOpt); + Begin + return document_.Body().AddPicture(picture, posOpt); + End; + + ///插入图表 + ///chart:TChart对象 + ///posOpt: 段落位置,0 在DOCX文件开头;-1 文件尾;N 在第N段之后;XmlNode节点对象或DocObject对象 在posOpt之后新添加图表 + ///返回: TChart对象 + Function AddChart(chart, posOpt); + Begin + o := new TDocxChart(self, chart); + p := TOfficeObj('TParagraph'); + p.Format.rPr.Lang := 'zh-CN'; + p := AddParagraph(p, posOpt, nil); + chart.ChartNode := p.node_; + p.Node.InsertEndChild(o.GetInnerXml()); + return chart; + End; + + ///文档中全部的Chart图 + ///返回:TChart对象数组 + Function GetCharts();overload; + Begin + r := array(); + uri := 'w:p/w:r/w:drawing/wp:inline/a:graphic/a:graphicData/c:chart'; + ps := Paragraphs(); + for i:=0 to length(ps)-1 do Begin + node := class(xlsxXml).GetNode(ps[i].node_, uri); + if ifObj(node) then Begin + chart := TOfficeObj('TChart'); + chart.Init(self, ps[i].node_, node); + r[length(r)] := chart; + End; + End; + return r; + End; + + ///文档中全部的批注信息 + ///返回:DocComments对象 + Function Comments(); + Begin + return document_.Body().Comments(); + End; + + ///创建新的批注对象 + ///返回:TDocComment对象 + Function NewComment(author, txt); + Begin + file := 'word/comments.xml'; + files := zipfile_.Files(); + isexist := vselect thisrowindex from files where ['FileName']=file end; + if ifnil(isexist) then Begin + zipfile_.Add(file, ' +'); + rels := 'word/_rels/document.xml.rels'; + xmlfile := zipfile_.Get(rels); + [rId, target] := class(xlsxXml).FindRelationshipRid(xmlfile, ''); + rId ++; + class(xlsxXml).AddRelationshipRid(xmlfile, 'comments.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', 'rId' $ rId); + contentType := zipfile_.Get('[Content_Types].xml'); + class(xlsxXml).AddOverrideContentType(contentType, '/word/comments.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml'); + End + xmlfile := zipfile_.Get(file); + id := 0; + node := xmlfile.FirstChildElement('w:comments').FirstChildElement('w:comment'); + while ifObj(node) do Begin + wId := node.GetAttribute('w:id'); + if strtoint(wId) >= id then + id := strtoint(wId) + 1; + node := node.NextElement('w:comment'); + End; + c := TOfficeObj('TDocComment'); + c.p.Run.T := txt; + c.Author := author; + c.ID := id; + xmlfile.FirstChildElement('w:comments').InsertEndChild(c.Marshal()); + return c; + End; + + ///格式刷:复制段落格式(包括字体格式) + ///fromParagraph:源段落 + Function CopyFormat(fromParagraph); + Begin + selectPrargraph_ := fromParagraph; + End; + + ///格式刷:将源段落格式(包括字体格式),刷到目标格式 + ///toParagraph:目标段落 + Function PasteFormat(toParagraph); + Begin + pPr := ifObj(selectPrargraph_) ? selectPrargraph_.node_.FirstChildElement('w:pPr') : nil; + if not ifObj(pPr) then Begin //格式为空,清除目标段落所有格式 + toParagraph.ClearFormat();//清除段落格式、字体格式 + return; + End; + rPr := pPr.node_.FirstChildElement('w:rPr'); + + //复制段落格式 + pPr2 := toParagraph.node_.FirstChildElement('w:pPr'); + if ifObj(pPr2) then + pPr2.DeleteChildren(); + else + pPr2 := toParagraph.node_.InsertFirstChild('element', 'w:pPr'); + arr := pPr.Marshal(); + class(xlsxXml).UpdateNode(pPr2, arr[0]['attributes'], arr[0]['children']); + + //复制字体格式 + if ifObj(rPr) then + toParagraph.SetFormat(rPr, true); + else Begin //清除字体格式 + runs := toParagraph.GetRuns(); + for i:=0 to length(runs)-1 do + runs[i].ClearFormat(); + End; + End; + + ///添加目录 + ///[posOpt: 段落位置],在posOpt之后新添加目录(否则在首页添加) + ///UpperHeadingLevel:标题最高级别 + ///LowerHeadingLevel:标题最低级别 + /// 使用 UpperHeadingLevel 属性可设置起始标题级别(最高)。例如,若要设置 TOC 域语法 {TOC \o "1-3"},可将 LowerHeadingLevel 属性设为 3,并将 UpperHeadingLevel 属性设为 1。 + ///因为word、wps、openoffice等软件对于页码的计算各不相同,本功能不直接设置页码,需要用相关客户端软件打开文件后,更新目录域。 + Function AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); + Begin + content := new TTableContent(self); + content.SetDefaultFormat(); //缺省目录格式 + node := posOpt; + if ifObj(posOpt) and not (posOpt is Class(XmlNode)) then + node := posOpt.Node(); + content.Add(node, UpperHeadingLevel, LowerHeadingLevel); //标题级别 + if ifObj(node) then + content.node_ := document_.Body().node_.InsertAfterChild(node, content.Marshal()); + else + content.node_ := document_.Body().node_.InsertFirstChild(content.Marshal()); + AddPageBreak(content.node_); + return content; + End; + + ///获取全部标题列表 + ///UpperHeadingLevel:标题最高级别 + ///LowerHeadingLevel:标题最低级别 + ///返回:array((("Level":level,"Paragraph":"object","Text":title)); + Function GetHeadingList(UpperHeadingLevel, LowerHeadingLevel); + Begin + return document_.Body().GetHeadingListImpl(self, UpperHeadingLevel, LowerHeadingLevel, nil, true); + End; + + ///返回Document对象 + Function Document(); + Begin + return document_; + End; + + ///返回:TDocxStyles对象 + Function StyleObject(); + Begin + if not ifObj(styleObj_) then + styleObj_ := new TDocxStyles(self); + return styleObj_; + End; + + ///返回:TNumbering对象 + Function NumberingObject(); + Begin + if not ifObj(numberingObj_) then + numberingObj_ := new TNumbering(self); + return numberingObj_; + End; + + Function ZipObject(); + Begin + return zipfile_; + End; + + Function GetPath(); + Begin + return ExtractFileDir(ExtractFileDir(PluginPath())); + End; +private + zipfile_; //压缩文件对象 + document_; //Document对象 + xml_; //xlsxXml对象 + styleObj_; + numberingObj_; + selectPrargraph_;//被选中的段落 +End; diff --git a/funcext/TSOffice/TSExcelFile.tsf b/funcext/TSOffice/TSExcelFile.tsf index 0fedc5f..37758e2 100644 --- a/funcext/TSOffice/TSExcelFile.tsf +++ b/funcext/TSOffice/TSExcelFile.tsf @@ -28,50 +28,33 @@ Type TSExcelFile = Class Function init(); Begin zipfile_ := new ZipFile(); - xml_ := new xlsxXml(); End; ///打开excel文件 ///alias: string,文件目录别名 ///fname: string,文件名 - ///返回:[err, errmsg] + ///返回: [err, errmsg] Function OpenFile(alias, fname); Begin if not ifObj(zipfile_) then return array(-1, 'Create ZipFile object fail.'); [err, errmsg] := zipfile_.Open(alias, fname); if err=0 then Begin - workbook_ := new xlsxWorkBook(zipfile_, xml_); + workbook_ := new xlsxWorkBook(zipfile_); workbook_.Load(); End; return array(err, errmsg); End; ///新建excel文件 - ///返回:[err, info] + ///返回: [err, info] Function NewFile(); Begin path := ExtractFileDir(ExtractFileDir(PluginPath())); -{$IFNDEF Win32} - defaultFileName := path + '\\funcext\\TSOffice\\default.xlsx'; -{$ELSE} - defaultFileName := path + '/funcext/TSOffice/default.xlsx'; -{$ENDIF} - [err, errinfo] := OpenFile('', defaultFileName); - if not err then return array(err, errinfo); - - if not ifObj(zipfile_) then return array(-1, 'Create ZipFile object fail.'); - zipfile_.Add(xml_.GetFileName('rels'), xml_.XmlHeader() + xml_.GetTemplate('rels')); - zipfile_.Add(xml_.GetFileName('docProps_app'), xml_.XmlHeader() + xml_.GetTemplate('docProps_app')); - zipfile_.Add(xml_.GetFileName('docProps_core'), xml_.XmlHeader() + xml_.GetTemplate('docProps_core')); - zipfile_.Add(xml_.GetFileName('workbook_rels'), xml_.XmlHeader() + xml_.GetTemplate('workbook_rels')); - zipfile_.Add(xml_.GetFileName('theme1'), xml_.XmlHeader() + xml_.GetTemplate('theme1')); - zipfile_.Add(xml_.GetFileName('sheet1'), xml_.XmlHeader() + xml_.GetTemplate('sheet1')); - zipfile_.Add(xml_.GetFileName('styles'), xml_.XmlHeader() + xml_.GetTemplate('styles')); - zipfile_.Add(xml_.GetFileName('workbook'), xml_.XmlHeader() + xml_.GetTemplate('workbook')); - zipfile_.Add(xml_.GetFileName('Content_Types'), xml_.XmlHeader() + xml_.GetTemplate('Content_Types')); - workbook_ := new xlsxWorkBook(zipfile_, xml_); - workbook_.Load(); - return array(0, 'ok'); + if path[1] = '/' then + defaultFileName := path + '\\funcext\\TSOffice\\template\\default.xlsx'; + else + defaultFileName := path + '/funcext/TSOffice/template/default.xlsx'; + return OpenFile('', defaultFileName); End; ///保存文件 @@ -91,14 +74,14 @@ Type TSExcelFile = Class End; ///真实文件名 - ///返回:string + ///返回: string Function FileName(); Begin return zipfile_.FileName(); End; ///获取工作表列表 - ///返回: arry('Sheet1','Sheet2') + ///返回: array('Sheet1','Sheet2') Function GetSheets(); Begin return workbook_.GetSheets(); @@ -111,21 +94,22 @@ Type TSExcelFile = Class return workbook_.GetSheetsCount(); End; - ///获取工作表名 - ///index: int,工作表索引 - ///返回: [err, sheetname:string] - Function GetSheetName(index); - Begin - return workbook_.GetSheets()[index]; - End; - ///设置工作表名 ///sourceName: string, 原工作表名 - ///destName: string,目标工作表名 - ///返回:[err, errinfo] + ///destName: string,目标工作表名 + ///返回: [err, errinfo] Function SetSheetName(sourceName, destName); Begin - return workbook_.SetSheetName(sourceName, destName); + return workbook_.SetSheetName(sourceName, destName); + End; + + ///获取工作表名 + ///index: int,工作表索引 + ///返回: string + Function GetSheetName(index); + Begin + name := workbook_.GetSheets()[index]; + return ifString(name) ? name : ''; End; ///创建新sheet @@ -146,22 +130,20 @@ Type TSExcelFile = Class ///获取总列数 ///sheet: string,工作表名称 - ///返回: [err, TotalCols:int] + ///返回: int Function TotalCols(sheet); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return array(0, o.TotalCols()); - return array(-1, ''); + if ifObj(o) then return o.TotalCols(); End; ///获取总行数 ///sheet: string,工作表名称 - ///返回: [err, TotalRows:int] + ///返回: int Function TotalRows(sheet); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return array(0, o.TotalRows()); - return array(-1, ''); + if ifObj(o) then return o.TotalRows(); End; ///获取单元格的值 @@ -172,7 +154,7 @@ Type TSExcelFile = Class Begin o := workbook_.GetSheetObj(sheet); if ifObj(o) then return o.GetCellValue(axis); - return array(-1, ''); + return class(ErrorMessage).Fail(); End; ///设置单元格的值 @@ -185,12 +167,10 @@ Type TSExcelFile = Class /// 属性t:单元格数据类型,不设置的话,数据类型为val的数据类型; /// t ->('s' 共享字符串、'b' bool 类型、'e' 错误类型、'inlineStr' 内联字符串类型、nil 数字类型、'str' 公式类型) /// 属性s:单元格样式 - ///返回: [err, info] Function SetCellValue(sheet, axis, val, opt); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return array(0, o.SetCellValue(axis, val, opt)); - return array(-1, ''); + if ifObj(o) then return o.SetCellValue(axis, val, opt); End; ///获取富文本格式 @@ -201,50 +181,44 @@ Type TSExcelFile = Class Begin o := workbook_.GetSheetObj(sheet); if ifObj(o) then return o.GetCellValue(axis, 'RichText'); - return array(-1, ''); + return class(ErrorMessage).Fail(); End; ///设置富文本格式 ///sheet: string,工作表名称 ///axis: string,单元格,如"A7" - ///richtext: string,xml串或富文本对象TSOffice('TRichText') - ///返回: [err, info] + ///richtext: string,xml串或富文本对象TSOfficeObj('TRichText') Function SetCellRichText(sheet, axis, richtext); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then Begin + if ifObj(o) then begin if ifObj(richtext) then - richtext := class(xlsxXml).Dom2Xml(richtext.Marshal()); - return array(0, o.SetCellValue(axis, richtext, array('t':'s'), 'RichText')); - End; - return array(-1, 'The Sheet is not exist.'); + xml := class(xlsxXml).Dom2Xml(richtext.Marshal()); + return o.SetCellValue(axis, xml, array('t':'s'), 'RichText'); + end End; ///清空单元格 ///sheet: string,工作表名称 - ///[TopLeft: string],左上角坐标,可选参数 - ///[BottomRight: string],右下角坐标,可选参数, + ///[topLeft: string],左上角坐标,可选参数 + ///[bottomRight: string],右下角坐标,可选参数, /// 用法1:ClearCell(); //Clear整个sheet /// 用法2:ClearCell('A2'); //Clear 'A2'单元格 /// 用法3:ClearCell('A5', 'D8'); //Clear矩形区间所有单元格 - ///返回: [err, info] - Function ClearCell(sheet, TopLeft, BottomRight); + Function ClearCell(sheet, topLeft, bottomRight); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return array(0, o.ClearCell(TopLeft, BottomRight)); - return array(-1, ''); + if ifObj(o) then o.ClearCell(topLeft, bottomRight); End; ///设置公式 ///sheet: string,工作表名称 ///axis: string,单元格,如"A7" ///formula: string,公式 - ///返回: [err, info] Function SetCellFormula(sheet, axis, formula); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return o.SetCellFormula(axis, formula); - return array(-1, ''); + if ifObj(o) then o.SetCellFormula(axis, formula); End; ///获取公式 @@ -255,25 +229,24 @@ Type TSExcelFile = Class Begin o := workbook_.GetSheetObj(sheet); if ifObj(o) then return o.GetCellFormula(axis); - return array(-1, ''); + return class(ErrorMessage).Fail(); End; ///按行赋值 ///sheet: string,工作表名称 ///axis: string,起始坐标,如: "A4" ///slice: array(),一维数组array(1,2,3,2,1,"hello") - ///返回: [err, info] Function SetSheetRow(sheet, axis, slice); Begin [err, col, row] := CellNameToCoordinates(axis); - if err then - return array(err, col); - for i:=0 to length(slice)-1 do Begin - [err, cell] := CoordinatesToCellName(col + i, row); - //println('{}->{}',cell,slice[i]); - SetCellValue(sheet, cell, slice[i]); - End; - return array(0, 'ok'); + if not err then + begin + for i:=0 to length(slice)-1 do + begin + [err, cell] := CoordinatesToCellName(col + i, row); + SetCellValue(sheet, cell, slice[i]); + end + end End; ///插入数据表 @@ -298,9 +271,7 @@ Type TSExcelFile = Class if IncludeIndex then Begin fields := array("Index") union fields; End; - [err, info] := SetSheetRow(sheet, axis, fields); - if err then - return array(err, info); + SetSheetRow(sheet, axis, fields); rowNum ++; End; if IncludeIndex then Begin @@ -317,8 +288,7 @@ Type TSExcelFile = Class if err then return array(err, cell); t := sselect * from data where thisrowindex = i End; - //PrintLn("cell={},data={}->{}",cell, data[i],t); - [err, info] := SetSheetRow(sheet, cell, t); + SetSheetRow(sheet, cell, t); if err then return array(err, info); End; @@ -327,20 +297,18 @@ Type TSExcelFile = Class ///读取数据表 ///sheet: string,工作表名称 - ///TopLeft: string,左上角坐标,如: "A4" - ///BottomRight: string,右下角坐标,如: "B8",为空获取从TopLeft开始的整张表 - ///返回: [err, data:table] - Function GetTable(sheet, TopLeft, BottomRight); + ///topLeft: string,左上角坐标,如: "A4" + ///bottomRight: string,右下角坐标,如: "B8",为空获取从topLeft开始的整张表 + ///返回: table + Function GetTable(sheet, topLeft, bottomRight); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return array(0, o.Import(TopLeft, BottomRight)); - return array(-1, ''); + if ifObj(o) then return o.Import(topLeft, bottomRight); End; ///插入列,在指定列前插入空白列 ///sheet: string,工作表名称 ///col: string 列名,如: "D" - ///返回: [err, info] Function InsertCol(sheet, col); Begin return workbook_.InsertCol(sheet, col); @@ -349,7 +317,6 @@ Type TSExcelFile = Class ///插入行,在指定行前插入空白行 ///sheet: string,工作表名称 ///row: int - ///返回: [err, info] Function InsertRow(sheet, row); Begin return workbook_.InsertRow(sheet, row); @@ -358,7 +325,6 @@ Type TSExcelFile = Class ///删除列 ///sheet: string,工作表名称 ///col: string,如: "D" - ///返回: [err, info] Function RemoveCol(sheet, col); Begin return workbook_.RemoveCol(sheet, col); @@ -367,7 +333,6 @@ Type TSExcelFile = Class ///删除行 ///sheet: string,工作表名称 ///row: int - ///返回: [err, info] Function RemoveRow(sheet, row); Begin return workbook_.RemoveRow(sheet, row); @@ -376,8 +341,7 @@ Type TSExcelFile = Class ///设置行高度 ///sheet: string,工作表 ///row: int,行 - ///height: double - ///返回: [err, info] + ///height: double,行高[0-409] Function SetRowHeight(sheet, row, height); Begin return workbook_.SetRowHeight(sheet, row, height); @@ -386,7 +350,7 @@ Type TSExcelFile = Class ///获取行高度 ///sheet: string,工作表 ///row: int,行 - ///返回: [err, info] + ///返回: double Function GetRowHeight(sheet, row); Begin return workbook_.GetRowHeight(sheet, row); @@ -396,8 +360,7 @@ Type TSExcelFile = Class ///sheet: string,工作表 ///startcol: string,开始列,如: "A" ///endcol: string,结束列,如: "D" - ///width: double - ///返回: [err, info] + ///width: double,列宽[0-255] Function SetColWidth(sheet, startCol, endCol, width); Begin return workbook_.SetColWidth(sheet, startCol, endCol, width); @@ -405,8 +368,8 @@ Type TSExcelFile = Class ///获取列宽度 ///sheet: string,工作表 - ///col: int,列 - ///返回: [err, info] + ///col: string,列 + ///返回: double Function GetColWidth(sheet, col); Begin return workbook_.GetColWidth(sheet, col); @@ -414,32 +377,29 @@ Type TSExcelFile = Class ///设置工作表默认列宽 ///sheet: string,工作表 - ///width:double - ///返回: [err, info] + ///width: double Function SetSheetDefaultColWidth(sheet, width); Begin return workbook_.SetSheetDefaultColWidth(sheet, width); - End + End; ///获取工作表默认列宽 ///sheet: string,工作表 - ///返回: [err, width] + ///返回: double Function GetSheetDefaultColWidth(sheet); Begin return workbook_.GetSheetDefaultColWidth(sheet); - End + End; ///添加批注 ///sheet: string,工作表名称 ///axis: string,单元格,如"A7" ///Author:string ///comment: string - ///返回: [err, info] Function AddComment(sheet, axis, Author, comment); Begin o := getOj(sheet, 'xlsxComment'); - if not ifObj(o) then return array(1, 'The sheet is not exist.'); - return o.AddComment(axis, Author, comment); + if ifObj(o) then o.AddComment(axis, Author, comment); End; ///添加图表 @@ -540,57 +500,49 @@ Type TSExcelFile = Class Function NewStyle(style); Begin styleObj := new xlsxStyles('', self); - return array(0, styleObj.GetStyleId(style)); - End + return styleObj.GetStyleId(style); + End; ///设置单元格样式 ///sheet: string,工作表名称 - ///TopLeft: string,左上角坐标 - ///BottomRight: string,右下角坐标 + ///topLeft: string,左上角坐标 + ///bottomRight: string,右下角坐标 ///styleid: string,样式Id - ///返回: [err, info] - Function SetCellStyle(sheet, TopLeft, BottomRight, styleid); + Function SetCellStyle(sheet, topLeft, bottomRight, styleid); Begin o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return array(0, o.SetCellStyle(TopLeft, BottomRight, styleid)); - return array(-1, ''); + if ifObj(o) then return o.SetCellStyle(topLeft, bottomRight, styleid); End; ///获取单元格样式Id,获取到的Id可以在复制单元格样式时,作为调用 SetCellValue、或SetCellStyle 函数的参数使用。 ///sheet: string,工作表名称 ///axis: string,单元格,如"A7" - ///返回: [err, datastyle: int] + ///返回: styleId: string Function GetCellStyle(sheet, axis); Begin - o := workbook_.GetSheetObj(sheet); - if ifObj(o) then return array(0, o.GetCellStyle(axis)); - return array(-1, 'The sheet is not exist.'); + return workbook_.GetCellStyle(sheet, axis); End; ///设置工作表页眉页脚 - ///sheet:string,工作表名称 - ///headerFooter: xlsxHeaderFooter对象 - ///返回:[err, info] + ///sheet: string,工作表名称 + ///headerFooter: THeaderFooter对象 Function SetSheetHeaderFooter(sheet, headerFooter); Begin o := getOj(sheet, 'xlsxHeaderFooter'); - if not ifObj(o) then return array(0, 'HeaderFooter对象不存在'); - o.SetHeaderFooter(headerFooter); - return array(1, ''); - End + if ifObj(o) then o.SetHeaderFooter(headerFooter); + End; ///设置工作表可见性 ///sheet: string, 工作表名称 - ///visible: bool - ///返回:[err, info] + ///visible: boolean Function SetSheetVisible(sheet, visible); Begin return workbook_.SetSheetVisible(sheet, visible); - End + End; ///获取工作表可见性 ///sheet: string,工作表名称 - ///返回: [err, visibility: bool] + ///visibility: boolean Function GetSheetVisible(sheet); Begin return workbook_.GetSheetVisible(sheet); @@ -599,35 +551,33 @@ Type TSExcelFile = Class ///设置行可见性 ///sheet: string,工作表 ///row: int,行 - ///visible: bool - ///返回: [err, info] + ///visible: boolean Function SetRowVisible(sheet, row, visible) Begin return workbook_.SetRowVisible(sheet, row, visible); - End + End; ///获取工作表行可见性 ///sheet: string,工作表名称 ///row: int, 行 - ///返回: [err, visible:int] + ///返回: [err, visible:boolean] Function GetRowVisble(sheet, row); Begin return workbook_.GetRowVisble(sheet, row); - End + End; ///设置列可见性 ///sheet: string,工作表 ///col: string,列,如:'A' - ///visible: bool - ///返回: [err, info] + ///visible: boolean Function SetColVisible(sheet, col, visible) Begin [err, col] := ColumnNameToNumber(col); - if err then return array(-1, col); + if err then return "Col error."; return workbook_.SetColVisible(sheet, col, visible); - End + End; - ///获取工作表列可见性 + ///获取列可见性 ///sheet: string,工作表名称 ///col: string,列 ///返回: [err, visible:int] @@ -636,36 +586,31 @@ Type TSExcelFile = Class [err, col] := ColumnNameToNumber(col); if err then return array(-1, col); return workbook_.GetColVisble(sheet, col); - End + End; ///设置工作表页边距 ///sheet: string,工作表名称 ///margins: TMargins 对象 - ///返回: [err, info] Function SetPageMargins(sheet, margins); Begin o := getOj(sheet, 'xlsxMargins'); - if not ifObj(o) then return array(0, 'The sheet is not exist'); - o.SetPageMargins(margins); - return array(0, ''); + if ifObj(o) then o.SetPageMargins(margins); End; ///获取工作表页边距 ///sheet: string,工作表名称 - ///返回: [err, info] - ///无错误时返回TMargins对象 + ///返回: TMargins对象 Function GetPageMargins(sheet); Begin o := getOj(sheet, 'xlsxMargins'); - if not ifObj(o) then return array(0, 'The sheet is not exist'); - return o.GetPageMargins(); + if ifObj(o) then return o.GetPageMargins(); + return "sheet error"; End; ///合并单元格 ///sheet: string,工作表名称 ///hcell: string,左上角坐标 ///vcell: string,右下角坐标 - ///返回: [err, info] Function MergeCell(sheet, hcell, vcell); Begin return workbook_.MergeCell(sheet, hcell, vcell); @@ -685,7 +630,7 @@ Type TSExcelFile = Class ///sheet: string,工作表名称 ///viewIndex: int,视图索引 ///sheet: object,TSheetView对象 - ///返回: [err, info] + ///返回: [err, TSheetView] Function SetSheetViewOptions(sheet, viewIndex, sheetView); Begin o := getOj(sheet, 'xlsxSheetView'); @@ -696,7 +641,7 @@ Type TSExcelFile = Class ///获取工作表视图属性 ///sheet: string,工作表名称 ///viewindex: int,视图索引,viewIndex 可以是负数,如果是这样,则向后计数(-1 代表最后一个视图) - ///返回: [err, SheetView] + ///返回: [err, TSheetView] Function GetSheetViewOptions(sheet, viewIndex); Begin o := getOj(sheet, 'xlsxSheetView'); @@ -704,99 +649,54 @@ Type TSExcelFile = Class return o.GetSheetViewOptions(viewIndex); End; - ///设置工作表页面布局 + // TODO printerSettings1.bin? + ///设置工作表页面设置 ///sheet: string,工作表名称 - ///pageLayout: pageLayout对象,属性: - /// BlackAndWhite bool //BlackAndWhite specified print black and white. - /// FirstPageNumber int //FirstPageNumber specified the first printed page number. If no value is specified, then 'automatic' is assumed. - /// PageLayoutOrientation string //PageLayoutOrientation defines the orientation of page layout for a worksheet. - /// PageLayoutPaperSize int //PageLayoutPaperSize defines the paper size of the worksheet. - /// FitToHeight int //FitToHeight specified the number of vertical pages to fit on. - /// FitToWidth int //FitToWidth specified the number of horizontal pages to fit on. - /// PageLayoutScale int //PageLayoutScale defines the print scaling. This attribute is restricted to values ranging from 10 (10%) to 400 (400%). This setting is overridden when fitToWidth and/or fitToHeight are in use. - ///返回: [err, info] + ///pageLayout: TPageLayout对象,属性: Function SetPageLayout(sheet, pageLayout); Begin o := getOj(sheet, 'xlsxPageLayout'); - if not ifObj(o) then return array(1, 'The sheet is not exist'); - return o.SetPageLayout(sheet, pageLayout); + if ifObj(o) then return o.SetPageLayout(sheet, pageLayout); End; - ///获取工作表页面布局 + ///获取工作表页面设置 ///sheet: string,工作表名称 - ///返回: [err, option:pageLayout对象] + ///返回: TPageLayout对象 Function GetPageLayout(sheet); Begin o := getOj(sheet, 'xlsxPageLayout'); - if not ifObj(o) then return array(1, 'The sheet is not exist'); - return o.GetPageLayout(); - End; - - ///设置工作簿应用程序属性 - ///appProps: TAppProperty对象,属性: - /// Application string - /// ScaleCrop bool - /// DocSecurity int - /// Company string - /// LinksUpToDate bool - /// HyperlinksChanged bool - /// AppVersion string - ///返回: [err, info] - Function SetAppProps(appProps); - Begin - o := getOj('', 'xlsxAppProperty'); - if not ifObj(o) then return array(1, 'AppProperty error!'); - return o.SetAppProps(appProps); - End; - - ///获取应用程序属性 - ///返回: [err, props:TAppProperty对象] - Function GetAppProps(); - Begin - o := getOj('', 'xlsxAppProperty'); - if not ifObj(o) then return array(1, 'AppProperty error!'); - return o.GetAppProps(); + if ifObj(o) then return o.GetPageLayout(); + return "error sheet"; End; ///sheet: string,工作表名称 - ///返回: [err, info] Function SetDefaultSheet(sheet); Begin return workbook_.SetDefaultSheet(sheet); - End + End; - ///返回:[err, sheet] + ///获取默认工作表 + ///返回: string,工作表名称 Function GetDefaultSheet(); Begin return workbook_.GetDefaultSheet(); - End - - ///设置工作表背景图片 - ///pictrue: 图片对象 - ///返回: [err, info] - Function SetSheetBackground(sheet, pictrue); - Begin - o := getOj(sheet, 'xlsxImage'); - if not ifObj(o) then return array(1, 'The sheet is not exist.'); - return o.SetSheetBackground(sheet); End; ///设置超链接 ///sheet: string,工作表名称 ///axis: string,单元格,如"A7" - ///hyplink:THyperLink对象 - ///返回: [err, info] + ///hyplink: THyperLink对象 Function SetCellHyperLink(sheet, axis, hyperlink); Begin o := getOj(sheet, 'xlsxHyperLink'); - if not ifObj(o) then return array(1, 'The sheet is not exist.'); - return o.SetCellHyperLink(axis, hyperlink); + if ifObj(o) then return o.SetCellHyperLink(axis, hyperlink); End; + // TODO 返回的结果有点问题 ///获取超链接 ///sheet: string,工作表名称 ///axis: string,单元格,如"A7" - ///返回: [err, hyperlink: THyperLink对象] + ///返回: THyperLink对象 Function GetCellHyperLink(sheet, axis); Begin o := getOj(sheet, 'xlsxHyperLink'); @@ -804,16 +704,113 @@ Type TSExcelFile = Class return o.GetCellHyperLink(axis); End; + ///设置工作表背景图片 + ///picture: TPicture图片对象 + Function SetSheetBackground(sheet, picture); + Begin + o := getOj(sheet, 'xlsxImage'); + if ifObj(o) then return o.SetSheetBackground(picture); + End; + + ///添加图片 + ///sheet: string, 工作表名称 + ///topLeft: string, 图片插入左上角单元格 + ///bottomRight: string, 图片插入右下角单元格 + ///picture: TPicture 图片对象 + ///format: TPictureFormat 图片设置对象 + Function AddPicture(sheet, topLeft, bottomRight, picture, format); + Begin + o := getOj(sheet, 'xlsxImage'); + if ifObj(o) then return o.AddPicture(topLeft, bottomRight, picture, format); + End; + + ///删除图片 + ///sheet: 工作表名称 + ///topLeft: string, 图片插入左上角单元格 + ///bottomRight: string, 图片插入右下角单元格 + Function DeletePicture(sheet, topLeft, bottomRight); + Begin + o := getOj(sheet, 'xlsxImage'); + if ifObj(o) then return o.DeletePicture(topLeft, bottomRight); + End; + + ///创建表格 + ///sheet: string,工作表名称 + ///topLeft: string, 左上角单元格 + ///bottomRight: string, 右下角单元格 + ///tableStyle: 表格选项类 TTableStyle + ///[includeHeader: bool] 是否包括表头,默认FALSE + Function AddTable(sheet, topLeft, bottomRight, tableStyle, includeHeader); + Begin + o := getOj(sheet, 'xlsxTable'); + if ifObj(o) then return o.AddTable(topLeft, bottomRight, tableStyle, includeHeader); + End; + + ///指定行前插入分页符 + ///sheet: string,工作表名称 + ///row: int,行号 + Function InsertPageBreak(sheet, row); + Begin + return workbook_.InsertPageBreak(sheet, row); + End; + + ///删除指定行分页符 + ///sheet: string,工作表名称 + ///row: int,行号 + Function RemovePageBreak(sheet, row); + Begin + return workbook_.RemovePageBreak(sheet, row); + End; + + ///添加形状 + ///sheet: string,工作表名称 + ///topLeft: string, 左上角单元格 + ///bottomRight: string, 右下角单元格 + ///shapeType: string, 形状类型 + ///format: 形状设置,TShapeFormat类 + Function AddShape(sheet, topLeft, bottomRight, shapeType, format); + Begin + o := getOj(sheet, 'xlsxShape'); + if ifObj(o) then return o.AddShape(topLeft, bottomRight, shapeType, format); + End; + + ///设置工作簿的核心属性 + ///coreProps: TCoreProperty对象 + Function SetCoreProps(coreProps); + Begin + o := getOj('', 'xlsxDocProps'); + if ifObj(o) then return o.SetCoreProps(coreProps); + End; + + ///获取工作簿的核心属性 + ///返回: TCoreProperty对象 + Function GetCoreProps(); + Begin + o := getOj('', 'xlsxDocProps'); + if ifObj(o) then return o.GetCoreProps(); + End; + + ///设置工作簿应用程序属性 + ///appProps: TAppProperty对象,属性: + Function SetAppProps(appProps); + Begin + o := getOj('', 'xlsxDocProps'); + if ifObj(o) then return o.SetAppProps(appProps); + End; + + ///获取应用程序属性 + ///返回: TAppProperty对象 + Function GetAppProps(); + Begin + o := getOj('', 'xlsxDocProps'); + return o.GetAppProps(); + End; + Function WorkBook(); Begin return workbook_; End; - Function XmlObj(); - Begin - return xml_; - End; - Function Zip(); Begin return zipfile_; @@ -843,40 +840,22 @@ private o := class(xlsxSheetView).NewObject(sheetname, self); 'xlsxPageLayout': o := class(xlsxPageLayout).NewObject(sheetname, self); - 'xlsxAppProperty': - return class(xlsxAppProperty).NewObject(self); + 'xlsxDocProps': + return class(xlsxDocProps).NewObject(self); 'xlsxImage': o := class(xlsxImage).NewObject(sheetname, self); 'xlsxHyperLink': o := class(xlsxHyperLink).NewObject(sheetname, self); + 'xlsxShape': + o := class(xlsxShape).NewObject(sheetname, self); + 'xlsxTable': + o := class(xlsxTable).NewObject(sheetname, self); End; if ifObj(o) then objMgr_[k] := o; return o; End; - { - TODO// 需要移除,待完成 - ///设置工作表默认行高 - ///sheet: string,工作表 - ///height:double - ///返回: [err, info] - Function SetSheetDefaultRowHeight(sheet, height); - Begin - return workbook_.SetSheetDefaultRowHeight(sheet, height); - End - - ///获取工作表默认行高 - ///sheet: string,工作表 - ///返回: [err, height] - Function GetSheetDefaultRowHeight(sheet); - Begin - return workbook_.GetSheetDefaultRowHeight(sheet); - End - } - - zipfile_; //压缩文件对象 workbook_; //WorkBook对象 - xml_; //xlsxXml对象 objMgr_; //各种对象缓存、管理 End; diff --git a/funcext/TSOffice/TSUtils/ErrorMessage.tsf b/funcext/TSOffice/TSUtils/ErrorMessage.tsf new file mode 100644 index 0000000..1b1cfbd --- /dev/null +++ b/funcext/TSOffice/TSUtils/ErrorMessage.tsf @@ -0,0 +1,30 @@ +Type ErrorMessage = class + + class Function Fail(); + Begin + return array(-1, ''); + End; + + class Function Ok(); + Begin + return array(0, 'ok'); + End; + + class Function SheetExist(sheetName) + Begin + sheetName := ifString(sheetName) ?: ''; + return array(2, sheetName + ' already exists.'); + End; + + class Function SheetNotExist(sheetName) + Begin + sheetName := ifString(sheetName) ?: ''; + return array(3, sheetName + ' does not exist.'); + End; + + class Function DeleteFailure(); + Begin + return array(4, 'Can not delete the last sheet.'); + End + +End; diff --git a/funcext/TSOffice/TSUtils/NodeInfo.tsf b/funcext/TSOffice/TSUtils/NodeInfo.tsf index 0bbd1ae..b11ca03 100644 --- a/funcext/TSOffice/TSUtils/NodeInfo.tsf +++ b/funcext/TSOffice/TSUtils/NodeInfo.tsf @@ -1,13 +1,30 @@ Type NodeInfo = class public - Function Create(name); + Function Create(p, name); Begin + Parent := p; NodeName := name; ExtAttr := array(); ExtNodes := array(); + ReplaceArr := array(); End + Function Root(); virtual; + Begin + return RootObj; + End + + Function Update(); + Begin + if ifObj(RootObj) then Begin + arr := Marshal(); + if length(arr['attributes']) or length(arr['children']) then Begin + class(xlsxXml).UpdateNode(RootObj, arr['attributes'], arr['children']); + End; + End; + End; + Function HandleAttrs(); virtual; Begin End @@ -36,7 +53,7 @@ public return length(ExtAttr); End - // arr := array('sz': 15, 'style': 'line'); + // arr := array(('Size', 'sz', 15), ('Style', 'style', 'line')); Function AddAttr(arr); // 添加属性 Begin if not istable(arr) then return; @@ -46,26 +63,33 @@ public Function Marshal(); Begin - children := getChildrenEx(); + GetChildrenEx(); //优化为变量,减少数据COPY,2022-12-10 child_arr := array(); len := 0; - for i:=0 to length(children)-1 do + for i:=0 to length(children_)-1 do begin - node_type := children[i]['nodeType']; - obj := children[i]['obj']; - + node_type := children_[i]['nodeType']; + obj := children_[i]['obj']; if ifnil(obj) then continue; - find := select thisrowindex as "rowindex_", * from child_arr where ['name'] = children[i]['name'] end; - if not ifnil(obj) and not ifObj(obj) and istable(find) and ifstring(children[i]['attrEx']) and children[i]['attrEx'] <> '' then + //find := select thisrowindex as "rowindex_", * from child_arr where ['name'] = children_[i]['name'] end; //优化为循环,性能提高15-20%,2022-12-20 + find := array(); + for j:=0 to length(child_arr)-1 do Begin + if child_arr[j]['name'] = children_[i]['name'] then Begin + find[0] := child_arr[j]; + find[0]['rowindex_'] := j; + break; + End; + End; + if not ifnil(obj) and not ifObj(obj) and istable(find) and ifstring(children_[i]['attrEx']) and children_[i]['attrEx'] <> '' then begin if not ifarray(find[0]['attributes']) then find[0]['attributes'] := array(); - key := children[i]['attrEx']; + key := children_[i]['attrEx']; find[0]['attributes'] union= array(key : obj); child_arr[find[0]['rowindex_']]['attributes'] := find[0]['attributes']; continue; end - arr := array('type': 'element', 'name': children[i]['name'], 'attributes': array()); + arr := array('type': 'element', 'name': children_[i]['name'], 'attributes': array()); if node_type = 'empty' then // begin end @@ -86,7 +110,7 @@ public end else begin - key := children[i]['attrName'] ? children[i]['attrName'] : children[i]['attrEx'] ? children[i]['attrEx'] : 'val'; + key := children_[i]['attrName'] ? children_[i]['attrName'] : children_[i]['attrEx'] ? children_[i]['attrEx'] : 'val'; arr['attributes'] := array(key : obj); end @@ -101,12 +125,13 @@ public end attrs_arr := GetAttrs(); - valid_arr := array(); - for k, v in attrs_arr do + tmp_arr['attributes'] := array(); + for i:=0 to length(attrs_arr)-1 do begin - if not ifnil(v) then valid_arr[k] := v; + if not ifnil(attrs_arr[i, 2]) then Begin + tmp_arr['attributes'][ attrs_arr[i, 1] ] := attrs_arr[i, 2]; + End; end - tmp_arr['attributes'] := valid_arr; return tmp_arr; End @@ -114,32 +139,142 @@ public Begin if not ifarray(nodeArr) then return 0; if not ifstring(nodeArr['name']) then return 0; - arr := array( + arr := array(( 'name': nodeArr['name'], 'obj': nodeArr['obj'], 'attrEx': nodeArr['attrEx'], 'nodeType': nodeArr['nodeType'], - ); + )); ExtNodes union= arr; return 1; End -private - Function getChildrenEx(); + + Function Value(name); Begin - r := GetChildren(); - a := array(); - for i:=0 to length(r)-1 do Begin - if ifarray(r[i]['obj']) then Begin - a union= r[i]['obj']; - End + uri := ifObj(Parent) ? NodeName : ''; + p := Parent; + rootNode := Root(); + while ifObj(p) do Begin + if ifObj(p.Parent) then + uri := p.NodeName + (uri ? '/' : '') + uri; + rootNode := p.Root(); + p := p.Parent; + End; + + attrs := GetAttrsEx(); + lName := lowerCase(name); + r := sselect * from attrs where lName = lowerCase([0]) end; + if istable(r) then Begin + node := class(xlsxXml).GetNode(rootNode, uri); + if not ifObj(node) then return nil; + return node.GetAttribute(r[1]); + End; + + children := GetChildren(); + r := select * from children where lName = lowerCase(['field']) end; + if istable(r) then Begin + r := r[0]; + uri := (uri='' ? '' : uri + '/') + r['name']; + node := class(xlsxXml).GetNode(rootNode, uri); + if not ifObj(node) then return nil; + if r['nodeType'] = 'empty' then + return true; + if r['nodeType'] = 'pcdata' then //返回文本串 + return node.GetText(); + if ifObj(r['obj']) then //对象,返回XML串 + return node.Data(); + key := r['attrName'] ? r['attrName'] : r['attrEx'] ? r['attrEx'] : 'val'; + if r['nodeType'] = 'empty_string' then + begin + value := node.GetAttribute(key); + if not value then return true; + return value; + end + return node.GetAttribute(key);//返回属性 + End; + return nil; + End; + + Function Replace(hash, bChild); + Begin + if istable(hash) then Begin + ReplaceArr := hash; + replaceNodeName(); + if bChild then Begin + r := GetChildren(); + for i:=0 to length(r)-1 do Begin + if ifObj(r[i]['obj']) then + r[i]['obj'].Replace(hash, bChild); + End; + End; + End; + End + + Function GetChildrenEx(); + Begin + if not ifarray(children_) then Begin + children_ := getChildren(); + if not istable(ReplaceArr) then Begin + for i:=0 to length(children_)-1 do Begin + if ifarray(children_[i]['obj']) then Begin + if istable(children_[i]['obj']) then + hasArr := 1; + else + children_[i]['obj'] := nil; + End; + End; + End; + if hasArr or istable(ReplaceArr) then Begin + a := array(); + for i:=0 to length(children_)-1 do Begin + if istable(ReplaceArr) then + children_[i]['name'] := ReplaceName(children_[i]['name']); + if istable(children_[i]['obj']) then Begin + a union= children_[i]['obj']; + End + else + a[ length(a) ] := children_[i]; + end; + children_ := a; + End; + End; + End; + + Function GetAttrsEx(); + Begin + return GetAttrs();//暂时没有发现需要更新属性前缀的情况 + if not istable(ReplaceArr) then return GetAttrs(); + attr := GetAttrs(); + for i:=0 to length(attr)-1 do + attr[i][1] := ReplaceName(attr[i][1]); + return attr; + End + +private + Function replaceNodeName(); + Begin + for k, v in ReplaceArr do + begin + NodeName := ReplaceStr(NodeName, k, v); + end + End + + Function ReplaceName(name); + Begin + for k,v in ReplaceArr do Begin + if k='' then + name := v + name; else - a[ length(a) ] := r[i]; - end; - return a; + name := ReplaceStr(name, k, v); + End; + return name; End; public NodeName; ExtAttr; ExtNodes; - + Parent; + ReplaceArr; + RootObj; + children_; End diff --git a/funcext/TSOffice/TSUtils/TSChart.tsf b/funcext/TSOffice/TSUtils/TSChart.tsf new file mode 100644 index 0000000..f7c299d --- /dev/null +++ b/funcext/TSOffice/TSUtils/TSChart.tsf @@ -0,0 +1,302 @@ +Type TSChart = Class + ///缺省构造函数 + Function Create(chartData); overload; + Begin + chartData_ := chartData; + End; + + Function GetDefaultXml(); + Begin + return ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Chart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'; + End; + + Function IsWord();virtual; + Begin + return false; + End; + + Function Apply(xmlObj); + Begin + chartData_.Serialize(IsWord()); //初始化图表数据 + task := array(('c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t', 'pcdata', chartData_.Title), + ('c:chartSpace/c:chart/c:dispBlanksAs', 'val', chartData_.ShowBlanksAs), + ('c:chartSpace/c:chart/c:legend', 'Del', ifnil(chartData_.Legend)), + ('c:chartSpace/c:chart/c:plotArea', 'unmarshal', chartData_.plotArea.Marshal()), + ('c:chartSpace/c:chart/c:view3D', 'unmarshal', getview3D().Marshal()) + ); + for i:=0 to length(task)-1 do Begin + class(xlsxXml).SetNodeValue(xmlObj, task[i]); + End; + if ifObj(chartData_.Legend) then Begin + node := class(xlsxXml).GetNode(xmlObj, 'c:chartSpace/c:chart/c:legend'); + if ifObj(node) then Begin + arr := chartData_.Legend.Marshal(); + class(xlsxXml).UpdateNode(node, arr['attributes'], arr['children']); + End; + End; + chartData_.ChartNode := class(xlsxXml).GetNode(xmlObj, 'c:chartSpace/c:chart/c:plotArea'); + if chartData_.DataTable then + chartData_.ShowDataTable(true); + End; +protected + Function getview3D(); + Begin + view3D := TOfficeObj('TView3D'); + chartView3DRotX := array( + 'area': 0, + 'areastacked': 0, + 'areapercentstacked': 0, + 'area3d': 15, + 'area3dstacked': 15, + 'area3dpercentstacked': 15, + 'bar': 0, + 'barstacked': 0, + 'barpercentstacked': 0, + 'bar3dclustered': 15, + 'bar3dstacked': 15, + 'bar3dpercentstacked': 15, + 'bar3dconeclustered': 15, + 'bar3dconestacked': 15, + 'bar3dconepercentstacked': 15, + 'bar3dpyramidclustered': 15, + 'bar3dpyramidstacked': 15, + 'bar3dpyramidpercentstacked': 15, + 'bar3dcylinderclustered': 15, + 'bar3dcylinderstacked': 15, + 'bar3dcylinderpercentstacked': 15, + 'col': 0, + 'colstacked': 0, + 'colpercentstacked': 0, + 'col3d': 15, + 'col3dclustered': 15, + 'col3dstacked': 15, + 'col3dpercentstacked': 15, + 'col3dcone': 15, + 'col3dconeclustered': 15, + 'col3dconestacked': 15, + 'col3dconepercentstacked': 15, + 'col3dpyramid': 15, + 'col3dpyramidclustered': 15, + 'col3dpyramidstacked': 15, + 'col3dpyramidpercentstacked': 15, + 'col3dcylinder': 15, + 'col3dcylinderclustered': 15, + 'col3dcylinderstacked': 15, + 'col3dcylinderpercentstacked': 15, + 'doughnut': 0, + 'line': 0, + 'pie': 0, + 'pie3d': 30, + 'pieofpiechart': 0, + 'barofpiechart': 0, + 'radar': 0, + 'scatter': 0, + 'surface3d': 15, + 'wireframesurface3d': 15, + 'contour': 90, + 'wireframecontour': 90); + chartView3DRotY := array( + 'area': 0, + 'areastacked': 0, + 'areapercentstacked': 0, + 'area3d': 20, + 'area3dstacked': 20, + 'area3dpercentstacked': 20, + 'bar': 0, + 'barstacked': 0, + 'barpercentstacked': 0, + 'bar3dclustered': 20, + 'bar3dstacked': 20, + 'bar3dpercentstacked': 20, + 'bar3dconeclustered': 20, + 'bar3dconestacked': 20, + 'bar3dconepercentstacked': 20, + 'bar3dpyramidclustered': 20, + 'bar3dpyramidstacked': 20, + 'bar3dpyramidpercentstacked': 20, + 'bar3dcylinderclustered': 20, + 'bar3dcylinderstacked': 20, + 'bar3dcylinderpercentstacked': 20, + 'col': 0, + 'colstacked': 0, + 'colpercentstacked': 0, + 'col3d': 20, + 'col3dclustered': 20, + 'col3dstacked': 20, + 'col3dpercentstacked': 20, + 'col3dcone': 20, + 'col3dconeclustered': 20, + 'col3dconestacked': 20, + 'col3dconepercentstacked': 20, + 'col3dpyramid': 20, + 'col3dpyramidclustered': 20, + 'col3dpyramidstacked': 20, + 'col3dpyramidpercentstacked': 20, + 'col3dcylinder': 20, + 'col3dcylinderclustered': 20, + 'col3dcylinderstacked': 20, + 'col3dcylinderpercentstacked': 20, + 'doughnut': 0, + 'line': 0, + 'pie': 0, + 'pie3d': 0, + 'pieofpiechart': 0, + 'barofpiechart': 0, + 'radar': 0, + 'scatter': 0, + 'surface3d': 20, + 'wireframesurface3d': 20, + 'contour': 0, + 'wireframecontour': 0); + chartView3DPerspective := array( + 'contour': 0, + 'wireframecontour': 0); + chartView3DRAngAx := array( + 'area': 0, + 'areastacked': 0, + 'areapercentstacked': 0, + 'area3d': 1, + 'area3dstacked': 1, + 'area3dpercentstacked': 1, + 'bar': 0, + 'barstacked': 0, + 'barpercentstacked': 0, + 'bar3dclustered': 1, + 'bar3dstacked': 1, + 'bar3dpercentstacked': 1, + 'bar3dconeclustered': 1, + 'bar3dconestacked': 1, + 'bar3dconepercentstacked': 1, + 'bar3dpyramidclustered': 1, + 'bar3dpyramidstacked': 1, + 'bar3dpyramidpercentstacked': 1, + 'bar3dcylinderclustered': 1, + 'bar3dcylinderstacked': 1, + 'bar3dcylinderpercentstacked': 1, + 'col': 0, + 'colstacked': 0, + 'colpercentstacked': 0, + 'col3d': 1, + 'col3dclustered': 1, + 'col3dstacked': 1, + 'col3dpercentstacked': 1, + 'col3dcone': 1, + 'col3dconeclustered': 1, + 'col3dconestacked': 1, + 'col3dconepercentstacked': 1, + 'col3dpyramid': 1, + 'col3dpyramidclustered': 1, + 'col3dpyramidstacked': 1, + 'col3dpyramidpercentstacked': 1, + 'col3dcylinder': 1, + 'col3dcylinderclustered': 1, + 'col3dcylinderstacked': 1, + 'col3dcylinderpercentstacked': 1, + 'doughnut': 0, + 'line': 0, + 'pie': 0, + 'pie3d': 0, + 'pieofpiechart': 0, + 'barofpiechart': 0, + 'radar': 0, + 'scatter': 0, + 'surface3d': 0, + 'wireframesurface3d': 0, + 'contour': 0, + 'bubble': 0, + 'bubble3d': 0); + view3D.RotX := chartView3DRotX[chartData_.Type]; + view3D.RotY := chartView3DRotY[chartData_.Type]; + view3D.Perspective := chartView3DPerspective[chartData_.Type]; + view3D.RAngAx := chartView3DRAngAx[chartData_.Type]; + return view3D; + End; + + chartData_; + type_; +End; diff --git a/funcext/TSOffice/TSUtils/TSImage.tsf b/funcext/TSOffice/TSUtils/TSImage.tsf index 0599fc2..43bb742 100644 --- a/funcext/TSOffice/TSUtils/TSImage.tsf +++ b/funcext/TSOffice/TSUtils/TSImage.tsf @@ -2,16 +2,17 @@ Type TSImage = Class Function Create(stream); overload; Begin content_ := stream; - imageDef := array(('Png', 0, (0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a)), - ('Jfif',6,'JFIF'), - ('Exif',6,'Exif'), - ('Gif',0,'GIF87a'), - ('Gif',0,'GIF89a'), - ('Tiff',0,('M','M',0x00,'*')), - ('Tiff',0,('I', 'I', '*', 0x00)), - ('Bmp',0,'BM')); + imageDef := array(('Png', 0, (0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a),'png'), + ('Jfif',6,'JFIF','Jfif'), + ('Exif',6,'Exif','Exif'), + ('Gif',0,'GIF87a','gif'), + ('Gif',0,'GIF89a','gif'), + ('Tiff',0,('M','M',0x00,'*'),'tiff'), + ('Tiff',0,('I', 'I', '*', 0x00),'tiff'), + ('Bmp',0,'BM','bmp')); ind := getImageDef(stream, imageDef); if ind >= 0 then Begin + ExtFileName := imageDef[ind][3]; case imageDef[ind][0] of 'Gif': [px_width, px_height, horz_dpi, vert_dpi] := gif_dimensions(stream); @@ -21,7 +22,7 @@ Type TSImage = Class [px_width, px_height, horz_dpi, vert_dpi] := tiff_dimensions(stream, imageDef[ind][2]); End; End; - println('width={},height={}',px_width, px_height); + //println('width={},height={}',px_width, px_height); end; Function Width(); @@ -216,4 +217,5 @@ println('off={}, tag={},type={},value_count={},value_off={},val={}',off, tag_cod px_height:integer; horz_dpi:integer; vert_dpi:integer; + ExtFileName:string; End; \ No newline at end of file diff --git a/funcext/TSOffice/TSUtils/xlsxXml.tsf b/funcext/TSOffice/TSUtils/xlsxXml.tsf index e1906cf..6474c89 100644 --- a/funcext/TSOffice/TSUtils/xlsxXml.tsf +++ b/funcext/TSOffice/TSUtils/xlsxXml.tsf @@ -1,9 +1,12 @@ Type xlsxXml = Class - map_; - ///缺省构造函数 - Function Create(); overload; + class Function XmlHeader(); Begin - map_ := array( + return ' \n'; + End; + + class Function GetMap(); + Begin + return array( 'Content_Types':('FileName':'[Content_Types].xml','Template':''), 'rels':('FileName':'_rels/.rels','Template':''), 'docProps_app':('FileName':'docProps/app.xml','Template':'0TSExcel'), @@ -12,29 +15,28 @@ Type xlsxXml = Class 'sharedStrings':('FileName':'xl/sharedStrings.xml','Template':''), 'styles':('FileName':'xl/styles.xml','Template':''), 'workbook':('FileName':'xl/workbook.xml','Template':''), - 'sheet1':('FileName':'xl/worksheets/sheet1.xml','Template':''), + 'sheet1':('FileName':'xl/worksheets/sheet1.xml','Template':''), 'theme1':('FileName':'xl/theme/theme1.xml','Template':''), 'workbook_rels':('FileName':'xl/_rels/workbook.xml.rels','Template':''), 'sheet_rels':('FileName':'','Template':''), + 'drawing_rels':('FileName':'','Template':''), 'SheetContentType':('FileName':'','Template':'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'), - 'RelationshipWorkSheet':('FileName':'','Template':'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet') - ); - End; + 'RelationshipWorkSheet':('FileName':'','Template':'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet'), + 'table1':('FileName':'xl/tables/table1.xml','Template':'
'), + ); + End - Function XmlHeader(); + class Function GetFileName(key); Begin - return ' \n'; - End; - - Function GetFileName(key); - Begin - if ifarray(map_[key]) then return map_[key]['FileName']; + map := class(xlsxXml).GetMap(); + if ifarray(map[key]) then return map[key]['FileName']; return ''; End; - Function GetTemplate(key); + class Function GetTemplate(key); Begin - if ifarray(map_[key]) then return map_[key]['Template']; + map := class(xlsxXml).GetMap(); + if ifarray(map[key]) then return map[key]['Template']; return ''; End; @@ -88,6 +90,8 @@ Type xlsxXml = Class class Function UpdateNode(node, attrs, children); Begin + if not ifArray(attrs) then attrs := array(); + if not ifArray(children) then children := array(); fields := getstrindexs(attrs); for i:=0 to length(fields)-1 do Begin node.SetAttribute(fields[i], attrs[ fields[i] ]); @@ -98,8 +102,7 @@ Type xlsxXml = Class else child := node.FirstChild(children[i]['name']); if not ifObj(child) then - child := node.InsertFirstChild(children[i]['type'], children[i]['name']); - + child := node.InsertEndChild(children[i]['type'], children[i]['name']); if children[i]['type'] = 'pcdata' then child.SetValue(children[i]['value']); else @@ -107,12 +110,23 @@ Type xlsxXml = Class End; End; - class Function GetNode(obj, r); + class Function GetNode(obj, r, n); Begin arr := str2array(r, '/'); + node := obj; + prev := obj; for i:=0 to length(arr)-1 do Begin - node := i=0 ? obj.FirstChild(arr[i]) : node.FirstChild(arr[i]); - if not ifObj(node) then return nil; + node := prev.FirstChild(arr[i]); + if not ifObj(node) then Begin + if n then + if ifString(n) and n = 'first' then + node := prev.InsertFirstChild('element', arr[i]); + else + node := prev.InsertEndChild('element', arr[i]); + else + return nil; + End; + prev := node; End; return node; End; @@ -131,6 +145,7 @@ Type xlsxXml = Class nodeArr[cnt - 2].DeleteChild(nodeArr[cnt - 1]); End; + ///prefix为空——查找最大rId,prefix非空——查找指定Target class Function FindRelationshipRid(xmlfile, prefix); Begin rId := 0; @@ -173,4 +188,177 @@ Type xlsxXml = Class node.SetAttribute('Target', target); if not ifnil(targetMode) then node.SetAttribute('TargetMode', targetMode); End; + + class Function AddDefaultContentType(xml, extensionName, contentType) + Begin + content := xml.FirstChildElement('Types'); + element := content.FirstChildElement('Default'); + while ifObj(element) do + begin + attr := element.GetAttribute('Extension'); + if attr = extensionName then return; + element := element.NextElement('Default'); + end + element := content.InsertFirstChild('element', 'Default'); + element.SetAttribute('Extension', extensionName); + element.SetAttribute('ContentType', contentType); + End + + class Function AddOverrideContentType(xml, partName, contentType); + Begin + content := xml.FirstChildElement('Types'); + element := content.FirstChildElement('Override'); + while ifObj(element) do + begin + attr := element.GetAttribute('PartName'); + if attr = partName then return; + element := element.NextElement('Override'); + end + element := content.InsertEndChild('element', 'Override'); + element.SetAttribute('PartName', partName); + element.SetAttribute('ContentType', contentType); + End; + + class Function GetDefaultContentType(xml, prefix); + Begin + element := xml.FirstChildElement('Default'); + while ifObj(element) do + begin + extension := element.GetAttribute('Extension'); + if AnsiStartsText(prefix, extension) then + return array(extension, element.GetAttribute('ContentType')); + element := element.NextElement('Default'); + end + return array('', ''); + End + + class Function GetOverrideContentType(xml, prefix); + Begin + element := xml.FirstChildElement('Override'); + while ifObj(element) do + begin + partName := element.GetAttribute('PartName'); + if AnsiStartsText(prefix, partName) then + return array(partName, element.GetAttribute('ContentType')); + element := element.NextElement('Override'); + end + return array('', ''); + End + + class Function GetWorkSheetPrevNode(workNode, nodeName); + Begin + order_arr := array('dimension', 'sheetViews', 'sheetFormatPr', 'cols', 'sheetData', 'phoneticPr', + 'pageMargins', 'headerFooter', 'pageSetup', 'rowBreaks', 'colBreaks', 'drawing', 'legacyDrawing', 'picture'); + for i:=0 to length(order_arr)-1 do + begin + if order_arr[i] = nodeName then return prev; + current := workNode.FirstChild(order_arr[i]); + if i = 0 then prev := current; + else prev := ifObj(current) ? current : prev; + end + End + + class Function GetDatetimeStr(v); + Begin + return FormatDateTime('YYYY-MM-DD', v) + 'T' + timetostr(v) + 'Z';//2017-03-02T04:16:00Z + End; + + class Function GetcNvPrID(obj); + Begin + cnt := 2; + node := obj.FirstChild('xdr:wsDr'); + if ifObj(node) then Begin + node := node.FirstChild(); + while ifObj(node) do Begin + if node.GetName() in array('xdr:oneCellAnchor', 'xdr:twoCellAnchor') then + cnt++; + node := node.NextElement(); + End; + End; + return cnt; + End; + + class Function CopyPprFormat(p1, p2); + Begin + if ifObj(p1) and ifObj(p2) then Begin + p1.SpaceBefore := _cp(p1.SpaceBefore, p2.SpaceBefore); + p1.SpaceAfter := _cp(p1.SpaceAfter, p2.SpaceAfter); + p1.LineSpacingRule := _cp(p1.LineSpacingRule, p2.LineSpacingRule); + p1.LineSpacing := _cp(p1.LineSpacing, p2.LineSpacing); + p1.LeftIndent := _cp(p1.LeftIndent, p2.LeftIndent); + p1.RightIndent := _cp(p1.RightIndent, p2.RightIndent); + End; + End; + + class Function CopyRprFormat(r1, r2); + Begin + if ifObj(r1) and ifObj(r2) then Begin + r1.Size := _cp(r1.Size, r2.Size); + r1.szCs := _cp(r1.szCs, r2.szCs); + r1.Color := _cp(r1.Color, r2.Color); + r1.rFont.hint := _cp(r1.rFont.hint, r2.rFont.hint); + r1.rFont.eastAsia := _cp(r1.rFont.eastAsia, r2.rFont.eastAsia); + r1.rFont.hAnsi := _cp(r1.rFont.hAnsi, r2.rFont.hAnsi); + r1.rFont.ascii := _cp(r1.rFont.ascii, r2.rFont.ascii); + r1.rFont.cs := _cp(r1.rFont.cs, r2.rFont.cs); + End; + End; + + //字体属性 + class Function ReadRprFormat(node); + Begin + rNode := node.FirstChildElement('w:rPr'); + if not ifObj(rNode) then + return nil; + rPr := TOfficeObj('TwrPr'); + rPr.RootObj := rNode; + rPr.Size := SafeStrToIntDef(rPr.Value('Size'), 0); //单字节字符(如ASCII编码字符等)的大小。 + rPr.szCs := SafeStrToIntDef(rPr.Value('szCs'), 0); //双字节字符(如中日韩文字、阿拉伯文等)的大小。 + rPr.rFont.hint := rPr.rFont.Value('hint'); + rPr.rFont.eastAsia := rPr.rFont.Value('eastAsia'); + rPr.rFont.hAnsi := rPr.rFont.Value('hAnsi'); + rPr.rFont.ascii := rPr.rFont.Value('ascii'); + rPr.rFont.cs := rPr.rFont.Value('cs'); + return rPr; + End; + + //段落属性 + class Function ReadPprFormat(node); + Begin + pNode := node.FirstChildElement('w:pPr'); + if not ifObj(pNode) then + return nil; + pPr := TOfficeObj('TwpPr'); + pPr.RootObj := pNode; + pPr.SpaceBefore := SafeStrToIntDef(pPr.Value('SpaceBefore'), 0); + pPr.SpaceAfter := SafeStrToIntDef(pPr.Value('SpaceAfter'), 0); + pPr.LineSpacing := SafeStrToIntDef(pPr.Value('LineSpacing'), 0); + pPr.LineSpacingRule := pPr.Value('LineSpacingRule'); + pPr.LeftIndent := SafeStrToIntDef(pPr.Value('LeftIndent'), 0);//office 2007 + pPr.RightIndent := SafeStrToIntDef(pPr.Value('RightIndent'), 0); + pPr.EndIndent := SafeStrToIntDef(pPr.Value('EndIndent'), 0); + pPr.StartIndent := SafeStrToIntDef(pPr.Value('StartIndent'), 0);//office 2011 + pPr.Hanging := SafeStrToIntDef(pPr.Value('Hanging'), 0); + pPr.FirstLineIndent := SafeStrToIntDef(pPr.Value('FirstLineIndent'), 0); + if pPr.StartIndent then + pPr.LeftIndent := pPr.StartIndent; + if pPr.EndIndent then + pPr.RightIndent := pPr.EndIndent; + //pPr.rPr := ReadRprFormat(pNode); + return pPr; + End; + + class Function SafeStrToIntDef(s, defaultV); + Begin + if not ifstring(s) then + return defaultV; + return StrToIntDef(s, defaultV); + End; + + class Function _cp(v1,v2); + Begin + if not v1 and v2 then + return v2; + return v1; + End; End; diff --git a/funcext/TSOffice/document/TDocxChart.tsf b/funcext/TSOffice/document/TDocxChart.tsf new file mode 100644 index 0000000..00fde99 --- /dev/null +++ b/funcext/TSOffice/document/TDocxChart.tsf @@ -0,0 +1,51 @@ +Type TDocxChart = Class(TSChart) + ///缺省构造函数 + Function Create(docx, chartData); overload; + Begin + class(TSChart).Create(chartData); + //chartN.xml + chartId_ := 1 + vselect countof( ['FileName'] ) from docx.ZipObject().Files() where AnsiStartsText('word/charts/chart', ['FileName']) end; + chartFile := 'word/charts/chart' $ chartId_ $ '.xml'; + docx.ZipObject().Add(chartFile, GetDefaultXml()); + xmlObj := docx.ZipObject().Get(chartFile); + Apply(xmlObj); + + //Relationship + relsObj := docx.ZipObject().Get('word/_rels/document.xml.rels'); + [rId_, target] := class(xlsxXml).FindRelationshipRid(relsObj, ''); + rId_ ++; + class(xlsxXml).AddRelationshipRid(relsObj, '/' + chartFile, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', 'rId' $ rId_); + + //Content_Types + contentType := docx.ZipObject().Get('[Content_Types].xml'); + class(xlsxXml).AddOverrideContentType(contentType, '/' + chartFile, 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'); + End; + + Function GetInnerXml(); + Begin + ETU := 360045;//1cm单位 + return fmt(' + + + + + + + + + + + + + + ', integer(chartData_.Width * ETU), integer(chartData_.Height * ETU), chartId_, chartData_.Name, rId_); + End; + + Function IsWord();override; + Begin + return true; + End; + + chartId_; + rId_; +End; \ No newline at end of file diff --git a/funcext/TSOffice/document/TDocxStyles.tsf b/funcext/TSOffice/document/TDocxStyles.tsf new file mode 100644 index 0000000..34d476c --- /dev/null +++ b/funcext/TSOffice/document/TDocxStyles.tsf @@ -0,0 +1,193 @@ +Type TDocxStyles = Class + //段落格式 + Function Create(docx); + Begin + docx_ := docx; + stylesXml_ := docx.ZipObject().Get('word/styles.xml'); + idMap_ := array(); + nameMap_ := array(); + maxStyleId_ := 1; + + if ifObj(stylesXml_) then Begin + stylesNode := stylesXml_.FirstChildElement('w:styles'); + if ifObj(stylesNode) then Begin + node := stylesNode.FirstChildElement('w:style'); + while ifObj(node) do Begin + o := TOfficeObj('TDocxStyle'); + o.Init(node); + id := StrToIntDef(o.StyleId, 0); + if id > 0 and maxStyleId_ <= id then + maxStyleId_ := id + 1; + _addStyle(o); + node := node.NextElement('w:style'); + End; + pNode := class(xlsxXml).GetNode(stylesNode, 'w:docDefaults/w:pPrDefault'); + if ifObj(pNode) then + defaultPpr_ := Class(xlsxXml).ReadPprFormat(pNode); + + rNode := class(xlsxXml).GetNode(stylesNode, 'w:docDefaults/w:rPrDefault'); + if ifObj(rNode) then + defaultRpr_ := Class(xlsxXml).ReadRprFormat(rNode); + End; + End; + End; + + ///缺省样式 + ///styleType:样式类型(paragraph、character、table) + ///返回:TDocxStyle对象 + Function Default(styleType); + Begin + for k, obj in idMap_ do Begin + if obj.wType_ = styleType then Begin + v := obj.node_.GetAttribute('w:default'); + if v <> '1' then + return obj; + End; + End + return nil; + End; + + ///返回指定名称的TDocxStyle + ///name:样式名称 + ///返回:TDocxStyle对象 + Function GetStyle(name); + Begin + return nameMap_[ lowercase(name) ]; + End; + + ///返回指定StyleId名称的TDocxStyle + ///id:StyleID号(数字ID号或名称字符串) + ///返回:TDocxStyle对象 + Function GetStyleById(id); + Begin + return idMap_[ id ]; + End; + + ///返回全部LatentStyles对象列表 + ///返回:TDocxStyle对象列表 + Function LatentStyles(); + Begin + r := array(); + node := stylesXml_.FirstChildElement('w:styles'); + if ifObj(node) then + node := node.FirstChildElement('w:latentStyles'); + if ifObj(node) then Begin + node := node.FirstChildElement('w:lsdException'); + while ifObj(node) do Begin + o := TOfficeObj('TDocxStyle'); + o.Init(node); + o.name_ := node.GetAttribute('w:name'); + r[ length(r) ] := o; + node := node.NextElement('w:lsdException'); + End; + End; + return r; + End; + + ///返回全部Styles对象列表 + ///返回:TDocxStyle对象列表 + Function Styles(); + Begin + return idMap_; + End; + + ///插入新的段落样式 + ///styleId:样式ID,可以是自定义名称 + ///xmlStr:InnerXml串 + ///返回:TDocxStyle对象 + Function AddStyleByInnerXml(styleId, xmlStr); + Begin + if ifstring(styleId) and styleId <> '' then Begin + style := GetStyle(styleId); + if ifObj(style) then + return style; + node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr); + node.SetAttribute('w:styleId', styleId); + End + else Begin + node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr); + node.SetAttribute('w:styleId', maxStyleId_++); + End; + o := TOfficeObj('TDocxStyle'); + o.Init(node); + _addStyle(o); + return o; + End; + + ///插入新的段落样式 + ///o:TDocxStyle对象 + ///StyleId:样式ID,可以是自定义名称 + ///返回:TDocxStyle对象 + Function AddStyle(o, StyleId); + Begin + if ifObj(o) then Begin + if ifString(StyleId) and StyleId <> '' and not ifObj(idMap_[ StyleId ]) then + o.StyleId := StyleId; + else + o.StyleId := maxStyleId_++; + node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(o.Marshal()); + obj := TOfficeObj('TDocxStyle'); + obj.Init(node); + _addStyle(obj); + return obj; + End; + return nil; + End; + + ///插入新的LatentStyle段落样式 + ///o:TDocxStyle对象 + ///返回:TDocxStyle对象 + Function AddLatentStyle(o); + Begin + if ifObj(o) then Begin + latentStyles := stylesXml_.FirstChildElement('w:styles').InsertEndChild('w:latentStyles'); + node := latentStyles.InsertEndChild('lsdException'); + node.UnMarshal(o); + latentStyles.SetAttribute('w:count', length(LatentStyles())); + return node; + End; + return nil; + End; + + ///插入缺省的段落样式(Title、Heading1-9) + ///返回:TDocxStyle对象 + Function AddDefaultStyle(path, Name); + Begin + styleId := AnsiReplaceText(Name, ' ', ''); + charId := StyleId + 'Char'; + if path[1] = '/' then Begin + styleFname := path + '/funcext/TSOffice/template/wStyle' + styleId + '.xml'; + cStyleFname := path + '/funcext/TSOffice/template/wStyle/' + charId + '.xml'; + End + else Begin + styleFname := path + '\\funcext\\TSOffice\\template\\wStyle\\' + styleId + '.xml'; + cStyleFname := path + '\\funcext\\TSOffice\\template\\wStyle\\' + charId + '.xml'; + End; + if not ReadFile(rwraw(), '', styleFname, 0, 100 * 1024, xmlData) then + return nil; + o := AddStyleByInnerXml(styleId, xmlData); + + charStyle := idMap_[charId]; + if not ifObj(charStyle) then Begin + if ReadFile(rwraw(), '', cStyleFname, 0, 100 * 1024, xmlData) then Begin + AddStyleByInnerXml(charId, xmlData); + End; + End; + return o; + End; + + Function _addStyle(o); + Begin + idMap_[ o.StyleId ] := o; + nameMap_[ lowercase(o.Name) ] := o; + End; + + defaultPpr_; + defaultRpr_; +private + docx_; + stylesXml_; + idMap_; + nameMap_; + maxStyleId_:integer; +End; \ No newline at end of file diff --git a/funcext/TSOffice/document/TNumbering.tsf b/funcext/TSOffice/document/TNumbering.tsf new file mode 100644 index 0000000..875f773 --- /dev/null +++ b/funcext/TSOffice/document/TNumbering.tsf @@ -0,0 +1,235 @@ +Type TNumbering = Class + //项目编号 + Function Create(docx); + Begin + docx_ := docx; + numberingXml_ := docx.ZipObject().Get('word/numbering.xml'); + if not ifObj(numberingXml_) then Begin + path := docx.GetPath(); + if path[1] = '/' then + fName := path + '/funcext/TSOffice/template/template/numbering/numbering.xml'; + else + fName := path + '\\funcext\\TSOffice\\template\\numbering\\numbering.xml'; + if ReadFile(rwraw(), '', fName, 0, 100 * 1024, xmlData) then Begin + docx.ZipObject().Add('word/numbering.xml', xmlData); + rels := 'word/_rels/document.xml.rels'; + relsObj := docx.ZipObject().Get(rels); + [rId, target] := class(xlsxXml).FindRelationshipRid(relsObj, ''); + rId ++; + class(xlsxXml).AddRelationshipRid(relsObj, 'numbering.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering', 'rId' $ rId); + contentType := docx.ZipObject().Get('[Content_Types].xml'); + class(xlsxXml).AddOverrideContentType(contentType, '/word/numbering.xml', 'application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml'); + numberingXml_ := docx.ZipObject().Get('word/numbering.xml'); + End; + End; + maxAbstractNumId_ := 0; + maxNumId_ := 1; + numStyleObjs_ := array(); + numIdMap_ := array(); + bullet_ := array(); + hash_ := array(); + bulletDefine_ := array("ef82b2","ef81b5","ef83bc","ef81b6","ef81ac","ef8398","ef81ae");//缺省项目符号文字内容(utf8 -> hex16) + if ifObj(numberingXml_) then Begin + numbering := numberingXml_.FirstChildElement('w:numbering'); + if ifObj(numbering) then Begin + node := numbering.FirstChildElement('w:abstractNum'); + numNode := numbering.FirstChildElement('w:num'); + End; + while ifObj(node) do Begin + o := TOfficeObj('TNumStyle'); + o.Init(node); + nsid := o.Value('nsid'); + if nsid then + hash_[nsid] := 1; + tmpl := o.Value('tmpl'); + if tmpl then + hash_[tmpl] := 1; + id := StrToIntDef(o.abstractNumId, 0); + if id >= 0 and maxAbstractNumId_ <= id then + maxAbstractNumId_ := id + 1; + _addStyle(o); + lastAbstractNumStyle_ := node; + node := node.NextElement('w:abstractNum'); + End; + while ifObj(numNode) do Begin + idStr := numNode.GetAttribute('w:numId'); + id := StrToIntDef(idStr, 0); + if id > 0 and maxNumId_ <= id then + maxNumId_ := id + 1; + abstractNumIdNode := numNode.FirstChildElement('w:abstractNumId'); + if ifObj(abstractNumIdNode) then + numIdMap_[idStr] := abstractNumIdNode.GetAttribute('w:val'); + numNode := numNode.NextElement('w:num'); + End; + End; + End; + + ///新生成numId + ///levelType:字符串,bullet、singleLevel、multilevel + ///fmt:项目格式,取值范围:bullet:0-6;singleLevel:(decimal、chineseCounting);multilevel:decimal + ///返回:numId + Function NumberId(levelType, fmt); + Begin + style := NumberStyle(levelType, fmt); + if not ifObj(style) then + return -1; + num := TOfficeObj('TNumber'); + num.numId := maxNumId_++; + num.abstractNumId := style.Id; + numberingXml_.FirstChildElement('w:numbering').InsertEndChild(num.Marshal()); + numIdMap_[''$num.numId] := num.abstractNumId; + return num.numId; + End; + + ///根据numId获取TNumStyle对象(已存在) + ///返回:TNumStyle对象 + Function NumberStyle(numId);overload; + Begin + abstractNumId := numIdMap_[numId]; + if abstractNumId then Begin + return numStyleObjs_[abstractNumId]; + End; + return nil; + End; + + //获取TNumStyle对象,如果不存在插入系统缺省 + Function NumberStyle(levelType, fmt);overload; + Begin + if levelType = 'bullet' then Begin + if fmt < 0 or fmt > 6 then return nil; + k := bulletDefine_[fmt]; + o := bullet_[k]; + if ifObj(o) then + return o; + //不存在,插入缺省项目编号 + return AddDefaultStyle('bullet' $ fmt); + End; + + if lowercase(levelType) = 'singlelevel' and lowercase(fmt) = 'decimal' then Begin + if ifObj(singleNumLevel_) then + return singleNumLevel_; + return AddDefaultStyle('singleNumLevel-decimal'); + End; + + if lowercase(levelType) = 'singlelevel' and lowercase(fmt) in array('chinese','chinesecounting','cn','china') then Begin + if ifObj(singleCNLevel_) then + return singleCNLevel_; + return AddDefaultStyle('singlelevel-chineseCounting'); + End; + + if lowercase(levelType) = 'multilevel' and lowercase(fmt) = 'decimal' then Begin + if ifObj(multiNumLevel_) then + return multiNumLevel_; + return AddDefaultStyle('multilevel-decimal'); + End; + return nil; + End; + + ///返回:TNumStyle全部对象列表array('id1':obj1,'id2':obj2); + Function Numberings(); + Begin + return numStyleObjs_; + End; + + ///新添加项目样式 + ///xmlStr:xml字符串 + ///返回:TNumStyle对象 + Function AddStyleByInnerXml(xmlStr); + Begin + if ifObj(lastAbstractNumStyle_) then + node := numberingXml_.FirstChildElement('w:numbering').InsertAfterChild(lastAbstractNumStyle_, xmlStr); + else + node := numberingXml_.FirstChildElement('w:numbering').InsertFirstChild(xmlStr); + node.SetAttribute('w:abstractNumId', maxAbstractNumId_++); + lastAbstractNumStyle_ := node; + o := TOfficeObj('TNumStyle'); + o.Init(node); + _addStyle(o); + _setNsId(o); + return o; + End; + + ///新添加项目样式 + ///o:TNumStyle对象 + ///返回:TNumStyle对象 + Function AddStyle(o); + Begin + if ifObj(o) then Begin + o.abstractNumId := maxAbstractNumId_++; + if ifObj(lastAbstractNumStyle_) then + node := numberingXml_.FirstChildElement('w:numbering').InsertAfterChild(lastAbstractNumStyle_, o.Marshal()); + else + node := numberingXml_.FirstChildElement('w:numbering').InsertFirstChild(o.Marshal()); + lastAbstractNumStyle_ := node; + o := TOfficeObj('TNumStyle'); + o.Init(node); + _addStyle(o); + _setNsId(o); + return o; + End; + return nil; + End; + + //系统默认支持的项目编号样式 + Function AddDefaultStyle(Name); + Begin + path := docx_.GetPath(); + if path[1] = '/' then Begin + styleFname := path + '/funcext/TSOffice/template/numbering/' + name + '.xml'; + End + else Begin + styleFname := path + '\\funcext\\TSOffice\\template\\numbering\\' + name + '.xml'; + End; + if not ReadFile(rwraw(), '', styleFname, 0, 100 * 1024, xmlData) then + return nil; + return AddStyleByInnerXml(xmlData); + End; + + //map项目对象 + Function _addStyle(o); + Begin + if o.multiLevelType = 'singleLevel' and o.numFmt = 'bullet' then Begin + lvlText := o.lvl.Value('lvlText'); + if lvlText then Begin + str := encoderadixstr(lvlText,"", 0x40000000+16); + bullet_[str] := o; + End; + End + else if not ifObj(singleNumLevel_) and o.multiLevelType = 'singleLevel' and o.numFmt = 'decimal' then + singleNumLevel_ := o; + else if not ifObj(singleCNLevel_) and o.multiLevelType = 'singleLevel' and o.numFmt = 'chineseCounting' then + singleCNLevel_ := o; + else if not ifObj(multiNumLevel_) and o.multiLevelType = 'multilevel' and o.numFmt = 'decimal' then + multiNumLevel_ := o; + + numStyleObjs_[o.abstractNumId] := o; + End; + + //生成nsid随机数->转16进制 + Function _setNsId(o); + Begin + v := RandomRange(1000000000,2000000000); + id := xlsx_call('tohex',v); + if hash_[id] then + return _setNsId(o); + hash_[id] := 1; + o.nsid := id; + o.tmpl := id; + arr := o.Marshal(); + class(xlsxXml).UpdateNode(o.node_, arr['attributes'], arr['children']); + End; +private + docx_; + numberingXml_; + maxAbstractNumId_:integer; + maxNumId_:integer; + lastAbstractNumStyle_; + numStyleObjs_; + singleNumLevel_; + singleCNLevel_; + multiNumLevel_; + bulletDefine_; + bullet_; + numIdMap_; + hash_; +End; \ No newline at end of file diff --git a/funcext/TSOffice/document/TTableContent.tsf b/funcext/TSOffice/document/TTableContent.tsf new file mode 100644 index 0000000..1afc2fb --- /dev/null +++ b/funcext/TSOffice/document/TTableContent.tsf @@ -0,0 +1,309 @@ +Type TTableContent = class + //目录 + Function Create(docx);overload; + Begin + Create(docx, nil); + End; + + Function Create(docx, node);overload; + Begin + node_ := node; + docx_ := docx; + impl_ := TOfficeObj('TTableContentImpl'); + //_CheckNodes('endnotes.xml'); + //_CheckNodes('footnotes.xml'); + //contentType := docx.ZipObject().Get('[Content_Types].xml'); + //class(xlsxXml).AddOverrideContentType(contentType, 'wmf', 'image/x-wmf'); + End; + + Function SetDefaultFormat(); + Begin + defultFont := impl_.stdPr.rPr; + defultFont.rFont.cstheme := 'minorBidi'; + defultFont.rFont.eastAsia := '宋体'; + defultFont.rFont.hAnsi := '宋体'; + defultFont.rFont.ascii := '宋体'; + //defultFont.kern := 2; + defultFont.Size := 21; + defultFont.SzCs := 24; + defultFont.Lang := 'en-US'; + defultFont.bidi := 'ar-SA'; + defultFont.eastAsia := 'zh-CN'; + defultFormat := impl_.stdPr; + defultFormat.ID := integer(time()*24*3600); + defultFormat.Color := 'DBDBDB'; + defultFormat.docPartObj.docPartGallery := 'Table of Contents'; + defultFormat.docPartObj.docPartUnique := 1; + //impl_.stdEndPr.rPr.Size := 20; + //impl_.stdEndPr.rPr.SzCs := 20; + impl_.stdEndPr.rPr.Bold := true; + End; + + ///应用目录样式 + Function Apply(); override; + Begin + arr := impl_.Marshal(); + class(xlsxXml).UpdateNode(node_, arr['attributes'], arr['children']); + End; + + ///添加目录条目 + ///UpperHeadingLevel:标题最高级别 + ///LowerHeadingLevel:标题最低级别 + /// 使用 UpperHeadingLevel 属性可设置起始标题级别(最高)。例如,若要设置 TOC 域语法 {TOC \o "1-3"},可将 LowerHeadingLevel 属性设为 3,并将 UpperHeadingLevel 属性设为 1。 + Function Add(posOpt, UpperHeadingLevel, LowerHeadingLevel); + Begin + ///目录 + mParagraph := TOfficeObj('TParagraph'); + mParagraph.pPr.LineSpacingRule := 'auto'; + mParagraph.pPr.LineSpacing := 240; + mParagraph.pPr.AfterLines := 0; + mParagraph.pPr.SpaceAfter := 0; + mParagraph.pPr.BeforeLines := 0; + mParagraph.pPr.SpaceBefore := 0; + mParagraph.pPr.Alignment := 'center'; + mParagraph.pPr.FirstLineChars := 0; + mParagraph.pPr.FirstLineIndent := 0; + mParagraph.pPr.RightChars := 0; + mParagraph.pPr.RightIndent := 0; + mParagraph.pPr.LeftChars := 0; + mParagraph.pPr.LeftIndent := 0; + mParagraph.Run.T := '目录'; + mParagraph.Run.rPr.Name := '宋体'; + mParagraph.Run.rPr.Size := 21; + mParagraph.Run.rPr.Bold := true; + _AddStdContent(mParagraph); + + goback := TOfficeObj('TParagraph'); + id := docx_.Document().GetBookMarkID(); + goback.MarkStart.Name := '_GoBack'; + goback.MarkStart.ID := id; + goback.MarkEnd.ID := id; + _AddStdContent(goback); + + //缺省目录,需要word或wps打开后,更新目录 + _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel); + + //自定义页码计算与word、wps有差异,不推荐使用 + //_AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); + End; + + Function _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel); + Begin + p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, UpperHeadingLevel - 1, true); + _AddStdContent(p); + + p2 := TOfficeObj('TParagraph'); + //p2.Format.SpaceAfter := 0; + run := p2.AddRun(); + run.rPr.Bold := true; + run.rPr.noProof := true; + run.fldCharType := 'end'; + _AddStdContent(p2); + End; + + Function _AddItem(UpperHeadingLevel, LowerHeadingLevel, level, first); + Begin + p := TOfficeObj('TParagraph'); + //标题段落属性 + p.Format.StyleId := _GetStyle(level); + //p.Format.SpaceAfter := 0; + p.Format.rPr.noProof := true; + tab := TOfficeObj('TTabStop'); + tab.Val := 'right'; + tab.leader := 'dot'; + tab.Position := 8640; + p.Format.Tabs.Add(0, tab); + if first then Begin + //fldCharType + r1 := p.AddRun(); + r1.fldCharType := 'begin'; + r1.Dirty := 'true'; + + //instrText + r2 := p.AddRun(); + r2.instrTextSpace := 'preserve'; + r2.instrText := 'TOC \\o \"' $ UpperHeadingLevel $ '-' $ LowerHeadingLevel $ '\" \\h \\u '; + + //fldCharType + r3 := p.AddRun(); + r3.fldCharType := 'separate'; + End; + return p; + End; + + Function _AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); + Begin + ///获取标题列表 array((("Level":level,"Paragraph":"object","Text":title,"numId":,"ilvl":,"numArr":)); + numMap := array(); + r := docx_.Document().Body().GetHeadingListImpl(docx_, posOpt, UpperHeadingLevel, LowerHeadingLevel, numMap, true); + for i:=0 to length(r)-1 do Begin + p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, r[i]['Level'], i = 0 ? true: false); + //fldCharType + r4 := p.AddRun(); + r4.fldCharType := 'begin'; + + //instrText + bookmarke := _GetBookMarkId(r[i]['Paragraph']); + r5 := p.AddRun(); + r5.instrTextSpace := 'preserve'; + r5.instrText := ' HYPERLINK \\l ' $ bookmarke $ ' '; + + //fldCharType + r6 := p.AddRun(); + r6.fldCharType := 'separate'; + + //目录条目文字内容 + r7 := p.AddRun(); + r7.Font.Name := '宋体'; + numStr := ''; //数字项目编号 + if r[i]['numId'] then Begin + style := docx_.NumberingObject().NumberStyle(r[i]['numId']);//支持数字、字符串StyleId + if ifObj(style) then + numStr := style.GetText(r[i]['ilvl'], r[i]['numArr']); + End + r7.T := numStr + r[i]['Text']; + + //Tab + r8 := p.AddRun(); + r8.Tab := true; + + //fldCharType + r9 := p.AddRun(); + r9.fldCharType := 'begin'; + + //instrText + r10 := p.AddRun(); + r10.instrTextSpace := 'preserve'; + r10.instrText := ' PAGEREF ' $ bookmarke $ ' \\h '; + + //fldCharType + r11 := p.AddRun(); + r11.fldCharType := 'separate'; + + //页码 + r12 := p.AddRun(); + r12.T := '' $ r[i]['pageNo']; + + //fldCharType + r13 := p.AddRun(); + r13.fldCharType := 'end'; + + //fldCharType + r14 := p.AddRun(); + r14.fldCharType := 'end'; + + if r[i]['Level']+1 = UpperHeadingLevel then Begin //第一级标题,设置为粗体 + p.Format.rPr.Bold := true; + r4.rPr.Bold := true; + r5.rPr.Bold := true; + r6.rPr.Bold := true; + r7.rPr.Bold := true; + r8.rPr.Bold := true; + //r9.rPr.Bold := true; + r10.rPr.Bold := true; + //r11.rPr.Bold := true; + r12.Font.Bold := true; + //r13.rPr.Bold := true; + r14.rPr.Bold := true; + End; + _AddStdContent(p); + End; + End; + + ///更新目录 + Function UpdatePageNumbers(); + Begin + End; + + Function Marshal(); + Begin + return impl_.Marshal(); + End; + + Property Format read readFormat; + Function readFormat(); + Begin + return impl_.stdPr; + End; + + Property EndFormat read readEndFormat; + Function readEndFormat(); + Begin + return impl_.stdEndPr; + End; + + Property Font read readFont; + Function readFont(); + Begin + return impl_.stdPr.rPr; + End; + + Function _AddStdContent(o); + Begin + impl_.SdtContent.NewChildNode( array("field":"", "name":"w:p", "obj":o, "attrEx":"", "nodeType":"") ); + End; + + Function _GetStyle(level); + Begin + styleName := 'Tinysoft目录 ' $ (level + 1); + style := docx_.StyleObject().GetStyle(styleName); + if not ifObj(style) then Begin + style := TOfficeObj('TDocxStyle'); + style.wType := 'paragraph'; + style.CustomStyle := 1; + style.Name := styleName; + style.uiPriority := 0; + style.pPr.LeftChars := 200 * level; + style.rPr.Size := 20; + style.rPr.SzCs := 20; + docx_.StyleObject().AddStyle(style, 'TsToc' $ (level + 1)); + End; + return style.StyleId; + End; + + Function _GetBookMarkId(p); + Begin + node := p.node_.FirstChildElement('w:bookmarkStart'); + if ifObj(node) then + return node.GetAttribute('w:name'); + bookMarkID := docx_.Document().GetBookMarkID(); + return p.AddBookMark(); + End; + + Function _CheckNodes(name); + Begin + z := docx_.ZipObject(); + xml := z.Get('word/' + name); + if not ifObj(xml) then Begin + path := docx_.GetPath(); + if path[1] = '/' then Begin + fName := path + '/funcext/TSOffice/template/' + name; + End + else Begin + fName := path + '\\funcext\\TSOffice\\template\\' + name; + End; + if not ReadFile(rwraw(), '', fName, 0, 100 * 1024, xmlData) then + return; + z.Add('word/' + name, xmlData); + rels := 'word/_rels/document.xml.rels'; + relsObj := z.Get(rels); + [rId, target] := class(xlsxXml).FindRelationshipRid(relsObj, ''); + rId ++; + + if name = 'endnotes.xml' then Begin + class(xlsxXml).AddRelationshipRid(relsObj, name, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes', 'rId' $ rId); + contentType := z.Get('[Content_Types].xml'); + class(xlsxXml).AddOverrideContentType(contentType, '/word/' + name, 'application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml'); + End + else if name = 'footnotes.xml' then Begin + class(xlsxXml).AddRelationshipRid(relsObj, name, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes', 'rId' $ rId); + contentType := z.Get('[Content_Types].xml'); + class(xlsxXml).AddOverrideContentType(contentType, '/word/' + name, 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml'); + End; + End; + End; + + docx_; + node_; + impl_; +End; \ No newline at end of file diff --git a/funcext/TSOffice/document/docxDocument.tsf b/funcext/TSOffice/document/docxDocument.tsf new file mode 100644 index 0000000..2283060 --- /dev/null +++ b/funcext/TSOffice/document/docxDocument.tsf @@ -0,0 +1,53 @@ +Type docxDocument = Class + /// word/document.xml对象 + + ///缺省构造函数 + Function Create(z,xml); overload; + Begin + zipfile_ := z; + xml_ := xml; + document_ := zipfile_.Get('word/document.xml'); + root_ := document_.FirstChildElement('w:document'); + bodyNode_ := root_.FirstChildElement('w:body'); + body_ := TOfficeObj('TwBody'); + body_.InitNode(bodyNode_); + body_.zipfile_ := z; + body_.document_ := self; + bookmarkid_ := -1; + End; + + Function Body(); + Begin + return body_; + End; + + Function GetBookMarkID(); + Begin + if bookmarkid_ < 0 then Begin + bookmarkid_ := 0; + p := body_.node_.FirstChildElement('w:p'); + while ifObj(p) do Begin + markStart := p.FirstChildElement('w:bookmarkStart'); + if ifObj(markStart) then Begin + id := markStart.GetAttribute('w:id'); + if ifstring(id) then Begin + iVal := strtoint(id); + if bookmarkid_ <= iVal then + bookmarkid_ := iVal + 1; + End; + End; + p := p.NextElement('w:p'); + End; + End + else + bookmarkid_++; + return bookmarkid_; + End; +private + xml_; + root_;//w:document + bodyNode_;//w:body + body_; + document_; + bookmarkid_; +End; \ No newline at end of file diff --git a/funcext/TSOffice/template/default.docx b/funcext/TSOffice/template/default.docx new file mode 100644 index 0000000..b829cbb Binary files /dev/null and b/funcext/TSOffice/template/default.docx differ diff --git a/funcext/TSOffice/default.xlsx b/funcext/TSOffice/template/default.xlsx similarity index 100% rename from funcext/TSOffice/default.xlsx rename to funcext/TSOffice/template/default.xlsx diff --git a/funcext/TSOffice/template/faq.txt b/funcext/TSOffice/template/faq.txt new file mode 100644 index 0000000..d5dc8a3 --- /dev/null +++ b/funcext/TSOffice/template/faq.txt @@ -0,0 +1,36 @@ +*如何读取属性值? +对象的Value()函数可以获取属性值,例如: + ★读取段落对象文字大小: + size := paragraph.Font.Value('Size'); + ★读取段落对象StyleID(段落格式ID): + styleId := paragraph.Format.Value('StyleId'); + ★读取段落对象numId(数字编号ID): + numId := paragraph.Format.NumPr.Value('numId'); + +*如何修改属性值? +Apply()函数可以修改属性值,例如: + ★修改段落对象文字大小: + paragraph.Font.Size := 32; + paragraph.Apply(); + +*如何设置段落的项目编号? + ★推荐先获取文档中已有的项目符号numId;再设置新段落的项目编号: + numId := oldParagraph.Format.NumPr.Value('numId'); //获取已有段落项目编号ID + newParagraph.Format.NumPr.ID := numID; //设置新段落numID + newParagraph.Format.NumPr.Level := numID; //设置项目编号级别 + newParagraph.Apply(); + ★docx.Numberings()可以获取文档中已有的TNumberId对象列表,但编程的角度理解项目编码样式比较麻烦。 + ★docx.NumberingObject()(TNumbering对象),可以用户自己插入项目编码(innerXml串或自定义TNumberId对象)。 + ★系统默认提供的样式: + numId := docx.NumberingObject().NumberId('SingleLevel', 'decimal'); //数字型一级样式[如:1、] + numId := docx.NumberingObject().NumberId('SingleLevel', 'chinese'); //中文型一级样式[如:一、] + numId := docx.NumberingObject().NumberId('multilevel', 'decimal'); //数字型多级样式[如:1.1.1] + numId := docx.NumberingObject().NumberId('bullet', index); //项目编号,index取值0-6 + +*如何设置段落的样式? + ★推荐先获取文档中已有的段落样式;再设置新段落的样式: + styleId := oldParagraph.Format.Value('StyleId'); //获取已有段落StyleId + newParagraph.Format.StyleId := StyleId; //设置新段落StyleId + newParagraph.Apply(); + ★docx.StyleObject()(TDocxStyles对象),可以用户自己插入段落样式(innerXml串或自定义TDocxStyle对象)。 + \ No newline at end of file diff --git a/funcext/TSOffice/template/numbering/bullet0.xml b/funcext/TSOffice/template/numbering/bullet0.xml new file mode 100644 index 0000000..d6b69ac --- /dev/null +++ b/funcext/TSOffice/template/numbering/bullet0.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/bullet1.xml b/funcext/TSOffice/template/numbering/bullet1.xml new file mode 100644 index 0000000..84ce14c --- /dev/null +++ b/funcext/TSOffice/template/numbering/bullet1.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/bullet2.xml b/funcext/TSOffice/template/numbering/bullet2.xml new file mode 100644 index 0000000..d6bb559 --- /dev/null +++ b/funcext/TSOffice/template/numbering/bullet2.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/bullet3.xml b/funcext/TSOffice/template/numbering/bullet3.xml new file mode 100644 index 0000000..f214aca --- /dev/null +++ b/funcext/TSOffice/template/numbering/bullet3.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/bullet4.xml b/funcext/TSOffice/template/numbering/bullet4.xml new file mode 100644 index 0000000..de8a5d2 --- /dev/null +++ b/funcext/TSOffice/template/numbering/bullet4.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/bullet5.xml b/funcext/TSOffice/template/numbering/bullet5.xml new file mode 100644 index 0000000..609662a --- /dev/null +++ b/funcext/TSOffice/template/numbering/bullet5.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/bullet6.xml b/funcext/TSOffice/template/numbering/bullet6.xml new file mode 100644 index 0000000..e875547 --- /dev/null +++ b/funcext/TSOffice/template/numbering/bullet6.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/multilevel-decimal.xml b/funcext/TSOffice/template/numbering/multilevel-decimal.xml new file mode 100644 index 0000000..5545729 --- /dev/null +++ b/funcext/TSOffice/template/numbering/multilevel-decimal.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/numbering.xml b/funcext/TSOffice/template/numbering/numbering.xml new file mode 100644 index 0000000..003eff7 --- /dev/null +++ b/funcext/TSOffice/template/numbering/numbering.xml @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/funcext/TSOffice/template/numbering/singleLevel-chineseCounting.xml b/funcext/TSOffice/template/numbering/singleLevel-chineseCounting.xml new file mode 100644 index 0000000..3743291 --- /dev/null +++ b/funcext/TSOffice/template/numbering/singleLevel-chineseCounting.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/numbering/singleLevel-decimal.xml b/funcext/TSOffice/template/numbering/singleLevel-decimal.xml new file mode 100644 index 0000000..f312807 --- /dev/null +++ b/funcext/TSOffice/template/numbering/singleLevel-decimal.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/tinysoft.gif b/funcext/TSOffice/template/tinysoft.gif new file mode 100644 index 0000000..6ecb1e3 Binary files /dev/null and b/funcext/TSOffice/template/tinysoft.gif differ diff --git a/funcext/TSOffice/template/wStyle/Heading1.xml b/funcext/TSOffice/template/wStyle/Heading1.xml new file mode 100644 index 0000000..8956212 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading1.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading1Char.xml b/funcext/TSOffice/template/wStyle/Heading1Char.xml new file mode 100644 index 0000000..d9fc82f --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading1Char.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading2.xml b/funcext/TSOffice/template/wStyle/Heading2.xml new file mode 100644 index 0000000..4a7e86f --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading2.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading2Char.xml b/funcext/TSOffice/template/wStyle/Heading2Char.xml new file mode 100644 index 0000000..62637ae --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading2Char.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading3.xml b/funcext/TSOffice/template/wStyle/Heading3.xml new file mode 100644 index 0000000..878a445 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading3.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading3Char.xml b/funcext/TSOffice/template/wStyle/Heading3Char.xml new file mode 100644 index 0000000..b8541bb --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading3Char.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading4.xml b/funcext/TSOffice/template/wStyle/Heading4.xml new file mode 100644 index 0000000..64bbf1b --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading4.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading4Char.xml b/funcext/TSOffice/template/wStyle/Heading4Char.xml new file mode 100644 index 0000000..8e3df8d --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading4Char.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading5.xml b/funcext/TSOffice/template/wStyle/Heading5.xml new file mode 100644 index 0000000..e29b8c8 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading5.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading5Char.xml b/funcext/TSOffice/template/wStyle/Heading5Char.xml new file mode 100644 index 0000000..ba88710 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading5Char.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading6.xml b/funcext/TSOffice/template/wStyle/Heading6.xml new file mode 100644 index 0000000..f36e3a2 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading6.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading6Char.xml b/funcext/TSOffice/template/wStyle/Heading6Char.xml new file mode 100644 index 0000000..8836c33 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading6Char.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading7.xml b/funcext/TSOffice/template/wStyle/Heading7.xml new file mode 100644 index 0000000..726b3b3 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading7.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading7Char.xml b/funcext/TSOffice/template/wStyle/Heading7Char.xml new file mode 100644 index 0000000..76b0d6d --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading7Char.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading8.xml b/funcext/TSOffice/template/wStyle/Heading8.xml new file mode 100644 index 0000000..992e2dd --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading8.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading8Char.xml b/funcext/TSOffice/template/wStyle/Heading8Char.xml new file mode 100644 index 0000000..0db868f --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading8Char.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading9.xml b/funcext/TSOffice/template/wStyle/Heading9.xml new file mode 100644 index 0000000..cc59c41 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading9.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Heading9Char.xml b/funcext/TSOffice/template/wStyle/Heading9Char.xml new file mode 100644 index 0000000..bf5b53e --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Heading9Char.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/Title.xml b/funcext/TSOffice/template/wStyle/Title.xml new file mode 100644 index 0000000..fc3dbc1 --- /dev/null +++ b/funcext/TSOffice/template/wStyle/Title.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/template/wStyle/TitleChar.xml b/funcext/TSOffice/template/wStyle/TitleChar.xml new file mode 100644 index 0000000..37154ab --- /dev/null +++ b/funcext/TSOffice/template/wStyle/TitleChar.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/funcext/TSOffice/worksheet/xlsxAppProperty.tsf b/funcext/TSOffice/worksheet/xlsxAppProperty.tsf deleted file mode 100644 index a5268db..0000000 --- a/funcext/TSOffice/worksheet/xlsxAppProperty.tsf +++ /dev/null @@ -1,50 +0,0 @@ -Type xlsxAppProperty = Class - Function Create(file); overload; - Begin - file_ := file; - End; - - Function SetAppProps(appProps); - Begin - app_xml := file_.WorkBook().GetXmlFileObj('docProps/app.xml'); - node := app_xml.FirstChildElement('Properties'); - if not ifObj(node) then return array(1, "node::Properties can't be found"); - children_arr := appProps.Marshal()['children']; - for i:=0 to length(children_arr)-1 do - Begin - if children_arr[i]['name'] in array('ScaleCrop', 'LinksUpToDate', 'SharedDoc', 'HyperlinksChanged') then - Begin - children_arr[i]['children'][0]['value'] := children_arr[i]['children'][0]['value'] ? "true" : "false"; - End - delete_node := node.FirstChildElement(children_arr[i]['name']); - node.InsertAfterChild(delete_node, children_arr[i]); - node.DeleteChild(delete_node); - End - return array(0, ''); - End; - - Function GetAppProps(); - Begin - app_xml := file_.WorkBook().GetXmlFileObj('docProps/app.xml'); - node := app_xml.FirstChildElement('Properties'); - marshal := node.Marshal()[0]['children']; - reindex(marshal, marshal[:,'name']); - app_props := TOfficeObj('TAppProperty'); - app_props.Application := marshal['Application']['children'][0]['value']; - app_props.DocSecurity := marshal['DocSecurity']['children'][0]['value']; - app_props.ScaleCrop := marshal['DocSecurity']['children'][0]['value'] = "false" ? 0 : 1; - app_props.Company := marshal['Company']['children'][0]['value']; - app_props.LinksUpToDate := marshal['LinksUpToDate']['children'][0]['value'] = "false" ? 0 : 1; - app_props.SharedDoc := marshal['SharedDoc']['children'][0]['value'] = "false" ? 0 : 1; - app_props.AppVersion := marshal['AppVersion']['children'][0]['value']; - return array(0, app_props); - End - - class Function NewObject(file); - Begin - return new xlsxAppProperty(file); - End; - -private - file_; //TSExcelFile对象 -End; diff --git a/funcext/TSOffice/worksheet/xlsxChart.tsf b/funcext/TSOffice/worksheet/xlsxChart.tsf index ed32160..88dd19e 100644 --- a/funcext/TSOffice/worksheet/xlsxChart.tsf +++ b/funcext/TSOffice/worksheet/xlsxChart.tsf @@ -1,39 +1,19 @@ -Type xlsxChart = Class +Type xlsxChart = Class(TSChart) ///缺省构造函数 Function Create(sheet,excel); overload; Begin excel_ := excel; - sheetName_ := sheet; - chartId_ := excel_.WorkBook().GetFilesCount('xl/charts/chart') + 1; - [rid, drawingFileName, sheetFileName_, relsfile] := excel_.WorkBook().GetRelationshipRid(sheet, '../drawings/drawing'); - if drawingFileName = '' then Begin - rid++; - drawingRID_ := excel_.WorkBook().GetFilesCount('xl/drawings/drawing') + 1; - drawingFileName := '../drawings/drawing' + inttostr(drawingRID_) + '.xml'; - xlDrawingFileName_ := 'xl/drawings/drawing' + inttostr(drawingRID_) + '.xml'; - excel_.Zip().Add(xlDrawingFileName_, excel_.XmlObj().XmlHeader() + ''); - excel_.WorkBook().AddRelationshipRid(relsfile, drawingFileName, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', 'rId' + inttostr(rid)); - excel_.WorkBook().AddContentType('application/vnd.openxmlformats-officedocument.drawing+xml', '/' + xlDrawingFileName_); - // - sheetXmlObj := excel_.WorkBook().GetXmlFileObj(sheetFileName_); - node := sheetXmlObj.FirstChild('worksheet').InsertEndChild('element', 'drawing'); - node.SetAttribute('r:id', 'rId' + inttostr(rid)); - End - else Begin - xlDrawingFileName_ := 'xl/drawings/' + ExtractFileName(drawingFileName); - s := RightStr(xlDrawingFileName_, length(xlDrawingFileName_) - 19); - drawingRID_ := strtoint(leftstr(s, length(s) - 4)); - End; - drawingXmlObj_ := excel_.WorkBook().GetXmlFileObj(xlDrawingFileName_); - drawingRels := 'xl/drawings/_rels/drawing' + inttostr(drawingRID_) + '.xml.rels'; - if not excel_.WorkBook().FileIsExist(drawingRels) then Begin - excel_.Zip().Add(drawingRels, excel_.XmlObj().XmlHeader() + ''); - End - drawingRelsObj := excel_.WorkBook().GetXmlFileObj(drawingRels); + class(TSChart).Create(chartData); + chartId_ := excel.WorkBook().GetFilesCount('xl/charts/chart') + 1; + drawingRID_ := excel_.WorkBook().GetSheetDrawing(sheet); + drawingXmlObj_ := excel_.WorkBook().GetXmlFileObj('xl/drawings/drawing' $ drawingRID_ $ '.xml'); + drawingRelsObj := excel_.WorkBook().GetDrawingRelsFile(drawingRID_); [chartRid_, find] := class(xlsxXml).FindRelationshipRid(drawingRelsObj, ''); - excel_.WorkBook().AddRelationshipRid(drawingRels, '../charts/chart'+inttostr(chartId_)+'.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', 'rId' + inttostr(chartRid_ + 1)); + chartRid_ ++; + class(xlsxXml).AddRelationshipRid(drawingRelsObj, '../charts/chart'+inttostr(chartId_)+'.xml', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', 'rId' + inttostr(chartRid_)); xlChartFileName_ := 'xl/charts/chart'+inttostr(chartId_)+'.xml'; - excel_.WorkBook().AddContentType('application/vnd.openxmlformats-officedocument.drawingml.chart+xml', '/' + xlChartFileName_); + content_xml := excel_.WorkBook().GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + class(xlsxXml).AddOverrideContentType(content_xml, '/' + xlChartFileName_, 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'); End; class Function NewObject(sheet, excel); @@ -44,8 +24,13 @@ Type xlsxChart = Class return new xlsxChart(sheet, excel); End; - Function AddChart(range, chart); + Function AddChart(range, chartData); Begin + chartData_ := chartData; + excel_.Zip().Add(xlChartFileName_, GetDefaultXml()); + xmlObj := excel_.Zip().Get(xlChartFileName_); + Apply(xmlObj); + a := str2array(range,':'); if length(a) <> 2 then return array(1,'Invalid params.'); [err1, col1,row1] := excel_.CellNameToCoordinates(a[0]); @@ -53,17 +38,19 @@ Type xlsxChart = Class if err1 or err2 then return array(1,'Invalid params.'); o := TOfficeObj('TtwoCellAnchor'); o.XFrom.Col := col1 - 1; - o.XFrom.ColOff := chart.BegColOff ? chart.BegColOff : 0; + o.XFrom.ColOff := chartData.BegColOff ? chartData.BegColOff : 0; o.XFrom.Row := row1 - 1; - o.XFrom.RowOff := chart.BegRowOff ? chart.BegRowOff : 0; + o.XFrom.RowOff := chartData.BegRowOff ? chartData.BegRowOff : 0; o.XTo.Col := col2; - o.XTo.ColOff := chart.EndColOff ? chart.EndColOff : 0; + o.XTo.ColOff := chartData.EndColOff ? chartData.EndColOff : 0; o.XTo.Row := row2; - o.XTo.RowOff := chart.EndRowOff ? chart.EndRowOff : 0; + o.XTo.RowOff := chartData.EndRowOff ? chartData.EndRowOff : 0; - o.GraphicFrame.GraphicFramePr.Name := chart.Name ? chart.Name : 'Chart' + inttostr(chartId_); - o.GraphicFrame.GraphicFramePr.Id := getcNvPrID(drawingXmlObj_); + o.GraphicFrame.macro := ''; + o.GraphicFrame.GraphicFramePr.Name := chartData.Name ? chartData.Name : 'Chart' + inttostr(chartId_); + o.GraphicFrame.GraphicFramePr.Id := class(xlsxXml).GetcNvPrID(drawingXmlObj_); + o.GraphicFrame.GraphicFramePr.cNvGraphicFramePr := true; o.GraphicFrame.XFrm.Off.X := 0; o.GraphicFrame.XFrm.Off.Y := 0; @@ -71,964 +58,17 @@ Type xlsxChart = Class o.GraphicFrame.XFrm.Ext.Cy := 0; o.GraphicFrame.Graphic.GraphicData.uri := 'http://schemas.openxmlformats.org/drawingml/2006/chart'; - o.GraphicFrame.Graphic.GraphicData.Rid := 'rId' + inttostr(chartRid_ + 1); + o.GraphicFrame.Graphic.GraphicData.Rid := 'rId' + inttostr(chartRid_); o.GraphicFrame.Graphic.GraphicData.R := 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'; o.GraphicFrame.Graphic.GraphicData.C := 'http://schemas.openxmlformats.org/drawingml/2006/chart'; + o.ClientData.ObjectType := true; node := drawingXmlObj_.FirstChild('xdr:wsDr').InsertEndChild(o.Marshal()); - - plotArea := getPlotArea(chart);//设置图形 - chartXml := ' - - - - - - - <tx> - <rich> - <a:bodyPr anchorCtr="false" rot="0" spcFirstLastPara="false"></a:bodyPr> - <a:p> - <a:pPr> - <a:defRPr b="false" baseline="0" i="false" kern="1200" spc="0" strike="noStrike" sz="1400" u="none"> - <a:solidFill> - <a:schemeClr val="tx1"> - <a:lumMod val="65000"></a:lumMod> - <a:lumOff val="35000"></a:lumOff> - </a:schemeClr> - </a:solidFill> - <a:latin typeface="+mn-lt"></a:latin> - <a:ea typeface="+mn-ea"></a:ea> - <a:cs typeface="+mn-cs"></a:cs> - </a:defRPr> - </a:pPr> - <a:r> - <a:rPr altLang="en-US" b="false" baseline="0" i="false" kern="0" lang="en-US" spc="0"></a:rPr> - <a:t>Fruit 2D Column Chart</a:t> - </a:r> - </a:p> - </rich> - </tx> - <overlay val="0"></overlay> - <spPr></spPr> - <txPr> - <a:bodyPr anchorCtr="false" rot="0" spcFirstLastPara="false"></a:bodyPr> - <a:p> - <a:pPr> - <a:defRPr b="false" baseline="0" i="false" kern="1200" spc="0" strike="noStrike" sz="14000" u="none"></a:defRPr> - </a:pPr> - <a:endParaRPr lang="en-US"></a:endParaRPr> - </a:p> - </txPr> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'; - excel_.Zip().Add(xlChartFileName_, chartXml); - obj := excel_.WorkBook().GetXmlFileObj(xlChartFileName_); - task := array(('chartSpace/chart/title/tx/rich/a:p/a:r/a:t', 'pcdata', chart.Title), - ('chartSpace/chart/legend/legendPos', 'val', getLegendPosition(chart.Legend.Position)), - ('chartSpace/chart/dispBlanksAs', 'val', chart.ShowBlanksAs), - ('chartSpace/chart/legend', 'Del', chart.Legend.None), - ('chartSpace/chart/plotArea', 'unmarshal', plotArea.Marshal()), - ('chartSpace/chart/view3D', 'unmarshal', getview3D(chart).Marshal()) - ); - for i:=0 to length(task)-1 do Begin - class(xlsxXml).SetNodeValue(obj, task[i]); - End; End; private - Function getview3D(chart); - Begin - view3D := TOfficeObj('TView3D'); - chartView3DRotX := array( - 'area': 0, - 'areastacked': 0, - 'areapercentstacked': 0, - 'area3d': 15, - 'area3dstacked': 15, - 'area3dpercentstacked': 15, - 'bar': 0, - 'barstacked': 0, - 'barpercentstacked': 0, - 'bar3dclustered': 15, - 'bar3dstacked': 15, - 'bar3dpercentstacked': 15, - 'bar3dconeclustered': 15, - 'bar3dconestacked': 15, - 'bar3dconepercentstacked': 15, - 'bar3dpyramidclustered': 15, - 'bar3dpyramidstacked': 15, - 'bar3dpyramidpercentstacked': 15, - 'bar3dcylinderclustered': 15, - 'bar3dcylinderstacked': 15, - 'bar3dcylinderpercentstacked': 15, - 'col': 0, - 'colstacked': 0, - 'colpercentstacked': 0, - 'col3d': 15, - 'col3dclustered': 15, - 'col3dstacked': 15, - 'col3dpercentstacked': 15, - 'col3dcone': 15, - 'col3dconeclustered': 15, - 'col3dconestacked': 15, - 'col3dconepercentstacked': 15, - 'col3dpyramid': 15, - 'col3dpyramidclustered': 15, - 'col3dpyramidstacked': 15, - 'col3dpyramidpercentstacked': 15, - 'col3dcylinder': 15, - 'col3dcylinderclustered': 15, - 'col3dcylinderstacked': 15, - 'col3dcylinderpercentstacked': 15, - 'doughnut': 0, - 'line': 0, - 'pie': 0, - 'pie3d': 30, - 'pieofpiechart': 0, - 'barofpiechart': 0, - 'radar': 0, - 'scatter': 0, - 'surface3d': 15, - 'wireframesurface3d': 15, - 'contour': 90, - 'wireframecontour': 90); - chartView3DRotY := array( - 'area': 0, - 'areastacked': 0, - 'areapercentstacked': 0, - 'area3d': 20, - 'area3dstacked': 20, - 'area3dpercentstacked': 20, - 'bar': 0, - 'barstacked': 0, - 'barpercentstacked': 0, - 'bar3dclustered': 20, - 'bar3dstacked': 20, - 'bar3dpercentstacked': 20, - 'bar3dconeclustered': 20, - 'bar3dconestacked': 20, - 'bar3dconepercentstacked': 20, - 'bar3dpyramidclustered': 20, - 'bar3dpyramidstacked': 20, - 'bar3dpyramidpercentstacked': 20, - 'bar3dcylinderclustered': 20, - 'bar3dcylinderstacked': 20, - 'bar3dcylinderpercentstacked': 20, - 'col': 0, - 'colstacked': 0, - 'colpercentstacked': 0, - 'col3d': 20, - 'col3dclustered': 20, - 'col3dstacked': 20, - 'col3dpercentstacked': 20, - 'col3dcone': 20, - 'col3dconeclustered': 20, - 'col3dconestacked': 20, - 'col3dconepercentstacked': 20, - 'col3dpyramid': 20, - 'col3dpyramidclustered': 20, - 'col3dpyramidstacked': 20, - 'col3dpyramidpercentstacked': 20, - 'col3dcylinder': 20, - 'col3dcylinderclustered': 20, - 'col3dcylinderstacked': 20, - 'col3dcylinderpercentstacked': 20, - 'doughnut': 0, - 'line': 0, - 'pie': 0, - 'pie3d': 0, - 'pieofpiechart': 0, - 'barofpiechart': 0, - 'radar': 0, - 'scatter': 0, - 'surface3d': 20, - 'wireframesurface3d': 20, - 'contour': 0, - 'wireframecontour': 0); - chartView3DPerspective := array( - 'contour': 0, - 'wireframecontour': 0); - chartView3DRAngAx := array( - 'area': 0, - 'areastacked': 0, - 'areapercentstacked': 0, - 'area3d': 1, - 'area3dstacked': 1, - 'area3dpercentstacked': 1, - 'bar': 0, - 'barstacked': 0, - 'barpercentstacked': 0, - 'bar3dclustered': 1, - 'bar3dstacked': 1, - 'bar3dpercentstacked': 1, - 'bar3dconeclustered': 1, - 'bar3dconestacked': 1, - 'bar3dconepercentstacked': 1, - 'bar3dpyramidclustered': 1, - 'bar3dpyramidstacked': 1, - 'bar3dpyramidpercentstacked': 1, - 'bar3dcylinderclustered': 1, - 'bar3dcylinderstacked': 1, - 'bar3dcylinderpercentstacked': 1, - 'col': 0, - 'colstacked': 0, - 'colpercentstacked': 0, - 'col3d': 1, - 'col3dclustered': 1, - 'col3dstacked': 1, - 'col3dpercentstacked': 1, - 'col3dcone': 1, - 'col3dconeclustered': 1, - 'col3dconestacked': 1, - 'col3dconepercentstacked': 1, - 'col3dpyramid': 1, - 'col3dpyramidclustered': 1, - 'col3dpyramidstacked': 1, - 'col3dpyramidpercentstacked': 1, - 'col3dcylinder': 1, - 'col3dcylinderclustered': 1, - 'col3dcylinderstacked': 1, - 'col3dcylinderpercentstacked': 1, - 'doughnut': 0, - 'line': 0, - 'pie': 0, - 'pie3d': 0, - 'pieofpiechart': 0, - 'barofpiechart': 0, - 'radar': 0, - 'scatter': 0, - 'surface3d': 0, - 'wireframesurface3d': 0, - 'contour': 0, - 'bubble': 0, - 'bubble3d': 0); - view3D.RotX := chartView3DRotX[chart.Type]; - view3D.RotY := chartView3DRotY[chart.Type]; - view3D.Perspective := chartView3DPerspective[chart.Type]; - view3D.RAngAx := chartView3DRAngAx[chart.Type]; - return view3D; - End; - - Function getLegendPosition(t); - Begin - m := array("bottom": "b", - "left": "l", - "right": "r", - "top": "t", - "top_right": "tr"); - return m[t]; - End; - - Function getcNvPrID(obj); - Begin - cnt := 2; - node := obj.FirstChild('xdr:wsDr'); - if ifObj(node) then Begin - node := node.FirstChild(); - while ifObj(node) do Begin - if node.GetName() in array('xdr:oneCellAnchor', 'xdr:twoCellAnchor') then - cnt++; - node := node.NextElement(); - End; - End; - return cnt; - End; - - Function getPlotArea(chart); - Begin - o := TOfficeObj('TplotArea'); - chart.Type := lowercase(chart.Type); - case chart.Type of - 'area','areastacked','areapercentstacked','area3d','area3dstacked','area3dpercentstacked','bar','barstacked','barpercentstacked', - 'bar3dclustered','bar3dstacked','bar3dpercentstacked','bar3dconeclustered','bar3dconestacked','bar3dconepercentstacked', - 'bar3dpyramidclustered','bar3dpyramidstacked','bar3dpyramidpercentstacked','bar3dcylinderclustered','bar3dcylinderstacked', - 'bar3dcylinderpercentstacked','col','colstacked','colpercentstacked','col3d','col3dclustered','col3dstacked','col3dpercentstacked', - 'col3dcone','col3dconeclustered','col3dconestacked','col3dconepercentstacked','col3dpyramid','col3dpyramidclustered', - 'col3dpyramidstacked','col3dpyramidpercentstacked','col3dcylinder','col3dcylinderclustered','col3dcylinderstacked', - 'col3dcylinderpercentstacked','bubble','bubble3d': - drawBaseChart(o, chart); - 'doughnut': - Begin - drawExtChart(o, chart, 'doughnutChart'); - o.Chart.HoleSize := 75; - End - 'line': - drawLineChart(o, chart); - 'pie3d': - drawExtChart(o, chart, 'pie3DChart'); - 'pie': - drawExtChart(o, chart, 'pieChart'); - 'pieofpiechart': - Begin - drawExtChart(o, chart, 'ofPieChart'); - o.Chart.OfPieType := 'pie'; - End - 'barofpiechart': - Begin - drawExtChart(o, chart, 'ofPieChart'); - o.Chart.OfPieType := 'bar'; - End - 'radar': - drawRadarChart(o, chart); - 'scatter': - drawScatterChart(o, chart); - 'surface3d','wireframesurface3d': - drawSurface3DChart(o, chart, 'surface3DChart'); - 'contour','wireframecontour': - drawSurface3DChart(o, chart, 'surfaceChart'); - End; - return o; - End; - - Function drawSurface3DChart(o, chart, name); - Begin - o.Chart.NodeName := name; - setChartSer(o, chart); - o.Chart.Axid := 754001152; - o.Chart.Axid2 := 753999904; - o.Chart.Axid3 := 832256642; - setCatAx(o.CatAx, chart); - setValAx(o.ValAx, chart); - setSerAx(o.SerAx, chart); - if chart.Type in array( 'wireframesurface3d', 'wireframecontour' ) then - o.Chart.Wireframe := true; - End; - - Function drawScatterChart(o, chart); - Begin - o.Chart.NodeName := 'scatterChart'; - o.Chart.ScatterStyle := 'smoothMarker'; - o.Chart.VaryColors := false; - setChartSer(o, chart); - setDLbls(o.Chart.DLbls, chart); - o.Chart.Axid := 754001152; - o.Chart.Axid2 := 753999904; - setCatAx(o.CatAx, chart); - setValAx(o.ValAx, chart); - End; - - Function drawRadarChart(o, chart); - Begin - o.Chart.NodeName := 'radarChart'; - o.Chart.RadarStyle := 'marker'; - o.Chart.VaryColors := false; - setChartSer(o, chart); - setDLbls(o.Chart.DLbls, chart); - o.Chart.Axid := 754001152; - o.Chart.Axid2 := 753999904; - setCatAx(o.CatAx, chart); - setValAx(o.ValAx, chart); - End; - - Function drawExtChart(o, chart, name); - Begin - o.Chart.NodeName := name; - o.Chart.VaryColors := chart.VaryColors; - setChartSer(o, chart); - End; - - Function drawLineChart(o, chart); - Begin - o.Chart.NodeName := 'lineChart'; - o.Chart.Grouping := getGrouping(chart.Type); - o.Chart.VaryColors := false; - setChartSer(o, chart); - setDLbls(o.Chart.DLbls, chart); - o.Chart.Smooth := false; - o.Chart.Axid := 754001152; - o.Chart.Axid2 := 753999904; - setCatAx(o.CatAx, chart); - setValAx(o.ValAx, chart); - End; - - Function drawBaseChart(o, chart); - Begin - o.Chart.BarDir := getBarDir(chart.Type); - o.Chart.Grouping := getGrouping(chart.Type); - o.Chart.VaryColors := chart.VaryColors; - o.Chart.Overlap := getVaryColors(chart.Type); - o.Chart.Axid := 754001152; - o.Chart.Axid2 := 753999904; - o.Chart.NodeName := getChartName(chart.Type); - setChartSer(o, chart); - o.Chart.Shape := getSharp(chart.Type); - setDLbls(o.Chart.DLbls, chart); - setCatAx(o.CatAx, chart); - setValAx(o.ValAx, chart); - End; - - Function setSerAx(SerAx, chart); - Begin - SerAx.AxID := 832256642; - SerAx.Scaling.Max := chart.YAxis.Max; - SerAx.Scaling.Min := chart.YAxis.Min; - CatAx.Scaling.Orientation := chart.YAxis.ReverseOrder ? 'maxMin' : 'minMax'; - SerAx.Del := chart.YAxis.None; - SerAx.AxPos := chart.XAxis.ReverseOrder ? 't' : 'b'; - SerAx.TickLblPos := 'nextTo'; - drawPlotAreaSpPr(SerAx.SpPr); - drawPlotAreaTxPr(SerAx.TxPr); - SerAx.CrossAx := 753999904; - End; - - Function setCatAx(CatAx, chart); - Begin - CatAx.AxID := 754001152; - CatAx.Scaling.Max := chart.XAxis.Max; - CatAx.Scaling.Min := chart.XAxis.Min; - CatAx.Scaling.Orientation := chart.XAxis.ReverseOrder ? 'maxMin' : 'minMax'; - CatAx.Del := chart.XAxis.None; - CatAx.AxPos := chart.XAxis.ReverseOrder ? 't' : 'b'; - CatAx.NumFmt.FormatCode := 'General'; - CatAx.NumFmt.SourceLinked := true; - CatAx.MajorTickMark := 'none'; - CatAx.MinorTickMark := 'none'; - CatAx.TickLblPos := 'nextTo'; - drawPlotAreaSpPr(CatAx.SpPr); - drawPlotAreaTxPr(CatAx.TxPr); - CatAx.CrossAx := 753999904; - CatAx.Crosses := 'autoZero'; - CatAx.Auto := true; - CatAx.LblAlgn := 'ctr'; - CatAx.LblOffset := 100; - CatAx.NoMultiLvlLbl := false; - if chart.XAxis.MajorGridlines then - drawPlotAreaSpPr(CatAx.MajorGridlines.SpPr); - if chart.XAxis.MinorGridlines then - drawPlotAreaSpPr(CatAx.MinorGridlines.SpPr); - if chart.XAxis.TickLabelSkip then - CatAx.TickLabelSkip := chart.XAxis.TickLabelSkip; - End; - - Function setValAx(ValAx, chart); - Begin - ValAx.AxID := 753999904; - ValAx.Scaling.Max := chart.YAxis.Max; - ValAx.Scaling.Min := chart.YAxis.Min; - if ifint(chart.YAxis.LogBase) and chart.YAxis.LogBase >= 2 and chart.YAxis.LogBase <= 1000 then - ValAx.Scaling.LogBase := chart.YAxis.LogBase; - ValAx.Scaling.Orientation := chart.YAxis.ReverseOrder ? 'maxMin' : 'minMax'; - ValAx.Del := chart.YAxis.None; - ValAx.AxPos := chart.YAxis.ReverseOrder ? 'r' : 'l'; - ValAx.NumFmt.FormatCode := chartValAxNumFmtFormatCode(chart.Type); - ValAx.NumFmt.SourceLinked := true; - ValAx.MajorTickMark := 'none'; - ValAx.MinorTickMark := 'none'; - ValAx.TickLblPos := 'nextTo'; - drawPlotAreaSpPr(ValAx.SpPr); - drawPlotAreaTxPr(ValAx.TxPr); - ValAx.CrossAx := 754001152; - ValAx.Crosses := 'autoZero'; - ValAx.CrossBetween := chartValAxCrossBetween(chart.Type); - if chart.XAxis.MajorGridlines then - drawPlotAreaSpPr(ValAx.MajorGridlines.SpPr); - if chart.XAxis.MinorGridlines then - drawPlotAreaSpPr(ValAx.MinorGridlines.SpPr); - ValAx.MajorUnit := chart.YAxis.MajorUnit; - if chart.Type in array('contour', 'wireframecontour') then - ValAx.TickLblPos := 'none'; - End; - - Function chartValAxCrossBetween(t); - Begin - m := array( - 'area': ’midCat’, - 'areastacked': ’midCat’, - 'areapercentstacked': ’midCat’, - 'area3d': ’midCat’, - 'area3dstacked': ’midCat’, - 'area3dpercentstacked': ’midCat’, - 'bar': ’between’, - 'barstacked': ’between’, - 'barpercentstacked': ’between’, - 'bar3dclustered': ’between’, - 'bar3dstacked': ’between’, - 'bar3dpercentstacked': ’between’, - 'bar3dconeclustered': ’between’, - 'bar3dconestacked': ’between’, - 'bar3dconepercentstacked': ’between’, - 'bar3dpyramidclustered': ’between’, - 'bar3dpyramidstacked': ’between’, - 'bar3dpyramidpercentstacked': ’between’, - 'bar3dcylinderclustered': ’between’, - 'bar3dcylinderstacked': ’between’, - 'bar3dcylinderpercentstacked': ’between’, - 'col': ’between’, - 'colstacked': ’between’, - 'colpercentstacked': ’between’, - 'col3d': ’between’, - 'col3dclustered': ’between’, - 'col3dstacked': ’between’, - 'col3dpercentstacked': ’between’, - 'col3dcone': ’between’, - 'col3dconeclustered': ’between’, - 'col3dconestacked': ’between’, - 'col3dconepercentstacked': ’between’, - 'col3dpyramid': ’between’, - 'col3dpyramidclustered': ’between’, - 'col3dpyramidstacked': ’between’, - 'col3dpyramidpercentstacked': ’between’, - 'col3dcylinder': ’between’, - 'col3dcylinderclustered': ’between’, - 'col3dcylinderstacked': ’between’, - 'col3dcylinderpercentstacked': ’between’, - 'doughnut': ’between’, - 'line': ’between’, - 'pie': ’between’, - 'pie3d': ’between’, - 'pieofpiechart': ’between’, - 'barofpiechart': ’between’, - 'radar': ’between’, - 'scatter': ’between’, - 'surface3d': ’midCat’, - 'wireframesurface3d': ’midCat’, - 'contour': ’midCat’, - 'wireframecontour': ’midCat’, - 'bubble': ’midCat’, - 'bubble3d': ’midCat’); - return m[t]; - End; - - Function chartValAxNumFmtFormatCode(t); - Begin - m := array( - 'area': 'General', - 'areastacked': 'General', - 'areapercentstacked': '0%', - 'area3d': 'General', - 'area3dstacked': 'General', - 'area3dpercentstacked': '0%', - 'bar': 'General', - 'barstacked': 'General', - 'barpercentstacked': '0%', - 'bar3dclustered': 'General', - 'bar3dstacked': 'General', - 'bar3dpercentstacked': '0%', - 'bar3dconeclustered': 'General', - 'bar3dconestacked': 'General', - 'bar3dconepercentstacked': '0%', - 'bar3dpyramidclustered': 'General', - 'bar3dpyramidstacked': 'General', - 'bar3dpyramidpercentstacked': '0%', - 'bar3dcylinderclustered': 'General', - 'bar3dcylinderstacked': 'General', - 'bar3dcylinderpercentstacked': '0%', - 'col': 'General', - 'colstacked': 'General', - 'colpercentstacked': '0%', - 'col3d': 'General', - 'col3dclustered': 'General', - 'col3dstacked': 'General', - 'col3dpercentstacked': '0%', - 'col3dcone': 'General', - 'col3dconeclustered': 'General', - 'col3dconestacked': 'General', - 'col3dconepercentstacked': '0%', - 'col3dpyramid': 'General', - 'col3dpyramidclustered': 'General', - 'col3dpyramidstacked': 'General', - 'col3dpyramidpercentstacked': '0%', - 'col3dcylinder': 'General', - 'col3dcylinderclustered': 'General', - 'col3dcylinderstacked': 'General', - 'col3dcylinderpercentstacked': '0%', - 'doughnut': 'General', - 'line': 'General', - 'pie': 'General', - 'pie3d': 'General', - 'pieofpiechart': 'General', - 'barofpiechart': 'General', - 'radar': 'General', - 'scatter': 'General', - 'surface3d': 'General', - 'wireframesurface3d': 'General', - 'contour': 'General', - 'wireframecontour': 'General', - 'bubble': 'General', - 'bubble3d': 'General'); - return m[t]; - End; - - Function drawPlotAreaTxPr(TxPr); - Begin - TxPr.BodyPr.Rot := -60000000; - TxPr.BodyPr.SpcFirstLastPara := true; - TxPr.BodyPr.VertOverflow := 'ellipsis'; - TxPr.BodyPr.Vert := 'horz'; - TxPr.BodyPr.Wrap := 'square'; - TxPr.BodyPr.Anchor := 'ctr'; - TxPr.BodyPr.AnchorCtr := true; - TxPr.P.PPr.DefRPr.Sz := 900; - TxPr.P.PPr.DefRPr.B := false; - TxPr.P.PPr.DefRPr.I := false; - TxPr.P.PPr.DefRPr.U := 'none'; - TxPr.P.PPr.DefRPr.Strike := 'noStrike'; - TxPr.P.PPr.DefRPr.Kern := 1200; - TxPr.P.PPr.DefRPr.Baseline := 0; - TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.Val := 'tx1'; - TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.LumMod := 15000; - TxPr.P.PPr.DefRPr.SolidFill.SchemeClr.LumOff := 85000; - TxPr.P.PPr.DefRPr.Latin.Typeface := '+mn-lt'; - TxPr.P.PPr.DefRPr.Ea.Typeface := '+mn-ea'; - TxPr.P.PPr.DefRPr.Cs.Typeface := '+mn-cs'; - TxPr.P.EndParaRPr.Lang := 'en-US'; - End; - - Function drawPlotAreaSpPr(SpPr); - Begin - SpPr.Ln.W := 9525; - SpPr.Ln.Cap := 'flat'; - SpPr.Ln.Cmpd := 'sng'; - SpPr.Ln.Algn := 'ctr'; - SpPr.Ln.SolidFill.SchemeClr.Val := 'tx1'; - SpPr.Ln.SolidFill.SchemeClr.LumMod := 15000; - SpPr.Ln.SolidFill.SchemeClr.LumOff := 85000; - End; - - Function setChartSer(o, chart); - Begin - SerArr := array(); - for i:=0 to length(chart.Series)-1 do Begin - ser := TOfficeObj('TSer'); - SerArr union= array(('name':'ser','obj':ser,'attrEx':'','nodeType':'','attrName':'')); - ser.NodeName := 'ser'; - ser.IDx := i + chart.Ord; - ser.Ord := i + chart.Ord; - ser.Tx.StrRef.F := chart.Series[i]['Name']; - setSpPr(ser.SpPr, chart, i); - setMarker(ser.Marker, chart, i); - setDpt(ser.Dpt, chart, i); - setDLbls(ser.DLbls, chart); - ser.InvertIfNegative := false; - setCat(ser.Cat, chart, i); - setVal(ser.Val, chart, i); - setXVal(ser.XVal, chart, i); - setYVal(ser.YVal, chart, i); - setBubbleSize(ser.BubbleSize, chart, i); - setBubble3D(ser.Bubble3D, chart, i); - End; - o.Chart.Ser := SerArr; - End; - - Function setBubble3D(Bubble3D, chart, i); - Begin - if chart.Type <> 'bubble3d' then return; - Bubble3D := true; - End; - - Function setBubbleSize(BubbleSize, chart, i); - Begin - if not (chart.Type in array('bubble', 'bubble3d')) then return; - BubbleSize.NumRef.F := chart.Series[i]['Values']; - End; - - Function setYVal(Val, chart, i); - Begin - if not (chart.Type in array('scatter', 'bubble', 'bubble3d')) then return; - Val.NumRef.F := chart.Series[i]['Values']; - End; - - Function setXVal(xVal, chart, i); - Begin - if not (chart.Type in array('scatter')) then return; - xVal.StrRef.F := chart.Series[i]['Categories']; - End; - - Function setVal(Val, chart, i); - Begin - if chart.Type in array('scatter', 'bubble', 'bubble3d') then return; - Val.NumRef.F := chart.Series[i]['Values']; - End; - - Function setCat(Cat, chart, i); - Begin - if chart.Type in array('scatter', 'bubble', 'bubble3d') then return; - cat.StrRef.F := chart.Series[i]['Categories']; - End; - - Function setDLbls(DLbls, chart); - Begin - if chart.Type in array('scatter','surface3d', 'wireframesurface3d', 'contour', 'wireframecontour', 'bubble', 'bubble3d') then - return; - DLbls.ShowLegendKey := chart.Legend.ShowLegendKey; - DLbls.ShowVal := chart.Plotarea.ShowVal; - DLbls.ShowCatName := chart.Plotarea.ShowCatName; - DLbls.ShowSerName := chart.Plotarea.ShowSerName; - DLbls.ShowBubbleSize := chart.Plotarea.ShowBubbleSize; - DLbls.ShowPercent := chart.Plotarea.ShowPercent; - DLbls.ShowLeaderLines := chart.Plotarea.ShowLeaderLines; - End; - - Function setDpt(Dpt, chart, i); - Begin - if chart.Type in array('pie','pie3d') then Begin - Dpt.IDx := i; - Dpt.Bubble3D := false; - Dpt.SpPr.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); - Dpt.SpPr.Ln.W := 25400; - Dpt.SpPr.Ln.Cap := 'rnd'; - Dpt.SpPr.Ln.SolidFill.SchemeClr.Val := 'lt' $ (i + 1); - Dpt.SpPr.Sp3D.ContourW := 25400; - Dpt.SpPr.Sp3D.ContourClr.SchemeClr.Val := 'lt' $ (i + 1); - End; - End; - - Function setMarker(Marker, chart, i); - Begin - if not (chart.Type in array('scatter', 'line')) then return; - if chart.Type = 'scatter' then - Marker.Symbol := 'circle'; - Marker.Size := 5; - if ifstring(chart.Series[i]['Symbol']) then - Marker.Symbol := chart.Series[i]['Symbol']; - if ifint(chart.Series[i]['Size']) then - Marker.Size := chart.Series[i]['Size']; - - if i < 6 then Begin - marker.SpPr.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); - Marker.SpPr.Ln.W := 9252; - Marker.SpPr.Ln.SolidFill.SchemeClr.Val := 'accent' $ (i + 1); - End; - End; - - Function setSppr(SpPr, chart, i); - Begin - if chart.Type = 'line' then Begin - SpPr.Ln.W := 25400; - SpPr.Ln.NoFill := ' '; - return; - End; - if chart.Type = 'scatter' then Begin - w := chart.Series[i]['LineWidth']; - SpPr.Ln.W := 0.25 > w || w > 999 ? 25400 : 12700 * w; - SpPr.Ln.Cap := 'rnd'; - SpPr.Ln.SolidFill.SchemeClr.Val := 'accent' $ ((chart.Ord+i)%6+1); - return; - End; - End; - - Function getSharp(t); - Begin - m := array( - 'bar3dconeclustered': 'cone', - 'bar3dconestacked': 'cone', - 'bar3dconepercentstacked': 'cone', - 'bar3dpyramidclustered': 'pyramid', - 'bar3dpyramidstacked': 'pyramid', - 'bar3dpyramidpercentstacked': 'pyramid', - 'bar3dcylinderclustered': 'cylinder', - 'bar3dcylinderstacked': 'cylinder', - 'bar3dcylinderpercentstacked': 'cylinder', - 'col3dcone': 'cone', - 'col3dconeclustered': 'cone', - 'col3dconestacked': 'cone', - 'col3dconepercentstacked': 'cone', - 'col3dpyramid': 'pyramid', - 'col3dpyramidclustered': 'pyramid', - 'col3dpyramidstacked': 'pyramid', - 'col3dpyramidpercentstacked': 'pyramid', - 'col3dcylinder': 'cylinder', - 'col3dcylinderclustered': 'cylinder', - 'col3dcylinderstacked': 'cylinder', - 'col3dcylinderpercentstacked': 'cylinder'); - return m[t]; - End; - - Function getChartName(t); - Begin - m := array( - 'area': 'areaChart', - 'areastacked': 'areaChart', - 'areapercentstacked': 'areaChart', - 'area3d': 'area3DChart', - 'area3dstacked': 'area3DChart', - 'area3dpercentstacked': 'area3DChart', - 'bar': 'barChart', - 'barstacked': 'barChart', - 'barpercentstacked': 'barChart', - 'bar3dclustered': 'bar3DChart', - 'bar3dstacked': 'bar3DChart', - 'bar3dpercentstacked': 'bar3DChart', - 'bar3dconeclustered': 'bar3DChart', - 'bar3dconestacked': 'bar3DChart', - 'bar3dconepercentstacked': 'bar3DChart', - 'bar3dpyramidclustered': 'bar3DChart', - 'bar3dpyramidstacked': 'bar3DChart', - 'bar3dpyramidpercentstacked': 'bar3DChart', - 'bar3dcylinderclustered': 'bar3DChart', - 'bar3dcylinderstacked': 'bar3DChart', - 'bar3dcylinderpercentstacked': 'bar3DChart', - 'col': 'barChart', - 'colstacked': 'barChart', - 'colpercentstacked': 'barChart', - 'col3d': 'bar3DChart', - 'col3dclustered': 'bar3DChart', - 'col3dstacked': 'bar3DChart', - 'col3dpercentstacked': 'bar3DChart', - 'col3dcone': 'bar3DChart', - 'col3dconeclustered': 'bar3DChart', - 'col3dconestacked': 'bar3DChart', - 'col3dconepercentstacked': 'bar3DChart', - 'col3dpyramid': 'bar3DChart', - 'col3dpyramidclustered': 'bar3DChart', - 'col3dpyramidstacked': 'bar3DChart', - 'col3dpyramidpercentstacked': 'bar3DChart', - 'col3dcylinder': 'bar3DChart', - 'col3dcylinderclustered': 'bar3DChart', - 'col3dcylinderstacked': 'bar3DChart', - 'col3dcylinderpercentstacked': 'bar3DChart', - 'bubble': 'bubbleChart', - 'bubble3D': 'bubbleChart'); - return m[t]; - End; - - Function getVaryColors(t); - Begin - m := array( - 'barstacked': 100, - 'barpercentstacked': 100, - 'colstacked': 100, - 'colpercentstacked': 100 - ); - return m[t]; - End; - - Function getGrouping(t); - Begin - m := array( - 'area': 'standard', - 'areastacked': 'stacked', - 'areapercentstacked': 'percentstacked', - 'area3d': 'standard', - 'area3dstacked': 'stacked', - 'area3dpercentstacked': 'percentstacked', - 'bar': 'clustered', - 'barstacked': 'stacked', - 'barpercentstacked': 'percentstacked', - 'bar3dclustered': 'clustered', - 'bar3dstacked': 'stacked', - 'bar3dpercentstacked': 'percentstacked', - 'bar3dconeclustered': 'clustered', - 'bar3dconestacked': 'stacked', - 'bar3dconepercentstacked': 'percentstacked', - 'bar3dpyramidclustered': 'clustered', - 'bar3dpyramidstacked': 'stacked', - 'bar3dpyramidpercentstacked': 'percentstacked', - 'bar3dcylinderclustered': 'clustered', - 'bar3dcylinderstacked': 'stacked', - 'bar3dcylinderpercentstacked': 'percentstacked', - 'col': 'clustered', - 'colstacked': 'stacked', - 'colpercentstacked': 'percentstacked', - 'col3d': 'standard', - 'col3dclustered': 'clustered', - 'col3dstacked': 'stacked', - 'col3dpercentstacked': 'percentstacked', - 'col3dcone': 'standard', - 'col3dconeclustered': 'clustered', - 'col3dconestacked': 'stacked', - 'col3dconepercentstacked': 'percentstacked', - 'col3dpyramid': 'standard', - 'col3dpyramidclustered': 'clustered', - 'col3dpyramidstacked': 'stacked', - 'col3dpyramidpercentstacked': 'percentstacked', - 'col3dcylinder': 'standard', - 'col3dcylinderclustered': 'clustered', - 'col3dcylinderstacked': 'stacked', - 'col3dcylinderpercentstacked': 'percentstacked', - 'line': 'standard'); - return m[t]; - End; - - Function getBarDir(t); - Begin - m := array( - 'bar': 'bar', - 'barstacked': 'bar', - 'barpercentstacked': 'bar', - 'bar3dclustered': 'bar', - 'bar3dstacked': 'bar', - 'bar3dpercentstacked': 'bar', - 'bar3dconeclustered': 'bar', - 'bar3dconestacked': 'bar', - 'bar3dconepercentstacked': 'bar', - 'bar3dpyramidclustered': 'bar', - 'bar3dpyramidstacked': 'bar', - 'bar3dpyramidpercentstacked': 'bar', - 'bar3dcylinderclustered': 'bar', - 'bar3dcylinderstacked': 'bar', - 'bar3dcylinderpercentstacked': 'bar', - 'col': 'col', - 'colstacked': 'col', - 'colpercentstacked': 'col', - 'col3d': 'col', - 'col3dclustered': 'col', - 'col3dstacked': 'col', - 'col3dpercentstacked': 'col', - 'col3dcone': 'col', - 'col3dconestacked': 'col', - 'col3dconeclustered': 'col', - 'col3dconepercentstacked': 'col', - 'col3dpyramid': 'col', - 'col3dpyramidclustered': 'col', - 'col3dpyramidstacked': 'col', - 'col3dpyramidpercentstacked': 'col', - 'col3dcylinder': 'col', - 'col3dcylinderclustered': 'col', - 'col3dcylinderstacked': 'col', - 'col3dcylinderpercentstacked': 'col', - 'line': 'standard'); - return m[t]; - End; - - sheetName_:string; //sheet名称 - sheetFileName_; //xl/worksheets/sheetN.xml - xlChartFileName_:string; - xlDrawingFileName_:string; //'xl/drawings/drawingN.xml'; - drawingXmlObj_; + excel_; drawingRID_:integer; chartId_; chartRid_; - excel_;//TSExcelFile对象 -End; \ No newline at end of file + xlChartFileName_; + drawingXmlObj_; +End; diff --git a/funcext/TSOffice/worksheet/xlsxComment.tsf b/funcext/TSOffice/worksheet/xlsxComment.tsf index 65404a8..a92c64e 100644 --- a/funcext/TSOffice/worksheet/xlsxComment.tsf +++ b/funcext/TSOffice/worksheet/xlsxComment.tsf @@ -12,7 +12,7 @@ Type xlsxComment = Class commentId_ := excel_.WorkBook().GetFilesCount('xl/comments') + 1; commentFileName_ := '../comments' + inttostr(commentId_) + '.xml'; xlCommentFileName := 'xl/comments' + inttostr(commentId_) + '.xml'; - excel_.Zip().Add(xlCommentFileName, excel_.XmlObj().XmlHeader() + ''); + excel_.Zip().Add(xlCommentFileName, class(xlsxXml).XmlHeader() + ''); excel_.WorkBook().AddRelationshipRid(relsfile, commentFileName_, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', rId_); rid ++; drawingVML_ := '../drawings/vmlDrawing' + inttostr(commentId_) + '.vml'; @@ -33,8 +33,9 @@ xmlns:v="urn:schemas-microsoft-com:vml"> '); excel_.WorkBook().AddRelationshipRid(relsfile, drawingVML_, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', 'rId' + inttostr(rid)); - excel_.WorkBook().AddContentType('application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml', '/' + xlCommentFileName); - excel_.WorkBook().AddContentVml(); + content_xml := excel_.WorkBook().GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + class(xlsxXml).AddOverrideContentType(content_xml, '/' + xlCommentFileName, 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml'); + class(xlsxXml).AddDefaultContentType(content_xml, 'vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'); sheetXml := excel_.WorkBook().GetSheetXmlfile(sheetName_).FirstChildElement('worksheet'); legacy := sheetXml.FirstChildElement('legacyDrawing'); @@ -78,7 +79,7 @@ xmlns:v="urn:schemas-microsoft-com:vml"> commentXmlFile_.FirstChildElement('comments').FirstChildElement('authors').InsertEndChild('element', 'author', author);//添加作者 authors_[author] := authorId; End; - if not ifstring(comment) then return array(1, 'comment is not a string'); + if not ifstring(comment) then return 'comment is not a string'; comments := TOfficeObj('TComments'); comments.Ref := cell; comments.AuthorId := authorId; @@ -129,7 +130,7 @@ xmlns:v="urn:schemas-microsoft-com:vml"> //xmlObj.Print; End; End; - return array(0, 'ok'); + return 'ok'; End; Function getComment(cell); diff --git a/funcext/TSOffice/worksheet/xlsxDocProps.tsf b/funcext/TSOffice/worksheet/xlsxDocProps.tsf new file mode 100644 index 0000000..4e2fbeb --- /dev/null +++ b/funcext/TSOffice/worksheet/xlsxDocProps.tsf @@ -0,0 +1,49 @@ +Type xlsxDocProps = Class + Function Create(file); overload; + Begin + excel_ := file; + End; + + Function SetAppProps(appProps); + Begin + app_xml := excel_.WorkBook().GetXmlFileObj('docProps/app.xml'); + node := app_xml.FirstChildElement('Properties'); + if not ifObj(node) then return "node::Properties can't be found"; + marshal := appProps.Marshal(); + class(xlsxXml).UpdateNode(node, marshal['attributes'], marshal['children']); + End; + + Function GetAppProps(); + Begin + app_xml := excel_.WorkBook().GetXmlFileObj('docProps/app.xml'); + node := app_xml.FirstChildElement('Properties'); + app_props := TOfficeObj('TAppProperty'); + app_props.RootObj := node; + return app_props; + End + + Function SetCoreProps(appProps); + Begin + core_xml := excel_.WorkBook().GetXmlFileObj('docProps/core.xml'); + node := core_xml.FirstChildElement('cp:coreProperties'); + marshal := appProps.Marshal(); + class(xlsxXml).UpdateNode(node, marshal['attributes'], marshal['children']); + End + + Function GetCoreProps(); + Begin + core_xml := excel_.WorkBook().GetXmlFileObj('docProps/core.xml'); + node := core_xml.FirstChildElement('cp:coreProperties'); + core_props := TOfficeObj('TCoreProperty'); + core_props.RootObj := node; + return core_props; + End + + class Function NewObject(file); + Begin + return new xlsxDocProps(file); + End; + +private + excel_; //TSExcelFile对象 +End; diff --git a/funcext/TSOffice/worksheet/xlsxHeaderFooter.tsf b/funcext/TSOffice/worksheet/xlsxHeaderFooter.tsf index 9b2ed64..e693e16 100644 --- a/funcext/TSOffice/worksheet/xlsxHeaderFooter.tsf +++ b/funcext/TSOffice/worksheet/xlsxHeaderFooter.tsf @@ -22,11 +22,15 @@ Type xlsxHeaderFooter = Class header_node := node.FirstChildElement('headerFooter'); if ifObj(header_node) then node.DeleteChild(header_node); - node.InsertEndChild(headerFooter.Marshal()); + page_node := node.FirstChildElement('pageMargins'); + if ifObj(page_node) then + node.InsertAfterChild(page_node, headerFooter.Marshal()); + else + node.InsertEndChild(headerFooter.Marshal()); End private sheet_; //XmlSheet对象 file_; //TSExcelFile对象 xmlFile_; //sheet对应的xml对象 -End; \ No newline at end of file +End; diff --git a/funcext/TSOffice/worksheet/xlsxHyperLink.tsf b/funcext/TSOffice/worksheet/xlsxHyperLink.tsf index 8fc3afa..0a20ae7 100644 --- a/funcext/TSOffice/worksheet/xlsxHyperLink.tsf +++ b/funcext/TSOffice/worksheet/xlsxHyperLink.tsf @@ -17,8 +17,16 @@ Type xlsxHyperLink = Class work_node := xmlFile_.FirstChildElement('worksheet'); hyperlinks := work_node.FirstChildElement('hyperlinks'); if not ifObj(hyperlinks) then begin - phone_node := work_node.FirstChildElement('phoneticPr'); - hyperlinks := work_node.InsertAfterChild(phone_node, 'element', 'hyperlinks'); + arr := array('phoneticPr', 'mergeCells', 'sheetData'); + for i:=0 to length(arr)-1 do + begin + insert_node := work_node.FirstChildElement(arr[i]); + if ifObj(insert_node) then + begin + hyperlinks := work_node.InsertAfterChild(insert_node, 'element', 'hyperlinks'); + break; + end + end end; node := hyperlinks.FirstChildElement('hyperlink'); while ifObj(node) do begin @@ -48,38 +56,24 @@ Type xlsxHyperLink = Class End marshal['attributes'] := attrs; hyperlinks.InsertEndChild(marshal); - return array(0,'ok'); End; Function GetCellHyperLink(axis); Begin - data := array(); hyperlinks := xmlFile_.FirstChildElement('worksheet').FirstChildElement('hyperlinks'); - if not ifObj(hyperlinks) then return array(-1, 'Node::hyperlinks is not exist.'); + if not ifObj(hyperlinks) then return "The cell has no hyperlink"; node := hyperlinks.FirstChildElement('hyperlink'); + link := TOfficeObj('THyperLink'); while ifObj(node) do begin - marshal := node.marshal()[0]; - attrs := marshal['attributes']; - if attrs['ref'] = axis then + ref := node.GetAttribute('ref'); + if ref = axis then begin - link := TOfficeObj('THyperLink'); - link.LinkType := ifnil(attrs['location']) ? "External" : "Location"; - if not ifnil(attrs['location']) then - link.LinkUrl := attrs['location']; - else Begin - rid := attrs['r:id']; - file := 'xl/worksheets/_rels/' + ExtractFileName(LowerCase(sheetName_)) + '.xml.rels'; - xmlfile := file_.WorkBook().GetXmlFileObj(file); - relnode := class(xlsxXml).FindRelationship(xmlfile, rid); - if ifObj(relnode) then link.LinkUrl := relnode.GetAttribute('Target'); - End - link.Display := attrs['display']; - link.Tooltip := attrs['tooltip']; - return array(0, link); - end; + link.RootObj := node; + break; + end node := node.NextElement(); end; - return array(-2, "The cell has no hyperlink."); + return link; End; private diff --git a/funcext/TSOffice/worksheet/xlsxImage.tsf b/funcext/TSOffice/worksheet/xlsxImage.tsf index 1045441..5169205 100644 --- a/funcext/TSOffice/worksheet/xlsxImage.tsf +++ b/funcext/TSOffice/worksheet/xlsxImage.tsf @@ -4,9 +4,9 @@ Type xlsxImage = Class Begin excel_ := excel; sheetName_ := sheet; - [rid_, imageFileName_, sheetFileName_, xmlRelsFile_] := excel_.WorkBook().GetRelationshipRid(sheet, '../media/image'); + zipfile_ := excel.Zip(); End; - + class Function NewObject(sheet, excel); Begin excel_ := excel; @@ -15,34 +15,158 @@ Type xlsxImage = Class return new xlsxImage(sheet, excel); End; - Function SetSheetBackground(pictrue); + Function SetSheetBackground(picture); Begin - //if not ifBinary(picture.Image) or length(picture.Image) = 0 then - // raise "Invalid Image Data."; - if imageFileName_ = '' then - Begin - rid_++; - imageId := excel_.WorkBook().GetFilesCount('xl/media/') + 1; - imageName := "../media/image" + inttostr(imageId); - type := 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'; - excel_.WorkBook().AddRelationshipRid(xmlRelsFile_, imageName, type, 'rId' + inttostr(rid_)); - End + if not ifBinary(picture.Image) or length(picture.Image) = 0 then + return "Invalid Image Data."; + + image_file := getImageFileName(picture); + rels_xmlfile := excel_.WorkBook().GetSheetRelsFile(sheetName_); + prefix := ReplaceStr(image_file, 'xl/', '../'); + [rid, target] := class(xlsxXml).FindRelationshipRid(rels_xmlfile, prefix); + if target = '' then + begin + rid ++; + class(xlsxXml).AddRelationshipRid(rels_xmlfile, prefix, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', 'rId' $ rid); + end + content_xml := excel_.WorkBook().GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + class(xlsxXml).AddDefaultContentType(content_xml, 'jpeg', 'image/jpeg'); + sheet_xml := excel_.WorkBook().GetSheetXmlfile(sheetName_); node := sheet_xml.FirstChildElement('worksheet'); picture_node := node.FirstChildElement('picture'); - if ifObj(picture_node) then - Begin - node.DeleteChild(picture_node); - End - node := node.InsertEndChild('element', 'picture'); - node.SetAttribute('r:id', 'rId' + inttostr(rId_)); + if not ifObj(picture_node) then + begin + prev_node := class(xlsxXml).GetWorkSheetPrevNode(node, 'picture'); + if ifObj(prev_node) then picture_node := node.InsertAfterChild(prev_node, 'element', 'picture'); + else picture_node := node.InsertEndChild('element', 'picture'); + end + picture_node.SetAttribute('r:id', 'rId' + inttostr(rid)); End - -private + + Function AddPicture(topLeft, bottomRight, picture, format); + Begin + if not ifBinary(picture.Image) or length(picture.Image) = 0 then + return "Invalid Image Data."; + [err1, col1, row1] := excel_.CellNameToCoordinates(topLeft); + [err2, col2, row2] := excel_.CellNameToCoordinates(bottomRight); + if err1 or err2 then return 'Invalid params.'; + + image_target := ReplaceStr(getImageFileName(picture), 'xl/', '../'); + drawing_id := excel_.WorkBook().GetSheetDrawing(sheetName_); + drawing_rels := excel_.WorkBook().GetDrawingRelsFile(drawing_id); + [rid, target] := class(xlsxXml).FindRelationshipRid(drawing_rels, image_target); + if target = '' then + begin + rid++; + class(xlsxXml).AddRelationshipRid(drawing_rels, image_target, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', 'rId' $ rid); + end + content_xml := excel_.WorkBook().GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + class(xlsxXml).AddDefaultContentType(content_xml, 'jpeg', 'image/jpeg'); + sheet_xml := excel_.WorkBook().GetSheetXmlfile(sheetName_); + node := sheet_xml.FirstChildElement('worksheet'); + drawing_node := node.FirstChildElement('drawing'); + if not ifObj(drawing_node) then + begin + prev_node := class(xlsxXml).GetWorkSheetPrevNode(node, 'drawing'); + if ifObj(prev_node) then drawing_node := node.InsertAfterChild(prev_node, 'element', 'drawing'); + else drawing_node := node.InsertEndChild('element', 'drawing'); + end + sheet_rels := excel_.WorkBook().GetSheetRelsFile(sheetName_); + drawing_file_name := '../drawings/drawing' + inttostr(drawing_id) + '.xml'; + [id, target] := class(xlsxXml).FindRelationshipRid(sheet_rels, drawing_file_name); + drawing_node.SetAttribute('r:id', 'rId' + inttostr(id)); + + // drawingN.xml + drawing_xml := excel_.WorkBook().GetXmlFileObj('xl/drawings/drawing' $ drawing_id $ ".xml"); + if not ifObj(format) then format := TOfficeObj('TPictureFormat'); + + o := TOfficeObj('TtwoCellAnchor'); + o.EditAs := 'oneCell'; + o.XFrom.Col := col1; + o.XFrom.ColOff := format.BegColOff; + o.XFrom.Row := row1; + o.XFrom.RowOff := format.BegRowOff; + o.XTo.Col := col2; + o.XTo.ColOff := format.EndColOff; + o.XTo.Row := row2; + o.XTo.RowOff := format.EndRowOff; + + o.Pic.NodeName := 'xdr:pic'; + o.Pic.NvPicPr.NodeName := 'xdr:nvPicPr'; + o.Pic.NvPicPr.CNvPr.Name := picture.Name ? picture.Name : ''; + o.Pic.NvPicPr.CNvPr.ID := class(xlsxXml).GetcNvPrID(drawing_xml); + o.Pic.NvPicPr.CNvPr.Descr := picture.Descr ? : ''; + o.Pic.NvPicPr.CNvPr.ExtLst.Ext.Uri := ''; + o.Pic.NvPicPr.CNvPr.ExtLst.Ext.Xmlns16 := 'http://schemas.microsoft.com/office/drawing/2014/main'; + o.Pic.NvPicPr.CNvPr.Replace(array("pic:": "xdr:")); + o.Pic.NvPicPr.CNvPicPr.PicLocks := "1"; + o.Pic.BlipFill.NodeName := 'xdr:blipFill'; + o.Pic.BlipFill.Blip.Xmlns := "http://schemas.openxmlformats.org/officeDocument/2006/relationships"; + o.Pic.BlipFill.Blip.Embed := 'rId' + inttostr(rid); + o.Pic.BlipFill.Stretch.FillRect := true; + o.Pic.SpPr.XFrm.Off.X := 0; + o.Pic.SpPr.XFrm.Off.Y := 0; + o.Pic.SpPr.XFrm.Ext.Cx := 0; + o.Pic.SpPr.XFrm.Ext.CY := 0; + o.Pic.SpPr.NodeName := 'xdr:spPr'; + o.Pic.SpPr.PrstGeom.Prst := "rect"; + o.Pic.SpPr.PrstGeom.AvLst := true; + + drawing_xml.FirstChildElement('xdr:wsDr').InsertEndChild(o.Marshal()); + End + + Function DeletePicture(topLeft, bottomRight); + Begin + [err1, col1, row1] := excel_.CellNameToCoordinates(topLeft); + [err2, col2, row2] := excel_.CellNameToCoordinates(bottomRight); + if err1 or err2 then return 'Invalid params.'; + + drawing_id := excel_.WorkBook().GetSheetDrawing(sheetName_); + drawing_xml := excel_.WorkBook().GetXmlFileObj('xl/drawings/drawing' $ drawing_id $ ".xml"); + if not ifObj(drawing_xml) then return 'drawing xml is not exist.'; + wsDr_node := drawing_xml.FirstChildElement('xdr:wsDr'); + node := wsDr_node.FirstChildElement('xdr:twoCellAnchor'); + while ifObj(node) do + begin + from_node := node.FirstChildElement('xdr:from'); + to_node := node.FirstChildElement('xdr:to'); + from_col := strtoint(from_node.FirstChildElement('xdr:col').GetText()); + from_row := strtoint(from_node.FirstChildElement('xdr:row').GetText()); + to_col := strtoint(to_node.FirstChildElement('xdr:col').GetText()); + to_row := strtoint(to_node.FirstChildElement('xdr:row').GetText()); + if (col1 <= from_col and row1 <= from_row) and (col2 + 1 > to_col and row2 + 1 > to_row) then + prev := node; + node := node.NextElement(); + if ifObj(prev) then wsDr_node.DeleteChild(prev); + end + End + +private + + Function getImageFileName(picture); + Begin + image_files := sselect ['FileName'] from zipfile_.Files() where AnsiStartsText('xl/media/image', ['FileName']) end; + image_file := ''; + for i:=0 to length(image_files)-1 do + begin + if zipfile_.Diff(image_files[i], picture.Image) = 0 then + begin + image_file := image_files[i]; + break; + end + end + if image_file = '' then + begin + image_count := length(image_files) + 1; + image_file := 'xl/media/image' $ image_count $ '.jpeg'; + zipfile_.Add(image_file, picture.Image); + end + return image_file; + End + +private sheetName_:string; //sheet名称 - sheetFileName_; //xl/worksheets/sheetN.xml excel_;//TSExcelFile对象 - xmlRelsFile_; - imageFileName_; - rid_; + zipfile_; End; diff --git a/funcext/TSOffice/worksheet/xlsxMargins.tsf b/funcext/TSOffice/worksheet/xlsxMargins.tsf index 2bae207..02f26e2 100644 --- a/funcext/TSOffice/worksheet/xlsxMargins.tsf +++ b/funcext/TSOffice/worksheet/xlsxMargins.tsf @@ -11,22 +11,18 @@ Type xlsxMargins = Class marshal := margins.Marshal(); work_node := xmlFile_.FirstChild('worksheet'); node := work_node.FirstChild('pageMargins'); - work_node.DeleteChild(node); - prev_node := work_node.FirstChild('phoneticPr'); + 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'); - marshal := node.Marshal()[0]; margins := TOfficeObj('tmargins'); - margins.Bottom := marshal['attributes']['bottom']; - margins.Footer := marshal['attributes']['footer']; - margins.Header := marshal['attributes']['header']; - margins.Left := marshal['attributes']['left']; - margins.Right := marshal['attributes']['right']; - margins.Top := marshal['attributes']['top']; + margins.RootObj := node; return margins; End diff --git a/funcext/TSOffice/worksheet/xlsxPageLayout.tsf b/funcext/TSOffice/worksheet/xlsxPageLayout.tsf index cf68dc4..b052568 100644 --- a/funcext/TSOffice/worksheet/xlsxPageLayout.tsf +++ b/funcext/TSOffice/worksheet/xlsxPageLayout.tsf @@ -8,45 +8,30 @@ Type xlsxPageLayout = Class Function SetPageLayout(sheet, pageLayout); Begin + if ifint(pageLayout.FirstPageNumber) then pageLayout.UseFirstPageNumber := True; marshal := pageLayout.Marshal(); work_node := xmlFile_.FirstChild('worksheet'); node := work_node.FirstChild('pageSetUp'); if ifObj(node) then work_node.DeleteChild(node); - workbook_xml := file_.WorkBook().GetXmlFileObj('xl/workbook.xml'); - workbook := workbook_xml.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet'); - if not ifObj(workbook) then return array(1, 'workbook error!'); - while ifObj(workbook) do - Begin - sheet_name := workbook.GetAttribute('name'); - if sheet_name = sheet then - Begin - rid := workbook.GetAttribute('r:id'); - break; - End - workbook := workbook.NextElement(); - End - if not ifnil(marshal['attributes']['firstPageNumber']) then marshal['attributes']['useFirstPageNumber'] := 1; - marshal['attributes']['r:id'] := rid; - work_node.InsertEndChild(marshal); - return array(0, ''); + arr := array('sheetData', 'mergeCells', 'phoneticPr', 'pageMargins'); + for i:=length(arr)-1 to 0 do + begin + node := work_node.FirstChild(arr[i]); + if ifObj(node) then + begin + work_node.InsertAfterChild(node, marshal); + flag := 1; + end + end + if not flag then + work_node.InsertEndChild(marshal); End; Function GetPageLayout(); Begin node := xmlFile_.FirstChild('worksheet').FirstChild('pageSetUp'); - if not ifObj(node) then return array(1, ': pageSetUp not found'); - marshal := node.Marshal()[0]; page_layout := TOfficeObj('TPageLayout'); - page_layout.Scale := marshal['attributes']['scale']; - page_layout.FitToWidth := marshal['attributes']['fitToWidth']; - page_layout.FitToHeight := marshal['attributes']['fitToHeight']; - page_layout.PaperSize := marshal['attributes']['paperSize']; - page_layout.Orientation := marshal['attributes']['orientation']; - page_layout.BlackAndWhite := marshal['attributes']['blackAndWhite']; - page_layout.FirstPageNumber := marshal['attributes']['firstPageNumber']; - page_layout.CellError := marshal['attributes']['errors']; - page_layout.CellComments := marshal['attributes']['cellComments']; - page_layout.Draft := marshal['attributes']['draft']; + page_layout.RootObj := node; return page_layout; End diff --git a/funcext/TSOffice/worksheet/xlsxShape.tsf b/funcext/TSOffice/worksheet/xlsxShape.tsf new file mode 100644 index 0000000..8359c11 --- /dev/null +++ b/funcext/TSOffice/worksheet/xlsxShape.tsf @@ -0,0 +1,127 @@ +Type xlsxShape = Class + ///缺省构造函数 + Function Create(sheet,excel); overload; + Begin + excel_ := excel; + sheetName_ := sheet; + zipfile_ := excel.Zip(); + + drawing_id := excel_.WorkBook().GetSheetDrawing(sheetName_); + sheet_xml := excel_.WorkBook().GetSheetXmlfile(sheetName_); + node := sheet_xml.FirstChildElement('worksheet'); + drawing_node := node.FirstChildElement('drawing'); + if not ifObj(drawing_node) then + drawing_node := node.InsertEndChild('element', 'drawing'); + drawing_node.SetAttribute('r:id', 'rId' $ drawing_id); + + // drawingN.xml + drawingXmlObj_ := excel_.WorkBook().GetXmlFileObj('xl/drawings/drawing' $ drawing_id $ ".xml"); + End; + + class Function NewObject(sheet, excel); + Begin + excel_ := excel; + o := excel_.WorkBook().GetSheetObj(sheet);//sheet存在 + if not ifObj(o) then return 0; + return new xlsxShape(sheet, excel); + End; + + Function AddShape(topLeft, bottomRight, shapeType, format); + Begin + [err1, col1, row1] := excel_.CellNameToCoordinates(topLeft); + [err2, col2, row2] := excel_.CellNameToCoordinates(bottomRight); + if err1 or err2 then return 'Invalid params.'; + + o := TOfficeObj('TtwoCellAnchor'); + o.XFrom.Col := col1; + o.XFrom.ColOff := format.BegColOff ? format.BegColOff : 0; + o.XFrom.Row := row1; + o.XFrom.RowOff := format.BegRowOff ? format.BegRowOff : 0; + o.XTo.Col := col2; + o.XTo.ColOff := format.EndColOff ? format.EndColOff : 0; + o.XTo.Row := row2; + o.XTo.RowOff := format.EndRowOff ? format.EndRowOff : 0; + + o.Pic.NodeName := 'xdr:sp'; + o.Pic.Macro := ''; + o.Pic.Textlink := ''; + setSpNvSpPr(o.Pic.NvPicPr, shapeType); + setSpSpPr(o.Pic.SpPr, shapeType); + setSpStyle(o.Pic.Style); + setSpTxBody(o.Pic.TxBody, format); + + node := drawingXmlObj_.FirstChildElement('xdr:wsDr').InsertEndChild(o.Marshal()); + End; + +private + + Function getShapeInfo(); + Begin + return array( + 'rect': ('name': '矩形'), + 'roundRect': ('name': '矩形: 圆角'), + 'mathMinus': ('name': '减号'), + 'ellipse': ('name': '椭圆'), + ); + End + + Function setSpNvSpPr(obj, shapeType); + Begin + obj.NodeName := 'xdr:nvSpPr'; + obj.CNvPr.ID := class(xlsxXml).GetcNvPrID(drawingXmlObj_); + obj.CNvPr.Name := (getShapeInfo()[shapeType]['name'] ?: '') $ ' ' $ obj.CNvPr.ID; + obj.CNvPr.ExtLst.Ext.Uri := ''; + obj.CNvPr.ExtLst.Ext.Xmlns16 := 'http://schemas.microsoft.com/office/drawing/2014/main'; + obj.CNvPr.Replace(array("pic:": "xdr:")); + obj.CNvSpPr := true; + End + + Function setSpSpPr(obj, shapeType); + Begin + obj.XFrm.Off.X := 0; + obj.XFrm.Off.Y := 0; + obj.XFrm.Ext.Cx := 0; + obj.XFrm.Ext.CY := 0; + obj.PrstGeom.Prst := shapeType; + obj.PrstGeom.AvLst := true; + obj.NodeName := 'xdr:spPr'; + End + + Function setSpStyle(obj); + Begin + obj.LnRef.Idx := 2; + obj.LnRef.SchemeClr.Val := 'accent1'; + obj.LnRef.SchemeClr.Shade := '50000'; + obj.FillRef.Idx := 1; + obj.FillRef.SchemeClr.Val := 'accent1'; + obj.EffectRef.Idx := 0; + obj.EffectRef.SchemeClr.Val := 'accent1'; + obj.FontRef.Idx := 'minor'; + obj.FontRef.SchemeClr.Val := 'lt1'; + End + + Function setSpTxBody(obj, format); + Begin + obj.BodyPr.VertOverflow := 'clip'; + obj.BodyPr.HorzOverflow := 'clip'; + obj.BodyPr.RtlCol := 0; + obj.BodyPr.Anchor := 't'; + + if istable(format.ExtNodes) then + begin + obj.ExtNodes := format.ExtNodes ?: array(); + end + else begin + obj.P.PPr.Algn := 'l'; + obj.P.EndParaRPr.Lang := 'zh-CN'; + obj.P.EndParaRPr.AltLang := 'en-US'; + obj.P.EndParaRPr.SZ := '1100'; + end + End + +private + sheetName_:string; //sheet名称 + excel_;//TSExcelFile对象 + zipfile_; + drawingXmlObj_; +End; diff --git a/funcext/TSOffice/worksheet/xlsxStyles.tsf b/funcext/TSOffice/worksheet/xlsxStyles.tsf index 8c99652..5cfa362 100644 --- a/funcext/TSOffice/worksheet/xlsxStyles.tsf +++ b/funcext/TSOffice/worksheet/xlsxStyles.tsf @@ -17,44 +17,31 @@ Type xlsxStyles = Class processNumFmtId(node, 'numFmts', style.NumberFormat); numfmt_id := insertNode(node, 'numFmts', style.NumberFormat); - // 整理插入节点内容 - child_arr := array(); alignment_marshal := style.Alignment.Marshal(); if istable(alignment_marshal['children']) or istable(alignment_marshal['attributes']) then - begin alignment_flag := 1; - child_arr union= array(alignment_marshal); - end protection_marshal := style.Protection.Marshal(); if istable(protection_marshal['children']) or istable(protection_marshal['attributes']) then - begin protection_flag := 1; - child_arr union= array(protection_marshal); - end - attr_arr := array( - 'numFmtId': style.NumberFormat.NumFmtId ? : "0", - 'fontId': font_id, - 'fillId': fill_id, - 'borderId': border_id, - 'xfId': 0, - ); - if font_id <> '0' then attr_arr['applyFont'] := '1'; - if border_id <> '0' then attr_arr['applyBorder'] := '1'; - if numfmt_id <> '0' then attr_arr['applyNumberFormat'] := '1'; - if fill_id <> '0' then attr_arr['applyFill'] := '1'; - if alignment_flag then attr_arr['applyAlignment'] := '1'; - if protection_flag then attr_arr['applyProtection'] := '1'; + xf := TOfficeObj('TXf'); + xf.NumFmtId := style.NumberFormat.NumFmtId ? : 0; + xf.FontId := font_id; + xf.FillId := fill_id; + xf.BorderId := border_id; + xf.XfId := 0; + xf.ApplyFont := font_id <> '0' ? 1 : nil; + xf.ApplyFill := fill_id <> '0' ? 1 : nil; + xf.ApplyBorder := border_id <> '0' ? 1 : nil; + xf.ApplyAlignment := alignment_flag ?: nil; + xf.ApplyProtection := protection_flag ?: nil; + xf.Alignment := style.Alignment; + xf.Protection := style.Protection; - arr := array('name': 'xf', 'type': 'element', - 'attributes': attr_arr, - 'children': child_arr, - ); node := node.FirstChildElement('cellXfs'); count := node.GetAttribute('count'); - node.InsertEndChild(arr); + node.InsertEndChild(xf.Marshal()); node.SetAttribute('count', strtoint(count) + 1); - //node.print; return count; End diff --git a/funcext/TSOffice/worksheet/xlsxTable.tsf b/funcext/TSOffice/worksheet/xlsxTable.tsf new file mode 100644 index 0000000..3953312 --- /dev/null +++ b/funcext/TSOffice/worksheet/xlsxTable.tsf @@ -0,0 +1,117 @@ +Type xlsxTable = Class + ///缺省构造函数 + Function Create(sheet, excel); overload; + Begin + excel_ := excel; + sheetName_ := sheet; + zipfile_ := excel.Zip(); + End; + + class Function NewObject(sheet, excel); + Begin + excel_ := excel; + o := excel_.WorkBook().GetSheetObj(sheet);//sheet存在 + if not ifObj(o) then return 0; + return new xlsxTable(sheet, excel); + End; + + Function AddTable(topLeft, bottomRight, format, includeHeader); + Begin + [rid, table_id, table_name] := addTableXmlFileAndRelation(); + + table := TOfficeObj('TExcelTable'); + table.Xmlns := 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'; + table.Mc := 'http://schemas.openxmlformats.org/markup-compatibility/2006'; + table.Ignorable := 'xr xr3'; + table.Xr := 'http://schemas.microsoft.com/office/spreadsheetml/2014/revision'; + table.Xr3 := 'http://schemas.microsoft.com/office/spreadsheetml/2016/revision3'; + table.Id := table_id; + table.Name := '表' $ table_id; + table.DisplayName := format.TableName ? format.TableName : table.Name; + table.Ref := topLeft $ ':' $ bottomRight; + table.HeaderRowCount := format.HeaderRowCount ? '1' : nil; + table.TotalsRowShown := format.TotalsRowShown ? '1' : '0'; + table.AutoFilter := table.Ref; + + format.TableName := nil; + format.HeaderRowCount := nil; + format.TotalsRowShown := nil; + + // + [err1, col1, row1] := excel_.CellNameToCoordinates(topLeft); + [err2, col2, row2] := excel_.CellNameToCoordinates(bottomRight); + table_str := getTableColumnsXmlString(col1, col2, row1, includeHeader); + + table_xml := excel_.WorkBook().GetXmlFileObj(table_name); + table_node := table_xml.FirstChild('table'); + marshal := table.Marshal(); + class(xlsxXml).UpdateNode(table_node, marshal['attributes'], marshal['children']); + table_node.InsertEndChild(table_str); + table_node.InsertEndChild(format.Marshal()); + + //sheetN.xml + sheet_xml := excel_.WorkBook().GetSheetXmlFile(sheetName_); + worksheet_node := sheet_xml.FirstChildElement('worksheet'); + table_part := worksheet_node.FirstChildElement('tableParts'); + if not ifObj(table_part) then + begin + table_part := worksheet_node.InsertEndChild('element', 'tableParts'); + count := 1; + end + else begin + count := inttostr(table_part.GetAttribute('count')) + 1; + end + node := table_part.InsertEndChild('element', 'tablePart'); + node.SetAttribute('r:id', 'rId' $ rid); + table_part.SetAttribute('count', count); + + End + +private + Function getTableColumnsXmlString(begCol, endCol, row, includeHeader); + Begin + table_str := ''; + id := 1; + col_index := 1; + if not includeHeader then + begin + excel_.InsertRow(sheetName_, row); + end + for i:=begCol to endCol do + begin + [err, cell] := excel_.CoordinatesToCellName(i, row, false); + if includeHeader then + name := excel_.GetCellValue(sheetName_, cell)[1]; + else begin + name := "列" $ col_index++; + excel_.SetCellValue(sheetName_, cell, name); + end + table_str += fmt('', id++, name); + end + table_str += ""; + + return table_str; + End + + Function addTableXmlFileAndRelation(); + Begin + sheet_rels_file := excel_.WorkBook().GetSheetRelsFile(sheetName_); + [rid, target] := class(xlsxXml).FindRelationshipRid(sheet_rels_file, ''); + rid ++; + table_id := excel_.WorkBook().GetFilesCount('xl/tables/') + 1; + table_name := 'xl/tables/table' + inttostr(table_id) + '.xml'; + table_target := '../tables/table' + inttostr(table_id) + '.xml'; + excel_.zip().Add(table_name, class(xlsxXml).XmlHeader() + ""); + class(xlsxXml).AddRelationshipRid(sheet_rels_file, table_target, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table', 'rId' $ rid); + content_xml := excel_.WorkBook().GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + class(xlsxXml).AddOverrideContentType(content_xml, '/' + table_name, 'application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml'); + + return array(rid, table_id, table_name); + End + +private + sheetName_:string; //sheet名称 + excel_;//TSExcelFile对象 + zipfile_; + tableXmlFile_; +End; diff --git a/funcext/TSOffice/worksheet/xlsxWorkBook.tsf b/funcext/TSOffice/worksheet/xlsxWorkBook.tsf index f145967..5bdb926 100644 --- a/funcext/TSOffice/worksheet/xlsxWorkBook.tsf +++ b/funcext/TSOffice/worksheet/xlsxWorkBook.tsf @@ -10,11 +10,9 @@ Type xlsxWorkBook = Class ///规范8:模块tsf文件编码格式为UTF8 ///缺省构造函数 - Function Create(z,xml); overload; + Function Create(z); overload; Begin - rId_ := -1; zipfile_ := z; - xml_ := xml; xmlFileObjMap_ := array(); sheetObjMap_ := array(); sheetPrefix_ := 'xl/worksheets/sheet'; @@ -28,7 +26,7 @@ Type xlsxWorkBook = Class //workbook.xml.rels中加载(rid -> sheet-filename) rids := array(); - workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels')); + workbook_rels := GetXmlFileObj(class(xlsxXml).GetFileName('workbook_rels')); rels := workbook_rels.FirstChildElement('Relationships').FirstChildElement('Relationship'); while ifObj(rels) do Begin id := rels.GetAttribute('Id'); @@ -71,20 +69,20 @@ Type xlsxWorkBook = Class Function NewSheet(sheet); Begin lname := LowerCase(sheet); - if ifint(sheetIndexMap_[ lname ]) then return array(1, 'Sheet is already exist.'); + if ifint(sheetIndexMap_[ lname ]) then return class(ErrorMessage).SheetExist('The sheet'); rid := getWorkbookRelsRid(); //添加文件xl/worksheets/sheetN.xml sheetId := vselect maxof(['sheetId']) from sheetNames_ end; sheetId := integer(sheetId) + 1; fname := sheetPrefix_ $ inttostr(sheetsCount_ + 1) $ '.xml'; - zipfile_.Add(fname, xml_.XmlHeader() + xml_.GetTemplate('sheet1')); + zipfile_.Add(fname, class(xlsxXml).XmlHeader() + class(xlsxXml).GetTemplate('sheet1')); //设置 workbook.xml.rels - workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels')); + workbook_rels := GetXmlFileObj('xl/_rels/workbook.xml.rels'); rels := workbook_rels.FirstChildElement('Relationships').InsertEndChild('element', 'Relationship'); rels.SetAttribute('Target', getTarget( sheetsCount_ + 1)); - rels.SetAttribute('Type', xml_.GetTemplate('RelationshipWorkSheet')); + rels.SetAttribute('Type', class(xlsxXml).GetTemplate('RelationshipWorkSheet')); rels.SetAttribute('Id', rid); //workbook_rels.Print; @@ -97,7 +95,7 @@ Type xlsxWorkBook = Class //workbook.Print(); //设置docProps/app.xml - app := GetXmlFileObj(xml_.GetFileName('docProps_app')); + app := GetXmlFileObj(class(xlsxXml).GetFileName('docProps_app')); //app.Print(); node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts'); if not ifObj(node) then Begin @@ -118,7 +116,8 @@ Type xlsxWorkBook = Class //app.Print(); //设置[Content_Types].xml - AddContentType(xml_.GetTemplate('SheetContentType'), '/' + fname); + content_xml := GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + class(xlsxXml).AddOverrideContentType(content_xml, '/' + fname, class(xlsxXml).GetTemplate('SheetContentType')); sheetNames_[sheetsCount_]['name'] := sheet; sheetNames_[sheetsCount_]['sheetId'] := sheetId; @@ -126,9 +125,8 @@ Type xlsxWorkBook = Class sheetNames_[sheetsCount_]['file'] := fname; sheetIndexMap_[ LowerCase(sheet) ] := sheetsCount_; sheetsCount_ ++; - SetDefaultSheet(sheet); - return array(0, ''); + return class(ErrorMessage).Ok(); End; ///删除sheet @@ -136,9 +134,9 @@ Type xlsxWorkBook = Class ///返回: [err, info] Function DeleteSheet(sheet); Begin - if sheetsCount_ <= 1 then return array(-1, 'Can not delete the last sheet.'); + if sheetsCount_ <= 1 then return class(ErrorMessage).DeleteFailure(); ind := sheetIndexMap_[ LowerCase(sheet) ]; - if not ifint(ind) then return array(-2, 'the sheet is not exist.'); + if not ifint(ind) then return class(ErrorMessage).Ok(); del := sheetNames_[ind]; defaultSheet := GetDefaultSheet(); @@ -156,7 +154,6 @@ Type xlsxWorkBook = Class newname := sheetPrefix_ + inttostr(i + 1) + '.xml'; sheetNames_[i]['file'] := newname; if oldname <> newname then Begin - //echo 'old=',oldname,',new=',newname,'\n'; n := vselect thisrowindex from files where ['FileName'] = oldname end; if ifint(n) then Begin files[n]['New-FileName'] := newname; //重置文件名 @@ -166,11 +163,10 @@ Type xlsxWorkBook = Class for i:=0 to length(files)-1 do Begin if ifstring(files[i]['New-FileName']) then Begin f := zipfile_.Get(i); - //echo '-------------------',f.FileName(),'\n'; f.FileName := files[i]['New-FileName']; End; End; - workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels')); + workbook_rels := GetXmlFileObj(class(xlsxXml).GetFileName('workbook_rels')); parent := workbook_rels.FirstChildElement('Relationships'); rels := parent.FirstChildElement('Relationship'); while ifObj(rels) do Begin @@ -212,7 +208,7 @@ Type xlsxWorkBook = Class //workbook.Print(); //设置docProps/app.xml - app := GetXmlFileObj(xml_.GetFileName('docProps_app')); + app := GetXmlFileObj(class(xlsxXml).GetFileName('docProps_app')); node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts'); if ifObj(node) then Begin vector := node.FirstChildElement('vt:vector'); @@ -247,16 +243,17 @@ Type xlsxWorkBook = Class if ind < 0 then SetDefaultSheet(sheetNames_[0]['name']); else if ind = length(sheetIndexMap_) then SetDefaultSheet(sheetNames_[length(sheetIndexMap_)]['name']); else SetDefaultSheet(sheetNames_[ind]['name']); - return array(0, ''); + + return class(ErrorMessage).Ok(); End; Function SetSheetName(sourceName, destName); Begin ind := sheetIndexMap_[ LowerCase(destName) ]; - if ifint(ind) then return array(-3, destName + ' is already exist.'); + if ifint(ind) then return class(ErrorMessage).SheetExist(destName); ind := sheetIndexMap_[ LowerCase(sourceName) ]; - if not ifint(ind) then return array(-4, sourceName + ' is not exist.'); + if not ifint(ind) then return class(ErrorMessage).SheetNotExist(sourceName); //设置 xl/workbook.xml workbook := GetXmlFileObj('xl/workbook.xml'); @@ -264,7 +261,7 @@ Type xlsxWorkBook = Class while ifObj(node) do Begin name := node.GetAttribute('name'); - if name = LowerCase(sourceName) then + if LowerCase(name) = LowerCase(sourceName) then Begin node.SetAttribute('name', destName); break; @@ -273,164 +270,43 @@ Type xlsxWorkBook = Class End //设置docProps/app.xml - app := GetXmlFileObj(xml_.GetFileName('docProps_app')); + app := GetXmlFileObj(class(xlsxXml).GetFileName('docProps_app')); node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts'); lpstr := node.FirstChildElement('vt:vector').FirstChildElement('vt:lpstr'); while ifObj(lpstr) do Begin - if lpstr.GetText() = sourceName then lpstr.SetValue(destName); + if LowerCase(lpstr.GetText()) = LowerCase(sourceName) then lpstr.SetValue(destName); lpstr := lpstr.NextElement(); End sheetNames_[ind]['name'] := destName; reindex(sheetIndexMap_, array(LowerCase(sourceName) : LowerCase(destName))); - return array(0, ''); + sheetObjMap_ := array(); + return class(ErrorMessage).Ok(); End; - Function AddContentType(type, name);overload; - Begin - content := GetXmlFileObj(xml_.GetFileName('Content_Types')); - element := content.FirstChildElement('Types').InsertEndChild('element', 'Override'); - element.SetAttribute('PartName', name); - element.SetAttribute('ContentType', type); - //content.Print(); - End; - - Function AddContentVml();overload; - Begin - content := GetXmlFileObj(xml_.GetFileName('Content_Types')); - content := content.FirstChildElement('Types'); - element := content.FirstChildElement('Default'); - prev := element; - while ifObj(element) do - Begin - attr := element.GetAttribute('Extension'); - if attr = 'vml' then return; - prev := element; - element := element.NextElement('Default'); - End - ContentType := 'application/vnd.openxmlformats-officedocument.vmlDrawing'; - element := content.InsertAfterChild(prev, 'element', 'Default'); - element.SetAttribute('Extension', 'vml'); - element.SetAttribute('ContentType', contentType); - End - - Function DeleteContentType(del_partname); - Begin - content := GetXmlFileObj(xml_.GetFileName('Content_Types')); - types := content.FirstChildElement('Types'); - element := types.FirstChildElement('Override'); - while ifObj(element) do Begin - partname := element.GetAttribute('PartName'); - if partname = del_partname then Begin - types.DeleteChild(element); - break; - End; - element := element.NextElement(); - End; - //content.Print(); - End; - - Function GetRelationshipRid(sheet, prefix); - Begin - ind := sheetIndexMap_[ LowerCase(sheet) ]; - file := 'xl/worksheets/_rels/' + ExtractFileName(sheetNames_[ind]['file']) + '.rels'; - files := zipfile_.Files(); - isexist := vselect thisrowindex from files where ['FileName']=file end; - if ifnil(isexist) then Begin - zipfile_.Add(file, xml_.XmlHeader() + xml_.GetTemplate('sheet_rels')); - end - xmlfile := GetXmlFileObj(file); - r := class(xlsxXml).FindRelationshipRid(xmlfile, prefix); - r[2] := sheetNames_[ind]['file']; - r[3] := file; - return r; - End; - - Function AddRelationshipRid(relsfile, target, type, rid); - Begin - xmlfile := GetXmlFileObj(relsfile); - class(xlsxXml).AddRelationshipRid(xmlfile, target, type, rid); - End; - - Function GetFilesCount(prefix); - Begin - files := zipfile_.Files(); - return vselect countof( ['FileName'] ) from files where AnsiStartsText(prefix, ['FileName']) end; - End; - - Function FileIsExist(fname); - Begin - files := zipfile_.Files(); - return vselect countof( ['FileName'] ) from files where ['FileName']=fname end; - End; - - Function GetSheetXmlfile(sheet); - Begin - ind := sheetIndexMap_[ LowerCase(sheet) ]; - if not ifint(ind) then return 0; - return GetXmlFileObj(sheetNames_[ind]['file']); - End; - - Function GetSheetObj(sheet); - Begin - o := sheetObjMap_[sheet]; - if not ifnil(o) then return o; - - ind := sheetIndexMap_[ LowerCase(sheet) ]; - if not ifint(ind) then return 0; - f := GetXmlFileObj(sheetNames_[ind]['file']); - if not ifObj(f) then return 0; - o := f.Sheet(); - sheetObjMap_[ sheet ] := o; - return o; - End; - - ///插入列,在指定列前插入空白列 - ///sheet: string,工作表名称 - ///col: string 列名,如: "D" - ///返回: [err, info] Function InsertCol(sheet, col); Begin sObj := GetSheetObj(sheet); - if not ifObj(sObj) then return array(-1, 'Can not get sheet object'); - sObj.InsertCol(col); - return array(0, 'ok'); + if ifObj(sObj) then sObj.InsertCol(col); End; - ///插入行,在指定列前插入空白行 - ///sheet: string,工作表名称 - ///row: int - ///返回: [err, info] Function InsertRow(sheet, row); Begin sObj := GetSheetObj(sheet); - if not ifObj(sObj) then return array(-1, 'Can not get sheet object'); - sObj.InsertRow(row); - return array(0, 'ok'); + if ifObj(sObj) then sObj.InsertRow(row); End; - ///删除列 - ///sheet: string,工作表名称 - ///col: string,如: "D" - ///返回: [err, info] Function RemoveCol(sheet, col); Begin sObj := GetSheetObj(sheet); - if not ifObj(sObj) then return array(-1, 'Can not get sheet object'); - sObj.RemoveCol(col); + if ifObj(sObj) then sObj.RemoveCol(col); End; - ///删除行 - ///sheet: string,工作表名称 - ///row: int - ///返回: [err, info] Function RemoveRow(sheet, row); Begin sObj := GetSheetObj(sheet); - if not ifObj(sObj) then return array(-1, 'Can not get sheet object'); - sObj.RemoveRow(row); - //t := sObj.Import(); echo tostn(t); + if ifObj(sObj) then sObj.RemoveRow(row); End; ///获取图表列表 @@ -458,14 +334,11 @@ Type xlsxWorkBook = Class while ifObj(node) do Begin target := node.GetAttribute('Target'); if AnsiStartsText('../charts/chart', target) then Begin - id := node.GetAttribute('Id'); chartFile := ReplaceStr(target, '..', 'xl'); chart := TOfficeObj('TChart'); + chart.Rid := node.GetAttribute('Id'); //rid setChartInfo(chartFile, chart); - charts[i] := new TChartOp(chart); - charts[i].ChartFile := chartFile; - charts[i].DrawingFile := drawingFile; - charts[i].Rid := id; + charts[i] := chart; i++; End; node := node.NextElement(); @@ -482,23 +355,14 @@ Type xlsxWorkBook = Class node := node.NextElement('xdr:twoCellAnchor'); End; for i:=0 to length(charts)-1 do Begin - charts[i].Chart.Name := chartNameMap[charts[i].Rid]; + charts[i].Name := chartNameMap[charts[i].Rid]; End; return array(0, charts); End; Function GetSheetsCount(); Begin - return array(0, sheetsCount_); - End; - - Function GetXmlFileObj(n); - Begin - o := xmlFileObjMap_[ n ]; - if not ifnil(o) then return o; - o := zipfile_.Get(n); - xmlFileObjMap_[ n ] := o; - return o; + return sheetsCount_; End; Function SetSheetVisible(sheet, visible); @@ -513,17 +377,16 @@ Type xlsxWorkBook = Class Begin if hidden then node.SetAttribute('state', 'hidden'); else node.DeleteAttribute('state'); - return array(0, ''); End node := node.NextElement(); End - return array(1, 'Can\'t not find sheet ' $ sheet); + return 'Can not find sheet: ' $ sheet; End Function GetSheetVisible(sheet); Begin - sheet_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_file) then return array(1, 'The Sheet is not exist!'); + sheet_file := GetSheetXmlFile(sheet); + if not ifObj(sheet_file) then return 0; workbook := GetXmlFileObj('xl/workbook.xml'); node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet'); while ifObj(node) do @@ -532,75 +395,40 @@ Type xlsxWorkBook = Class if name = sheet then Begin val := node.GetAttribute('state'); - if val = 'hidden' then return array(0, 0); - else return array(0, 1); + if val = 'hidden' then return 0; + return 1; End node := node.NextElement(); End - return array(1, 'The Sheet is not exist!'); + return 0; End Function SetRowVisible(sheet, row, visible) Begin hidden := visible = 1 ? 0 : 1; - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); - sheet_node := sheet_xml_file.FirstChildElement('worksheet').FirstChildElement('sheetData'); - node := sheet_node.FirstChildElement('row'); - flag := 1; - prev_node := 0; - while ifObj(node) do - Begin - r := strtoint(node.GetAttribute('r')); - if r = row then - Begin - if hidden then node.SetAttribute('hidden', '1'); - else sheet_node.DeleteChild(node); - return array(0, ''); - End - if r > row and flag then - Begin - flag := 0; - position_node := prev_node; - End - prev_node := node; - node := node.NextElement(); - End - if hidden then - Begin - arr := array('type': 'element', 'name': 'row', 'attributes': array('r': row, 'hidden': 1, 'x14ac:dyDescent': 0.25)); - if flag or position_node = 0 then sheet_node.InsertFirstChild(arr); - else sheet_node.InsertAfterChild(position_node, arr); - End - return array(0, ''); + sheet_obj := GetSheetObj(sheet); + sheet_obj.SetAttribute(row, array("hidden": hidden)); End Function GetRowVisble(sheet, row) Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); - row := inttostr(row); - sheet_node := sheet_xml_file.FirstChildElement('worksheet').FirstChildElement('sheetData'); - node := sheet_node.FirstChildElement('row'); - while ifObj(node) do - Begin - r := node.GetAttribute('r'); - if r = row then - Begin - val := node.GetAttribute('hidden'); - if val = '1' then return array(0, 0); - break; - End - node := node.NextElement(); - End - return array(0, 1); + sheet_obj := GetSheetObj(sheet); + if not ifObj(sheet_obj) then return class(ErrorMessage).SheetNotExist(sheet); + is_exists := sheet_obj.RowIsExists(row); + if is_exists then + begin + [err, hidden] := sheet_obj.GetAttribute(row, 'hidden'); + if not err then + return array(0, hidden = '1' ? 0 : 1); + end + return array(0, 0); End Function SetColVisible(sheet, col, visible) Begin hidden := visible = 1 ? 0 : 1; - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + sheet_xml_file := GetSheetXmlFile(sheet); + if not ifObj(sheet_xml_file) then return 'The Sheet is not exist.'; work_node := sheet_xml_file.FirstChildElement('worksheet'); col_node := work_node.FirstChildElement('cols'); if not ifObj(col_node) and hidden then col_node := work_node.InsertAfterChild(work_node.FirstChildElement('sheetFormatPr'),'element', 'cols'); @@ -623,7 +451,7 @@ Type xlsxWorkBook = Class node.SetAttribute('max', col - 1); node2.SetAttribute('min', col + 1); End - return array(0, ''); + return 'ok'; End End node := node.NextElement(); @@ -634,13 +462,13 @@ Type xlsxWorkBook = Class 'customWidth': 1)); col_node.InsertEndChild(arr); End - return array(0, ''); + return 'ok'; End Function GetColVisble(sheet, col); Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + sheet_xml_file := GetSheetXmlFile(sheet); + if not ifObj(sheet_xml_file) then return class(ErrorMessage).SheetNotExist(); work_node := sheet_xml_file.FirstChildElement('worksheet'); col_node := work_node.FirstChildElement('cols'); if not ifObj(col_node) then return array(0, 1); @@ -662,71 +490,32 @@ Type xlsxWorkBook = Class Function SetRowHeight(sheet, row, height); Begin - if not (height >= 0 and height < 409) then return array(1, "行高必须在0-409之间"); - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); - sheet_node := sheet_xml_file.FirstChildElement('worksheet').FirstChildElement('sheetData'); - node := sheet_node.FirstChildElement('row'); - flag := 1; - prev_node := 0; - while ifObj(node) do - Begin - r := strtofloat(node.GetAttribute('r')); - if r = row then - Begin - node.SetAttribute('customHeight', 1); - node.SetAttribute('ht', height); - if height = 0 then node.SetAttribute('hidden', 1); - else node.SetAttribute('hidden', 0); - return array(0, ''); - End - if r > row and flag then - Begin - flag := 0; - position_node := prev_node; - End - prev_node := node; - node := node.NextElement(); - End - arr := array('r': row, 'customHeight': 1, 'ht': height, 'x14ac:dyDescent': 0.25); - if height = 0 then arr union= array('hidden': 1); - node_arr := array('type': 'element', 'name': 'row', 'attributes': arr); - if flag or position_node = 0 then sheet_node.InsertFirstChild(node_arr); - else sheet_node.InsertAfterChild(position_node, node_arr); - return array(0, ''); + obj := GetSheetObj(sheet); + axis := xlsx_call("CoordinatesToCellName", 1, row, False)[1]; + if not obj.CellIsExists(axis) then + begin + obj.SetCellValue(axis, '', array('t': 's')); + end + obj.SetAttribute(row, array('ht': height, "customHeight": 1)); End Function GetRowHeight(sheet, row) Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + obj := GetSheetObj(sheet); + ret := obj.GetAttribute(row, "ht"); + if !ret[0] and trystrtofloat(ret[1], height) then return height; + sheet_xml_file := GetSheetXmlFile(sheet); work_node := sheet_xml_file.FirstChildElement('worksheet'); - sheet_node := work_node.FirstChildElement('sheetData'); - node := sheet_node.FirstChildElement('row'); - while ifObj(node) do - Begin - r := strtofloat(node.GetAttribute('r')); - if r = row then - Begin - ht := strtofloat(node.GetAttribute('ht')); - hidden := node.GetAttribute('hidden'); - if hidden = 0 then return array(0, 0); - return array(0, ht); - End - node := node.NextElement(); - End default_ht := work_node.FirstChildElement('sheetFormatPr').GetAttribute('defaultRowHeight'); - return array(0, strtofloat(default_ht)); + return strtofloat(default_ht); End Function SetColWidth(sheet, startCol, endCol, width); Begin - if not (width >= 0 and width < 255) then return array(-1, "Column width must be between 0 and 255."); startCol := xlsx_call('ColumnNameToNumber', startCol)[1]; endCol := xlsx_call('ColumnNameToNumber', endCol)[1]; - if startCol > endCol then return array(-1, "First Colunm must be bigger than Last Column."); - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + if startCol > endCol then return; + sheet_xml_file := GetSheetXmlFile(sheet); work_node := sheet_xml_file.FirstChildElement('worksheet'); col_node := work_node.FirstChildElement('cols'); if not ifObj(col_node) then @@ -744,7 +533,7 @@ Type xlsxWorkBook = Class Begin node.SetAttribute('width', width); node.SetAttribute('customWidth', 1); - return array(0, ''); + return; End else Begin insert_flag := 1; @@ -760,13 +549,11 @@ Type xlsxWorkBook = Class 'customWidth': 1)); if insert_flag then col_node.InsertAfterChild(node, arr); else col_node.InsertEndChild(arr); - return array(0, ''); End; Function GetColWidth(sheet, col); Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + sheet_xml_file := GetSheetXmlFile(sheet); work_node := sheet_xml_file.FirstChildElement('worksheet'); col_node := work_node.FirstChildElement('cols'); default_width := work_node.FirstChildElement('sheetFormatPr').GetAttribute('defaultColWidth'); @@ -783,18 +570,29 @@ Type xlsxWorkBook = Class Begin width := trystrtofloat(node.GetAttribute('width'), r) ? r : -1; if width = -1 then break; - return array(0, width); + return width; End node := node.NextElement(); End - return array(0, default_width); + return default_width; + End; + + Function GetCellStyle(sheet, axis); + Begin + sheet_obj := GetSheetObj(sheet); + if ifObj(sheet_obj) then + begin + [err, styleId] := sheet_obj.GetCellStyle(axis); + if not err then return styleId; + end + return ''; End; Function MergeCell(sheet, hcell, vcell); Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist.'); - if hcell = vcell then return array(1, 'Duplicate cell.'); + sheet_xml_file := GetSheetXmlFile(sheet); + if not ifObj(sheet_xml_file) then return 'The sheet is not exist.'; + if hcell = vcell then return; work_node := sheet_xml_file.FirstChildElement('worksheet'); merge_node := work_node.FirstChildElement('mergeCells'); if not ifObj(merge_node) then @@ -803,8 +601,10 @@ Type xlsxWorkBook = Class count := 0; merge_node.SetAttribute('count', count); End + else begin + count := trystrtoint(merge_node.GetAttribute('count'), r) ? r : 0; + end node := merge_node.FirstChildElement('mergeCell'); - count := count = 0 ? count : trystrtoint(merge_node.GetAttribute('count'), r) ? r : 0; hcell_ := xlsx_call('SplitCellName', hcell); vcell_ := xlsx_call('SplitCellName', vcell); hcell_int := xlsx_call('ColumnNameToNumber', hcell_[1])[1]; @@ -831,117 +631,20 @@ Type xlsxWorkBook = Class merge_node.SetAttribute('count', count + 1); sheet_obj := GetSheetObj(sheet); - r := sheet_obj.SetCellStyle(hcell, vcell, "0"); - return array(0, ''); - End - - Function MergeCell1(sheet, hcell, vcell); - Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist.'); - work_node := sheet_xml_file.FirstChildElement('worksheet'); - // mergeCells节点 - merge_node := work_node.FirstChildElement('mergeCells'); - // SheetData节点 - sheet_node := work_node.FirstChildElement('sheetData'); - row_node := sheet_node.FirstChildElement('row'); - if not ifObj(merge_node) then - Begin - merge_node := work_node.InsertAfterChild(sheet_node, 'element', 'mergeCells'); - count := 0; - merge_node.SetAttribute('count', count); - End - node := merge_node.FirstChildElement('mergeCell'); - count := count = 0 ? count : trystrtoint(merge_node.GetAttribute('count'), r) ? r : 0; - hcell_ := xlsx_call('SplitCellName', hcell); - vcell_ := xlsx_call('SplitCellName', vcell); - hcell_int := xlsx_call('ColumnNameToNumber', hcell_[1])[1]; - vcell_int := xlsx_call('ColumnNameToNumber', vcell_[1])[1]; - spans1 := hcell_int; - spans2 := vcell_int; - while ifObj(node) do - Begin - ref := node.GetAttribute('ref'); - position := pos(':', ref); - cell1 := xlsx_call('SplitCellName', ref[1:position-1]); - cell2 := xlsx_call('SplitCellName', ref[position+1:]); - cell1_int := xlsx_call('ColumnNameToNumber', cell1[1])[1]; - cell2_int := xlsx_call('ColumnNameToNumber', cell2[1])[1]; - if (hcell_[2] >= cell1[2] and hcell_[2] <= cell2[2] and hcell_int >= cell1_int and hcell_int <= cell2_int) - or (vcell_[2] >= cell1[2] and vcell_[2] <= cell2[2] and vcell_int >= cell1_int and vcell_int <= cell2_int) - then Begin - while ifObj(row_node) do - Begin - r := strtoint(row_node.GetAttribute('r')); - if r >= cell1[2] and r <= cell2[2] then - Begin - prev_node := row_node; - row_node := row_node.NextElement(); - sheet_node.DeleteChild(prev_node); - End - End - spans1 := hcell_int >= cell1_int ? hcell_int : cell1_int; - spans2 := vcell_int >= cell2_int ? vcell_int : cell2_int; - merge_node.DeleteChild(node); - break; - End - node := node.NextElement(); - End - ref := hcell $ ":" $ vcell; - node := merge_node.InsertEndChild('element', 'mergeCell'); - node.SetAttribute('ref', ref); - merge_node.SetAttribute('count', count + 1); - - row_node := sheet_node.FirstChildElement('row'); - pr_node := work_node.FirstChildElement('sheetFormatPr'); - x14ac := pr_node.GetAttribute('a14ac:dyDescent') ? : '0.25'; - prev_node := 0; - r2 := 0; - while ifObj(row_node) do - Begin - r := strtoint(row_node.GetAttribute('r')); - if r < hcell_[2] and prev_node = 0 then - end_node := 0; // InsertFirstChild - else if hcell_[2] > r2 and hcell_[2] < r then - end_node := 1; // InsertAfterChild - - if ifObj(end_node) then break; - r2 := r; - prev_node := row_node; - row_node := row_node.NextElement(); - End - - spans := spans1 $ ":" $ spans2; - for i:=hcell_[2] to vcell_[2] do - Begin - arr := array('type': 'element', 'name': 'row', 'attributes': ('c': i, 'spans': spans, 'x14ac:dyDescent': x14ac)); - arr['children'] := generateRow(hcell_int, vcell_int, i); - if ifObj(end_node) then end_node := sheet_node.InsertAfterChild(end_node, arr); - else if end_node = 0 then end_node := sheet_node.InsertFirstChild(arr); - else if end_node = 1 then end_node := sheet_node.InsertAfterChild(prev_node, arr); - else sheet_node.InsertEndChild(arr); - End - - r1 := xlsx_call('ColumnNumberToName', spans1)[1]; - r2 := xlsx_call('ColumnNumberToName', spans2)[1]; - dimension_node := work_node.FirstChildElement('dimension'); - dimension_node.SetAttribute('ref', r1 $ ":" $ r2); - return array(0, ''); + style_id := GetCellStyle(sheet, hcell); + sheet_obj.SetCellStyle(hcell, vcell, style_id = '' ? '0' : style_id); End Function UnMergeCell(sheet, hcell, vcell); Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + sheet_xml_file := GetSheetXmlFile(sheet); + if not ifObj(sheet_xml_file) then return 'The sheet is not exist'; work_node := sheet_xml_file.FirstChildElement('worksheet'); // mergeCells节点 merge_node := work_node.FirstChildElement('mergeCells'); - // SheetData节点 - sheet_node := work_node.FirstChildElement('sheetData'); - row_node := sheet_node.FirstChildElement('row'); - if not ifObj(merge_node) then array(0, ''); + if not ifObj(merge_node) then return ''; node := merge_node.FirstChildElement('mergeCell'); - if not ifObj(node) then return array(0, ''); + if not ifObj(node) then return ''; count := trystrtoint(merge_node.GetAttribute('count'), r) ? r : 0; hcell_ := xlsx_call('SplitCellName', hcell); vcell_ := xlsx_call('SplitCellName', vcell); @@ -953,76 +656,40 @@ Type xlsxWorkBook = Class cell2 := xlsx_call('SplitCellName', ref[position+1:]); if ref[1:position-1] = hcell and ref[position+1:] = vcell then Begin - while ifObj(row_node) do - Begin - r := strtoint(row_node.GetAttribute('r')); - if r >= cell1[2] and r <= cell2[2] then - Begin - prev_node := row_node; - row_node := row_node.NextElement(); - sheet_node.DeleteChild(prev_node); - End - End merge_node.DeleteChild(node); - flag := 1; break; End node := node.NextElement(); End - if not flag then return array(0, ''); if count - 1 <> 0 then merge_node.SetAttribute('count', count - 1); else work_node.DeleteChild(merge_node); - return array(0, ''); End; - Function SetSheetDefaultRowHeight(sheet, height); - Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); - work_node := sheet_xml_file.FirstChildElement('worksheet'); - node := work_node.FirstChildElement('sheetFormatPr'); - node.SetAttribute('defaultRowHeight', height); - return array(0, ''); - End - - Function GetSheetDefaultRowHeight(sheet); - Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); - work_node := sheet_xml_file.FirstChildElement('worksheet'); - node := work_node.FirstChildElement('sheetFormatPr'); - flag := trystrtofloat(node.GetAttribute('defaultRowHeight'), height); - if flag then return array(0, height); - return array(1, "Can't find attribute : defaultRowHeight!"); - End - Function SetSheetDefaultColWidth(sheet, width); Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + sheet_xml_file := GetSheetXmlFile(sheet); + if not ifObj(sheet_xml_file) then return; work_node := sheet_xml_file.FirstChildElement('worksheet'); node := work_node.FirstChildElement('sheetFormatPr'); node.SetAttribute('defaultColWidth', width); - return array(0, ''); End Function GetSheetDefaultColWidth(sheet); Begin - sheet_xml_file := GetSheetXmlfile(sheet); - if not ifObj(sheet_xml_file) then return array(1, 'The Sheet is not exist!'); + sheet_xml_file := GetSheetXmlFile(sheet); + if not ifObj(sheet_xml_file) then return -1; work_node := sheet_xml_file.FirstChildElement('worksheet'); node := work_node.FirstChildElement('sheetFormatPr'); flag := trystrtofloat(node.GetAttribute('defaultColWidth'), width); - if flag then return array(0, width); - return array(1, "Can't find attribute : defaultColWidth!"); + return flag ? width : -1; End Function SetDefaultSheet(sheet); Begin ind := sheetIndexMap_[ LowerCase(sheet) ]; - if not ifint(ind) then return array('Can\'t not find sheet: ' $ sheet); + if not ifint(ind) then return 'Can not find sheet: ' $ sheet; for i:=0 to length(sheetnames_)-1 do begin name := sheetNames_[i]['name']; @@ -1037,7 +704,6 @@ Type xlsxWorkBook = Class End else sheet_node.SetAttribute('tabselected', 0); end - return array(0, ''); End Function GetDefaultSheet(); @@ -1045,13 +711,195 @@ Type xlsxWorkBook = Class for i:=0 to length(sheetnames_)-1 do begin name := sheetnames_[i]['name']; - xml_file := getxmlfileobj(sheetnames_[i]['file']); + xml_file := GetXmlFileObj(sheetnames_[i]['file']); sheet_node := xml_file.FirstChildElement('worksheet').FirstChildElement('sheetviews').FirstChildElement('sheetview'); - if sheet_node.GetAttribute('tabSelected') = '1' then return array(0, name); + if sheet_node.GetAttribute('tabSelected') = '1' then return name; end - return array(1, 'Not found defaultSheet'); End + Function GetXmlFileObj(n); + Begin + o := xmlFileObjMap_[ n ]; + if not ifnil(o) then return o; + o := zipfile_.Get(n); + xmlFileObjMap_[ n ] := o; + return o; + End; + + Function DeleteContentType(del_partname); + Begin + content := GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + types := content.FirstChildElement('Types'); + element := types.FirstChildElement('Override'); + while ifObj(element) do Begin + partname := element.GetAttribute('PartName'); + if partname = del_partname then Begin + types.DeleteChild(element); + break; + End; + element := element.NextElement(); + End; + //content.Print(); + End; + + Function GetRelationshipRid(sheet, prefix); + Begin + ind := sheetIndexMap_[ LowerCase(sheet) ]; + file := 'xl/worksheets/_rels/' + ExtractFileName(sheetNames_[ind]['file']) + '.rels'; + files := zipfile_.Files(); + isexist := vselect thisrowindex from files where ['FileName']=file end; + if ifnil(isexist) then Begin + zipfile_.Add(file, class(xlsxXml).XmlHeader() + class(xlsxXml).GetTemplate('sheet_rels')); + end + xmlfile := GetXmlFileObj(file); + r := class(xlsxXml).FindRelationshipRid(xmlfile, prefix); + r[2] := sheetNames_[ind]['file']; + r[3] := file; + return r; + End; + + Function AddRelationshipRid(relsfile, target, type, rid); + Begin + xmlfile := GetXmlFileObj(relsfile); + class(xlsxXml).AddRelationshipRid(xmlfile, target, type, rid); + End; + + Function GetFilesCount(prefix); + Begin + files := zipfile_.Files(); + return vselect countof( ['FileName'] ) from files where AnsiStartsText(prefix, ['FileName']) end; + End; + + Function FileIsExist(fname); + Begin + files := zipfile_.Files(); + return vselect countof( ['FileName'] ) from files where ['FileName']=fname end; + End; + + Function GetSheetRelsFile(sheet); + Begin + ind := sheetIndexMap_[LowerCase(sheet)]; + file := 'xl/worksheets/_rels/' + ExtractFileName(sheetNames_[ind]['file']) + '.rels'; + if not FileIsExist(file) then + zipfile_.Add(file, class(xlsxXml).XmlHeader() + class(xlsxXml).GetTemplate('sheet_rels')); + return GetXmlFileObj(file); + End; + + Function GetDrawingRelsFile(drawingId); + Begin + file := 'xl/drawings/_rels/drawing' + inttostr(drawingId) + '.xml.rels'; + if not FileIsExist(drawing_rels) then + zipfile_.Add(file, class(xlsxXml).XmlHeader() + class(xlsxXml).GetTemplate('drawing_rels')); + return GetXmlFileObj(file); + End; + + Function GetSheetXmlFile(sheet); + Begin + ind := sheetIndexMap_[ LowerCase(sheet) ]; + if not ifint(ind) then return 0; + return GetXmlFileObj(sheetNames_[ind]['file']); + End; + + Function GetSheetObj(sheet); + Begin + o := sheetObjMap_[sheet]; + if not ifnil(o) then return o; + + ind := sheetIndexMap_[ LowerCase(sheet) ]; + if not ifint(ind) then return 0; + f := GetXmlFileObj(sheetNames_[ind]['file']); + if not ifObj(f) then return 0; + o := f.Sheet(); + sheetObjMap_[ sheet ] := o; + return o; + End; + + Function GetSheetDrawing(sheet); + Begin + [rid, drawing_file_name, sheet_file_name, relsfile] := GetRelationshipRid(sheet, '../drawings/drawing'); + if drawing_file_name = '' then + begin + rid ++; + drawing_rid := GetFilesCount('xl/drawings/drawing') + 1; + drawing_file_name := '../drawings/drawing' + inttostr(drawing_rid) + '.xml'; + drawing_xl_file_name := 'xl/drawings/drawing' + inttostr(drawing_rid) + '.xml'; + zipfile_.Add(drawing_xl_file_name, class(xlsxXml).XmlHeader() + ''); + AddRelationshipRid(relsfile, drawing_file_name, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', 'rId' $ inttostr(rid)); + content_xml := GetXmlFileObj(class(xlsxXml).GetFileName('Content_Types')); + class(xlsxXml).AddOverrideContentType(content_xml, '/' + drawing_xl_file_name, 'application/vnd.openxmlformats-officedocument.drawing+xml'); + sheet_xml := GetXmlFileObj(sheet_file_name); + node := sheet_xml.FirstChildElement('worksheet'); + prev_node := class(xlsxXml).GetWorkSheetPrevNode(node, 'drawing'); + if ifObj(prev_node) then drawing_node := node.InsertAfterChild(prev_node, 'element', 'drawing'); + else drawing_node := node.InsertEndChild('element', 'drawing'); + drawing_node.SetAttribute('r:id', 'rId' + inttostr(rid)); + end + else begin + drawing_xl_file_name := 'xl/drwaings/' + ExtractFileName(drawing_file_name); + s := RightStr(drawing_xl_file_name, length(drawing_xl_file_name) - 19); + drawing_rid := strtoint(LeftStr(s, length(s) - 4)); + end + return drawing_rid; + End + + Function InsertPageBreak(sheet, row); + Begin + if row <= 1 then return 'Row must be greater than 1.'; + sheet_xml := GetSheetXmlFile(sheet); + worksheet := sheet_xml.FirstChildElement('worksheet'); + page_node := worksheet.FirstChildElement('rowBreaks'); + tbreak := TOfficeObj('TBreak'); + tbreak.Id := row; + if not ifObj(page_node) then + begin + node := class(xlsxXml).GetWorkSheetPrevNode(worksheet, 'rowBreaks'); + node := worksheet.InsertAfterChild(node, 'element', 'rowBreaks'); + node.SetAttribute('count', 1); + node.SetAttribute('manualBreakCount', 1); + node.InsertFirstChild(tbreak.Marshal()); + return ''; + end + node := page_node.FirstChildElement('brk'); + prev := nil; + prev_id := 0; + while ifObj(node) do + begin + id := strtoint(node.GetAttribute('id')); + if id = row then return array(0, ''); + if row > prev_id and row < id then break; + prev_id := id; + prev := node; + node := node.NextElement(); + end + if ifObj(prev) then page_node.InsertAfterChild(prev, tbreak.Marshal()); + else page_node.InsertFirstChild(tbreak.Marshal()); + count := strtoint(page_node.GetAttribute('count')); + manual_count := strtoint(page_node.GetAttribute('manualBreakCount')); + page_node.SetAttribute('count', count + 1); + page_node.SetAttribute('manualBreakCount', manual_count + 1); + + return ''; + End; + + Function RemovePageBreak(sheet, row); + Begin + sheet_xml := GetSheetXmlFile(sheet); + page_node := sheet_xml.FirstChildElement('worksheet').FirstChildElement('rowBreaks'); + if not ifObj(page_node) then return ; + node := page_node.FirstChildElement('brk'); + while ifObj(node) do + begin + id := strtoint(node.GetAttribute('id')); + if id = row then + begin + page_node.DeleteChild(node); + return; + end + node := node.NextElement(); + end + return; + End; + private Function generateRow(c1, c2, r); Begin @@ -1069,14 +917,10 @@ private Function getWorkbookRelsRid(); Begin - if rId_ >= 0 then Begin - rId_ ++; - return 'rId' $ rId_; - End; - workbook_rels := GetXmlFileObj(xml_.GetFileName('workbook_rels')); - [rId_, find] := class(xlsxXml).FindRelationshipRid(workbook_rels, ''); - rId_ ++; - return 'rId' $ rId_; + workbook_rels := GetXmlFileObj(class(xlsxXml).GetFileName('workbook_rels')); + [rId, find] := class(xlsxXml).FindRelationshipRid(workbook_rels, ''); + rId ++; + return 'rId' $ rId; End; Function getTarget(i); @@ -1110,120 +954,14 @@ private chart.C := ifObj(c) ? true : false; if not ifObj(xml) then return; chart.Title := getNodeValue(xml, chart.C ? 'c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t' : 'chartSpace/chart/title/tx/rich/a:p/a:r/a:t', ''); - node := xml.FirstChildElement(getC(chart) + 'chartSpace').FirstChildElement(getC(chart) + 'chart').FirstChildElement(getC(chart) + 'plotArea'); - if ifObj(node) then Begin - node := node.FirstChildElement(); - while ifObj(node) do Begin - if ifObj(node.FirstChildElement(getC(chart) + 'ser')) then - break; - node := node.NextElement(); - End; - if ifObj(node) then Begin - chart.ChartNode := node; - chart.Type := node.GetName(); - ser := node.FirstChildElement(getC(chart) + 'ser'); - Series := array(); - while ifObj(ser) do Begin - name := getNodeValue(ser, chart.C ? 'c:tx/c:strRef/c:f' : 'tx/strRef/f', ''); - categories := getNodeValue(ser, chart.C ? 'c:cat/c:strRef/c:f' : 'cat/strRef/f', ''); - val := getNodeValue(ser, chart.C ? 'c:val/c:numRef/c:f' : 'val/numRef/f', ''); - Series union= array(("Name":name,"Categories":categories,"Values":val,"Node":ser)); - ser := ser.NextElement(getC(chart) + 'ser'); - End; - chart.Series := Series; - End; - End; - //println('title={},Series={},DefaultSer={}', chart.Title,chart.Series,DefaultSer); + chart.ChartNode := xml.FirstChildElement(getC(chart) + 'chartSpace').FirstChildElement(getC(chart) + 'chart').FirstChildElement(getC(chart) + 'plotArea'); End; sheetsCount_:integer; - rId_:integer; sheetNames_; sheetIndexMap_; sheetPrefix_:string; zipfile_; - xml_; xmlFileObjMap_; //XmlFile对象存储 sheetObjMap_; //XmlSheet对象存储 End; - -type TChartOp = Class - Function Create(c); - Begin - Chart := c; - End; - - Function RemoveSeries(i); - Begin - cnt := length(Chart.Series); - if i < 0 or i >= cnt then return array(-1, 'Out of range.'); - println('ChartFile={}',ChartFile); - r := Chart.Series; - Chart.ChartNode.DeleteChild(r[i]['Node']); - for k:=i+1 to length(r)-1 do Begin - setVal(r[k]['Node'], Chart.C ? 'c:idx' : 'idx', -1); - setVal(r[k]['Node'], Chart.C ? 'c:order' : 'order', -1); - End; - - tmp := r[:i-1,:]; - tmp union= r[i+1:,:]; - Chart.Series := tmp; - return array(0, ''); - End; - - Function AddSeries(Name, Categories, Val); - Begin - if length(Chart.Series) = 0 then return array(-1, 'Chart has no Series.'); - r := Chart.Series; - i := length(r); - r[i]['Name'] := Name; - r[i]['Categories'] := Categories; - r[i]['Values'] := Val; - DefaultSer := r[ length(r)-1]['Node'].Marshal(); - node := Chart.ChartNode.InsertEndChild(DefaultSer); - r[i]['Node'] := node; - Chart.Series := r; - setVal(node, Chart.C ? 'c:idx' : 'idx', 1); - setVal(node, Chart.C ? 'c:order' : 'order', 1); - class(xlsxXml).RemoveNode(node, Chart.C ? 'c:tx/c:strCache' : 'tx/strCache'); - class(xlsxXml).RemoveNode(node, Chart.C ? 'c:cat/c:strCache' : 'cat/strCahce'); - class(xlsxXml).RemoveNode(node, Chart.C ? 'c:val/c:numCache' : 'val/numCache'); - return UpdateSeries(i, Name, Categories, Val); - End; - - Function UpdateSeries(i, Name, Categories, Val); - Begin - r := Chart.Series; - r[i]['Name'] := Name; - r[i]['Categories'] := Categories; - r[i]['Values'] := Val; - Chart.Series := r; - task := array((Chart.C ? 'c:tx/c:strRef/c:f/' : 'tx/strRef/f/', 'pcdata', Name), - (Chart.C ? 'c:cat/c:strRef/c:f/' : 'cat/strRef/f/', 'pcdata', Categories), - (Chart.C ? 'c:val/c:numRef/c:f/' : 'val/numRef/f/', 'pcdata', Val), - ); - for k:=0 to length(task)-1 do Begin - class(xlsxXml).SetNodeValue(r[i]['Node'], task[k]); - End; - return array(0, ''); - End; - - Function UpdateTitle(i, title); - Begin - task := array(Chart.C ? 'c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t' : 'chartSpace/chart/title/tx/rich/a:p/a:r/a:t', 'pcdata', title); - class(xlsxXml).SetNodeValue(Chart.xmlObj, task); - return array(0, ''); - End; - - Function setVal(node, k, deta); - Begin - val := node.FirstChildElement(k).GetAttribute('val'); - val := strtoint(val) + deta; - node.FirstChildElement(k).SetAttribute('val', val); - End; - - Chart; - ChartFile; - DrawingFile; - Rid; -End;