This commit is contained in:
csh 2022-12-30 10:49:51 +08:00
parent 88aa334c7a
commit ee77e920b3
18 changed files with 605 additions and 287 deletions

View File

@ -13,14 +13,10 @@ if err then
return PrintError("NewFile", err, errinfo); return PrintError("NewFile", err, errinfo);
PrintSuccess("NewFile", testing++); PrintSuccess("NewFile", testing++);
[err, errinfo] := file.SetSheetName('Sheet1', 'ExcelFile'); file.SetSheetName('Sheet1', 'ExcelFile');
if err then
return PrintError("SetSheetName", err, errinfo);
PrintSuccess("SetSheetName", testing++); PrintSuccess("SetSheetName", testing++);
[err, errinfo] := file.NewSheet("Functions"); file.NewSheet("Functions");
if err then
return PrintError("NewSheet", err, errinfo);
PrintSuccess("NewSheet", testing++); PrintSuccess("NewSheet", testing++);
file.SetDefaultSheet('ExcelFile'); file.SetDefaultSheet('ExcelFile');
@ -140,7 +136,7 @@ End
file.SetColWidth('Functions', 'A', 'A', 120); file.SetColWidth('Functions', 'A', 'A', 120);
PrintSuccess('SetColWidth', testing++); PrintSuccess('SetColWidth', testing++);
saveName := utf8toansi("d:\\temp\\ExcelFile使用帮助.xlsx"); saveName := utf8toansi("ExcelFile使用帮助.xlsx");
[err, errinfo] := file.SaveAs('', saveName); [err, errinfo] := file.SaveAs('', saveName);
if err then if err then
return PrintError("SaveAs", err, errinfo); return PrintError("SaveAs", err, errinfo);

View File

@ -1,6 +1,8 @@
class(xlsxXml).CodePage('中文');
testCount := 0; testCount := 0;
sheetName := "hello"; sheetName := "你好";
sheetName2 := "world"; sheetName2 := "中文";
// OpenFile // OpenFile
excel := new TSExcelFile(); excel := new TSExcelFile();
@ -25,30 +27,41 @@ PrintInfo("NewFile", err, errmsg);
name := excel.FileName(); name := excel.FileName();
println("[success] name = {}", name); println("[success] name = {}", name);
// GetSheet
sheets := excel.GetSheets();
println("[success] sheets = {}", sheets);
// GetSheetsCount // GetSheetsCount
sheetCount := excel.GetSheetsCount(); sheetCount := excel.GetSheetsCount();
println("[success] GetSheetsCount = {}", sheetCount); println("[success] GetSheetsCount = {}", sheetCount);
// SetSheetName // SetSheetName
[err, errmsg] := excel.SetSheetName("sheet1", sheetName); excel.SetSheetName("sheet1", sheetName);
PrintInfo("SetSheetName", err, errmsg); println("[success] SetSheetName");
// GetSheetName // GetSheetName
sheetName := excel.GetSheetName(0); Name := excel.GetSheetName(0);
println("[success] GetSheetName = {}", sheetName); println("[success] GetSheetName = {}", Name);
// NewSheet // NewSheet
[err, errmsg] := excel.NewSheet(sheetName2); excel.NewSheet(sheetName2);
PrintInfo("NewSheet", err, errmsg); println("[success] NewSheet");
// GetSheets
sheets := excel.GetSheets();
println("[success] sheets = {}", sheets);
// DeleteSheet // DeleteSheet
[err, errmsg] := excel.NewSheet("test1"); excel.NewSheet("test1");
//[err, errmsg] := excel.DeleteSheet("test1"); excel.DeleteSheet("test1");
//PrintInfo("DeleteSheet", err, errmsg); println("[success] DeleteSheet");
// SetCellValue
excel.SetCellValue(sheetName, "A1", 100);
excel.SetCellValue(sheetName, "F1", "中文的壹佰");
println("[success] SetCellValue");
// GetCellValue
[err, errmsg] := excel.GetCellValue(sheetName, "A1");
PrintInfo("GetCellValue A1 ", err, errmsg);
[err, errmsg] := excel.GetCellValue(sheetName, "F1");
PrintInfo("GetCellValue F1 ", err, errmsg);
// TotalCols // TotalCols
totalCols := excel.TotalCols(sheetName); totalCols := excel.TotalCols(sheetName);
@ -58,17 +71,9 @@ println("[success] TotalCols = {}", totalCols);
totalRows := excel.TotalRows(sheetName); totalRows := excel.TotalRows(sheetName);
println("[success] TotalRows = {}", totalRows); 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 // SetCellRichText
richText := TOfficeObj('TRichtext'); richText := TOfficeObj('TRichtext');
text1 := richText.AddText('Hello'); text1 := richText.AddText('Hello 你好');
text1.Font.Size := 35; text1.Font.Size := 35;
text1.Font.Color := "FFF000"; text1.Font.Color := "FFF000";
text2 := richText.AddText(" World"); text2 := richText.AddText(" World");
@ -77,10 +82,9 @@ text2.Font.Bold := true;
excel.SetCellRichText(sheetName, "A2", richText); excel.SetCellRichText(sheetName, "A2", richText);
text2.Text := "python"; text2.Text := "python";
excel.SetCellRichText(sheetName, "A3", richText); excel.SetCellRichText(sheetName, "A3", richText);
println("[success] SetCellRichText");
// GetCellRichText // GetCellRichText
arr := excel.GetCellRichText(sheetName, "A3"); arr := excel.GetCellRichText(sheetName, "A2");
println("[success] GetCellRichText = {}", arr); println("[success] GetCellRichText = {}", arr);
// ClearCell // ClearCell
@ -192,8 +196,6 @@ excel.NewSheet('Sheet1');
[err, errinfo] := excel.InsertTable("Sheet1","A5",data, true); [err, errinfo] := excel.InsertTable("Sheet1","A5",data, true);
chart1 := excel.AddChart('Sheet1', 'A11:G30', chart); chart1 := excel.AddChart('Sheet1', 'A11:G30', chart);
println("[success] AddChart"); println("[success] AddChart");
[err, errmsg] := excel.saveas("", "d:\\temp\\test.xlsx");
println("saveas : {}", err);
// GetCharts // GetCharts
[err, charts] := excel.GetCharts('Sheet1'); [err, charts] := excel.GetCharts('Sheet1');
@ -443,6 +445,8 @@ shape_format.EndColOff := 7653;
shape_format.BegRowOff := 55577; shape_format.BegRowOff := 55577;
shape_format.EndRowOff := 66675; shape_format.EndRowOff := 66675;
shape_type := "roundRect"; shape_type := "roundRect";
//excel.AddShape(sheetName2, "A15", "C17", shape_type, shape_format);
//println("[success] AddShape");
// SetCoreProps // SetCoreProps
core := TOfficeObj('TCoreProperty'); core := TOfficeObj('TCoreProperty');

View File

@ -64,7 +64,7 @@ _Faq(docx);
///目录 ///目录
docx.AddTableContent(paragraphTitle, 1, 3); docx.AddTableContent(paragraphTitle, 1, 3);
v := docx.SaveAs('', 'TSDocFile-Help.docx'); v := docx.SaveAs('', UTF8ToAnsi('DocxFile使用帮助.docx'));
println('Test Over!\n Save {}: {},time={}秒', file, v, mtoc); println('Test Over!\n Save {}: {},time={}秒', file, v, mtoc);
//info := GetProfilerInfo(true); //info := GetProfilerInfo(true);
@ -119,7 +119,7 @@ Begin
//添加段落 //添加段落
preface := TOfficeObj('TParagraph'); preface := TOfficeObj('TParagraph');
preface.Run.T := '本文档由word_help.tsl脚本调用本文档中描述的接口自动生成!'; preface.Run.SetText( '本文档由word_help.tsl脚本调用本文档中描述的接口自动生成!' );
preface.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 preface.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值
preface.Format.LeftIndent := 440;//段落左边距 preface.Format.LeftIndent := 440;//段落左边距
preface.Font.Name := '宋体'; preface.Font.Name := '宋体';
@ -154,6 +154,7 @@ Begin
///TParagraph属性 ///TParagraph属性
_AddTitle(docx, 'TParagraph属性', 2); //第二级标题 _AddTitle(docx, 'TParagraph属性', 2); //第二级标题
attrs := array(('类别':'缺省w:r元素', '接口':'Run', '说明':'TRun对象'));
formatObj := new TOfficeObj('TwpPr'); formatObj := new TOfficeObj('TwpPr');
_LoadObjectAttributes(formatObj, attrs, '段落属性', 'Format'); _LoadObjectAttributes(formatObj, attrs, '段落属性', 'Format');
fontObj := new TOfficeObj('TwrPr'); fontObj := new TOfficeObj('TwrPr');
@ -166,10 +167,16 @@ Begin
conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject'); conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject');
_AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.2.', conf, 3);
///TRun方法
_AddTitle(docx, 'TRun方法段落中w:r元素', 2);
conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TRun');
conf union= _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'DocObject');
_AddFunctionHelpInfo(docx, '' $ paragraph $ '.3.', conf, 3);
///TTabStops对象 ///TTabStops对象
_AddTitle(docx, 'TTabStops对象', 2); _AddTitle(docx, 'TTabStops对象', 2);
conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TTabStops'); conf := _LoadClassInfo(docx.GetPath() + '\\funcext\\TSOffice\\TOfficeObj.tsf', 'TTabStops');
_AddFunctionHelpInfo(docx, '' $ paragraph $ '.3.', conf, 3); _AddFunctionHelpInfo(docx, '' $ paragraph $ '.4.', conf, 3);
///TabStop属性 ///TabStop属性
_AddTitle(docx, 'TTabStop属性', 2); //第二级标题 _AddTitle(docx, 'TTabStop属性', 2); //第二级标题
@ -287,7 +294,7 @@ Begin
p1 := TOfficeObj('TParagraph'); p1 := TOfficeObj('TParagraph');
p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值
p1.Format.LeftIndent := 440;//段落左边距 p1.Format.LeftIndent := 440;//段落左边距
p1.Run.AddText('本文档由天软科技制作。'); p1.Run.SetText('本文档由天软科技制作。');
p1.Run.rPr.Name := '宋体'; p1.Run.rPr.Name := '宋体';
p1.Run.rPr.Bold := true; p1.Run.rPr.Bold := true;
p1.Run.rPr.Size := 32; p1.Run.rPr.Size := 32;
@ -375,7 +382,7 @@ Begin
p1 := TOfficeObj('TParagraph'); p1 := TOfficeObj('TParagraph');
p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值
p1.Format.LeftIndent := 440;//段落左边距 p1.Format.LeftIndent := 440;//段落左边距
p1.Run.T := '插入案例。'; p1.Run.SetText( '插入案例。' );
p1.Run.rPr.Name := '宋体'; p1.Run.rPr.Name := '宋体';
p1.Run.rPr.Bold := true; p1.Run.rPr.Bold := true;
p1.Run.rPr.Size := 32; p1.Run.rPr.Size := 32;
@ -394,7 +401,7 @@ Begin
p1 := TOfficeObj('TParagraph'); p1 := TOfficeObj('TParagraph');
p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值
p1.Format.LeftIndent := 440;//段落左边距 p1.Format.LeftIndent := 440;//段落左边距
p1.Run.T := '删除修订案例。'; p1.Run.SetText( '删除修订案例。' );
p1.Run.rPr.Name := '宋体'; p1.Run.rPr.Name := '宋体';
p1.Run.rPr.Bold := true; p1.Run.rPr.Bold := true;
p1.Run.rPr.Size := 32; p1.Run.rPr.Size := 32;
@ -481,7 +488,7 @@ Begin
///添加页眉、页脚案例 ///添加页眉、页脚案例
_AddTitle(docx, '添加页眉、页脚案例', 2); _AddTitle(docx, '添加页眉、页脚案例', 2);
help := TOfficeObj('TParagraph'); help := TOfficeObj('TParagraph');
help.Run.T := '参考word_help.tsl脚本(TDocxFile::Sections, TDocSection::AddHeader, TDocSection::AddFooter)!'; help.Run.SetText( '参考word_help.tsl脚本(TDocxFile::Sections, TDocSection::AddHeader, TDocSection::AddFooter)!' );
help.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 help.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值
help.Format.LeftIndent := 440;//段落左边距 help.Format.LeftIndent := 440;//段落左边距
help.Font.Name := '宋体'; help.Font.Name := '宋体';
@ -494,7 +501,7 @@ Begin
footer := section.AddFooter('');//添加缺省页脚 footer := section.AddFooter('');//添加缺省页脚
//页脚内容 //页脚内容
p := TOfficeObj('TParagraph'); p := TOfficeObj('TParagraph');
p.Run.T := '电 话0755-83937039'; p.Run.SetText( '电 话0755-83937039' );
p.AddRun('网 址http://www.tinysoft.com.cn', true); p.AddRun('网 址http://www.tinysoft.com.cn', true);
p.AddRun('公司地址深圳市福田区莲花街道梅岭社区新闻路59号深茂商业中心19F', true); p.AddRun('公司地址深圳市福田区莲花街道梅岭社区新闻路59号深茂商业中心19F', true);
p.Format.Bdr.Top.val := 'single';//页脚横线 p.Format.Bdr.Top.val := 'single';//页脚横线
@ -512,7 +519,7 @@ Begin
//添加页眉 //添加页眉
header := section.AddHeader('');//添加缺省页眉 header := section.AddHeader('');//添加缺省页眉
p := TOfficeObj('TParagraph'); p := TOfficeObj('TParagraph');
p.Run.T := '深圳市天软科技开发有限公司'; p.Run.SetText( '深圳市天软科技开发有限公司' );
p.Format.Alignment := 'right'; //据右对齐 p.Format.Alignment := 'right'; //据右对齐
//p.Format.Bdr.Bottom.val := 'single';//页眉横线 //p.Format.Bdr.Bottom.val := 'single';//页眉横线
p.Font.Name := '宋体'; p.Font.Name := '宋体';
@ -565,7 +572,7 @@ Begin
p1 := TOfficeObj('TParagraph'); p1 := TOfficeObj('TParagraph');
p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值 p1.Format.FirstLineIndent := 220; //指定段落第一行缩进的相对差异的值
p1.Format.LeftIndent := 440;//段落左边距 p1.Format.LeftIndent := 440;//段落左边距
p1.Run.T := '深圳市天软公司'; p1.Run.SetText( '深圳市天软公司' );
p1.Run.rPr.Name := '宋体'; p1.Run.rPr.Name := '宋体';
pTest := docx.AddParagraph(p1, -1, nil); pTest := docx.AddParagraph(p1, -1, nil);
//修改部分文字字体 //修改部分文字字体
@ -641,7 +648,7 @@ Begin
p.Font.Color := 'FF0000'; p.Font.Color := 'FF0000';
p.Font.Bold := true; p.Font.Bold := true;
p.Format.LeftIndent := 700;//段落左边距 p.Format.LeftIndent := 700;//段落左边距
p.Run.T := 'NumberId("bullet", ' $ i $ ')'; p.Run.SetText( 'NumberId("bullet", ' $ i $ ')' );
docx.AddParagraph(p, -1, nil); docx.AddParagraph(p, -1, nil);
End; End;
@ -814,7 +821,7 @@ Begin
if not ifString(conf[i]['comment']) or conf[i]['comment'] = '' then continue; if not ifString(conf[i]['comment']) or conf[i]['comment'] = '' then continue;
arr := str2array(conf[i]['funcname'], '('); arr := str2array(conf[i]['funcname'], '(');
k := lowercase(arr[0]); k := lowercase(arr[0]);
if hash[k]=1 and ( not k in array('create')) then continue; if hash[k]=1 and not (k in array('create')) then continue;
hash[k] := 1; hash[k] := 1;
subject := head $ ind++ $ ' ' $ conf[i]['funcname']; subject := head $ ind++ $ ' ' $ conf[i]['funcname'];
_AddTitle(docx, conf[i]['funcname'], level); _AddTitle(docx, conf[i]['funcname'], level);
@ -825,7 +832,7 @@ Begin
pFun.Format.LeftIndent := 1760;//段落左边距 pFun.Format.LeftIndent := 1760;//段落左边距
pFun.Font.Name := '宋体'; pFun.Font.Name := '宋体';
println(' Subject:{}', subject); println(' Subject:{}', subject);
pFun.Run.T := 'Function ' + conf[i]['funcname']; pFun.Run.SetText( 'Function ' + conf[i]['funcname'] );
p1 := docx.AddParagraph(pFun, -1, nil);//函数方法 p1 := docx.AddParagraph(pFun, -1, nil);//函数方法
//设置首行字体颜色、黑体 //设置首行字体颜色、黑体
firstRun := p1.GetRun(0); firstRun := p1.GetRun(0);
@ -836,7 +843,7 @@ Begin
//添加函数帮助信息段落 //添加函数帮助信息段落
arr := str2array(conf[i]['comment'], '\n'); arr := str2array(conf[i]['comment'], '\n');
for j:=0 to length(arr)-1 do Begin for j:=0 to length(arr)-1 do Begin
pFun.Run.T := '///' + arr[j]; pFun.Run.SetText('///' + arr[j]);
p2 := docx.AddParagraph(pFun, -1, nil); p2 := docx.AddParagraph(pFun, -1, nil);
End; End;
@ -1088,7 +1095,7 @@ Begin
str := str[2:]; str := str[2:];
println(' FAQ: {}', str); println(' FAQ: {}', str);
End; End;
p.Run.T := str; p.Run.SetText( str );
End; End;
if title then Begin if title then Begin
p.Format.numPr.Level := 0;//项目编号 p.Format.numPr.Level := 0;//项目编号

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,3 +1,4 @@
// Version 1.0.4
Function TOfficeObj(n); Function TOfficeObj(n);
Begin Begin
case lowercase(n) of case lowercase(n) of
@ -199,8 +200,8 @@ Begin
return new TwInline(); return new TwInline();
"twdrawing": "twdrawing":
return new TwDrawing(); return new TwDrawing();
"tinstrtext": "ttext":
return new TInstrText(); return new TText();
"trun": "trun":
return new TRun(); return new TRun();
"tbookmark": "tbookmark":
@ -333,52 +334,59 @@ type TFont=class(NodeInfo)
Function GetChildren(); override; Function GetChildren(); override;
Begin Begin
HandleChildren(); HandleChildren();
return array(("field":"Background","name":"background","obj":Background,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") return array(("field":"FontName","name":"name","obj":FontName,"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":"Size","name":"sz","obj":Size,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"Strikethrough","name":"strike","obj":Strikethrough,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"") ,("field":"Bold","name":"b","obj":Bold,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"")
,("field":"Subscript","name":"subscript","obj":Subscript,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ,("field":"Italic","name":"i","obj":Italic,"attrEx":"","nodeType":"empty","attrName":"", "desc":"", "class":"")
,("field":"Superscript","name":"superscript","obj":Superscript,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ,("field":"Color","name":"color","obj":Color,"attrEx":"","nodeType":"","attrName":"rgb", "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":"ThemeColor","name":"color","obj":ThemeColor,"attrEx":"theme","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"TintAndShade","name":"tintandshade","obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ,("field":"Strikethrough","name":"strike","obj":Strikethrough,"attrEx":"","nodeType":"empty","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":"Script","name":"vertAlign","obj":Script,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"Charset","name":"charset","obj":Charset,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ,("field":"Charset","name":"charset","obj":Charset,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"Underline","name":"u","obj":Underline,"attrEx":"","nodeType":"empty_string","attrName":"", "desc":"", "class":"")
,("field":"FontStyle","name":"fontstyle","obj":FontStyle,"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":"TintAndShade","name":"tintandshade","obj":TintAndShade,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"Background","name":"background","obj":Background,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"rFont","name":"rFont","obj":rFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"") ,("field":"rFont","name":"rFont","obj":rFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"ThemeFont","name":"scheme","obj":ThemeFont,"attrEx":"","nodeType":"","attrName":"", "desc":"", "class":"")
,("field":"ColorIndex","name":"color","obj":ColorIndex,"attrEx":"index","nodeType":"","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":"")
) union ExtNodes; ) union ExtNodes;
End; End;
Property Name write writeName;
Function writeName(n);
Begin
nName := class(xlsxXml).CurCodePageToUtf8(n);
FontName := nName;
End;
//Attributes //Attributes
//Nodes //Nodes
Background; FontName;
Bold;
Color;
ColorIndex;
FontStyle;
Italic;
Name;
OutlineFont;
Shadow;
Size; Size;
Strikethrough; Bold;
Subscript; Italic;
Superscript; Color;
Underline;
ThemeColor; ThemeColor;
TintAndShade; Strikethrough;
ThemeFont;
Script; Script;
Charset; Charset;
Underline;
FontStyle;
OutlineFont;
Shadow;
TintAndShade;
Background;
rFont; rFont;
ThemeFont;
ColorIndex;
Subscript;
Superscript;
End; End;
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
@ -3660,7 +3668,7 @@ type THyperLink=class(NodeInfo)
Function GetAttrs(); override; Function GetAttrs(); override;
Begin Begin
HandleAttrs(); HandleAttrs();
return array(("LinkType", "linkType", LinkType, ""),("LinkUrl", "linkUrl", LinkUrl, ""),("Axis", "ref", Axis, ""),("Display", "display", Display, ""),("Tooltip", "tooltip", Tooltip, "")) union ExtAttr; return array(("LinkType", "linkType", LinkType, ""),("Url", "linkUrl", Url, ""),("Axis", "ref", Axis, ""),("LinkDisplay", "display", LinkDisplay, ""),("LinkTooltip", "tooltip", LinkTooltip, "")) union ExtAttr;
End; End;
Function GetChildren(); override; Function GetChildren(); override;
@ -3669,12 +3677,30 @@ type THyperLink=class(NodeInfo)
return ExtNodes; return ExtNodes;
End; End;
Property LinkUrl read Url write writeUrl;
Function writeUrl(str);
Begin
Url := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Display read LinkDisplay write writeLinkDisplay;
Function writeLinkDisplay(str);
Begin
LinkDisplay := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Tooltip read LinkTooltip write writeLinkTooltip;
Function writeLinkTooltip(str);
Begin
LinkTooltip := class(xlsxXml).CurCodePageToUtf8(str);
End;
//Attributes //Attributes
LinkType; LinkType;
LinkUrl; Url;
Axis; Axis;
Display; LinkDisplay;
Tooltip; LinkTooltip;
//Nodes //Nodes
End; End;
@ -3798,30 +3824,54 @@ type TAppProperty=class(NodeInfo)
Function GetChildren(); override; Function GetChildren(); override;
Begin Begin
HandleChildren(); HandleChildren();
return array(("field":"Application","name":"Application","obj":Application,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") return array(("field":"AppApplication","name":"Application","obj":AppApplication,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"DocSecurity","name":"DocSecurity","obj":DocSecurity,"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":"ScaleCrop","name":"ScaleCrop","obj":ScaleCrop,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"Manager","name":"Manager","obj":Manager,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"AppManager","name":"Manager","obj":AppManager,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"Company","name":"Company","obj":Company,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"AppCompany","name":"Company","obj":AppCompany,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"LinksUpToDate","name":"LinksUpToDate","obj":LinksUpToDate,"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":"SharedDoc","name":"SharedDoc","obj":SharedDoc,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"HyperlinkBase","name":"HyperlinkBase","obj":HyperlinkBase,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"AppHyperlinkBase","name":"HyperlinkBase","obj":AppHyperlinkBase,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"HyperlinksChanged","name":"HyperlinksChanged","obj":HyperlinksChanged,"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":"") ,("field":"AppVersion","name":"AppVersion","obj":AppVersion,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
) union ExtNodes; ) union ExtNodes;
End; End;
Property Application read AppApplication write writeAppApplication;
Function writeAppApplication(str);
Begin
AppApplication := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Manager read AppManager write writeAppManager;
Function writeAppManager(str);
Begin
AppManager := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Company read AppCompany write writeAppCompany;
Function writeAppCompany(str);
Begin
AppCompany := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property HyperlinkBase read AppHyperlinkBase write writeAppHyperlinkBase;
Function writeAppHyperlinkBase(str);
Begin
AppHyperlinkBase := class(xlsxXml).CurCodePageToUtf8(str);
End;
//Attributes //Attributes
//Nodes //Nodes
Application; AppApplication;
DocSecurity; DocSecurity;
ScaleCrop; ScaleCrop;
Manager; AppManager;
Company; AppCompany;
LinksUpToDate; LinksUpToDate;
SharedDoc; SharedDoc;
HyperlinkBase; AppHyperlinkBase;
HyperlinksChanged; HyperlinksChanged;
AppVersion; AppVersion;
End; End;
@ -3855,30 +3905,84 @@ type TCoreProperty=class(NodeInfo)
Function GetChildren(); override; Function GetChildren(); override;
Begin Begin
HandleChildren(); HandleChildren();
return array(("field":"Title","name":"dc:title","obj":Title,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") return array(("field":"CoreTitle","name":"dc:title","obj":CoreTitle,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"Subject","name":"dc:subject","obj":Subject,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreSubject","name":"dc:subject","obj":CoreSubject,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"Creator","name":"dc:creator","obj":Creator,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreCreator","name":"dc:creator","obj":CoreCreator,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"Keywords","name":"cp:keywords","obj":Keywords,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreKeywords","name":"cp:keywords","obj":CoreKeywords,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"Description","name":"dc:description","obj":Description,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreDescription","name":"dc:description","obj":CoreDescription,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"LastModifiedBy","name":"cp:lastModifiedBy","obj":LastModifiedBy,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreLastModifiedBy","name":"cp:lastModifiedBy","obj":CoreLastModifiedBy,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"LastPrinted","name":"cp:lastPrinted","obj":LastPrinted,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreLastPrinted","name":"cp:lastPrinted","obj":CoreLastPrinted,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"Category","name":"cp:category","obj":Category,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreCategory","name":"cp:category","obj":CoreCategory,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
,("field":"ContentStatus","name":"cp:contentStatus","obj":ContentStatus,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") ,("field":"CoreContentStatus","name":"cp:contentStatus","obj":CoreContentStatus,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"")
) union ExtNodes; ) union ExtNodes;
End; End;
Property Title read CoreTitle write writeCoreTitle;
Function writeCoreTitle(str);
Begin
CoreTitle := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Subject read CoreSubject write writeCoreSubject;
Function writeCoreSubject(str);
Begin
CoreSubject := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Creator read CoreCreator write writeCoreCreator;
Function writeCoreCreator(str);
Begin
CoreCreator := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Keywords read CoreKeywords write writeCoreKeywords;
Function writeCoreKeywords(str);
Begin
CoreKeywords := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Description read CoreDescription write writeCoreDescription;
Function writeCoreDescription(str);
Begin
CoreDescription := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property LastModifiedBy read CoreLastModifiedBy write writeCoreLastModifiedBy;
Function writeCoreLastModifiedBy(str);
Begin
CoreLastModifiedBy := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property LastPrinted read CoreLastPrinted write writeCoreLastPrinted;
Function writeCoreLastPrinted(str);
Begin
CoreLastPrinted := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property Category read CoreCategory write writeCoreCategory;
Function writeCoreCategory(str);
Begin
CoreCategory := class(xlsxXml).CurCodePageToUtf8(str);
End;
Property ContentStatus read CoreContentStatus write writeCoreContentStatus;
Function writeCoreContentStatus(str);
Begin
CoreContentStatus := class(xlsxXml).CurCodePageToUtf8(str);
End;
//Attributes //Attributes
//Nodes //Nodes
Title; CoreTitle;
Subject; CoreSubject;
Creator; CoreCreator;
Keywords; CoreKeywords;
Description; CoreDescription;
LastModifiedBy; CoreLastModifiedBy;
LastPrinted; CoreLastPrinted;
Category; CoreCategory;
ContentStatus; CoreContentStatus;
End; End;
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
@ -4019,10 +4123,13 @@ type TwrPr=class(NodeInfo)
Property Name write writeName; Property Name write writeName;
Function writeName(n); Function writeName(n);
Begin Begin
rFont.cs := n; nName := n;
rFont.eastAsia := n; if not class(xlsxXml).IsUtf8() then
rFont.hAnsi := n; nName := class(xlsxXml).CurCodePageToUtf8(n);
rFont.ascii := n; rFont.cs := nName;
rFont.eastAsia := nName;
rFont.hAnsi := nName;
rFont.ascii := nName;
End; End;
//Attributes //Attributes
@ -5073,12 +5180,12 @@ type TwDrawing=class(NodeInfo)
End; End;
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
/// TInstrText /// TText
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
type TInstrText=class(NodeInfo) type TText=class(NodeInfo)
Function Create(); overload; Function Create(); overload;
Begin Begin
Create(nil, 'w:instrText'); Create(nil, 'w:t');
End; End;
Function Create(p, name); overload; Function Create(p, name); overload;
@ -5101,7 +5208,7 @@ type TInstrText=class(NodeInfo)
Function GetChildren(); override; Function GetChildren(); override;
Begin Begin
HandleChildren(); HandleChildren();
return array(("field":"Data","name":"Data","obj":Data,"attrEx":"","nodeType":"pcdata","attrName":"", "desc":"", "class":"") return array(("field":"Text","name":"Text","obj":Text,"attrEx":"","nodeType":"tcdata","attrName":"", "desc":"", "class":"")
) union ExtNodes; ) union ExtNodes;
End; End;
@ -5109,7 +5216,7 @@ type TInstrText=class(NodeInfo)
Space; Space;
//Nodes //Nodes
Data; Text;
End; End;
/////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////
@ -7463,7 +7570,7 @@ type TTableStyle=class(NodeInfo)
Function GetAttrs(); override; Function GetAttrs(); override;
Begin Begin
HandleAttrs(); 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; return array(("Name", "tableName", Name, ""),("TableStyle", "name", TableStyle, ""),("ShowFirstColumn", "showFirstColumn", ShowFirstColumn, ""),("ShowLastColumn", "showLastColumn", ShowLastColumn, ""),("ShowRowStripes", "showRowStripes", ShowRowStripes, ""),("ShowColumnStripes", "showColumnStripes", ShowColumnStripes, ""),("HeaderRowCount", "HeaderRowCount", HeaderRowCount, ""),("TotalsRowShown", "totalsRowShown", TotalsRowShown, "")) union ExtAttr;
End; End;
Function GetChildren(); override; Function GetChildren(); override;
@ -7472,8 +7579,14 @@ type TTableStyle=class(NodeInfo)
return ExtNodes; return ExtNodes;
End; End;
Property TableName read Name write writeName;
Function writeName(n);
Begin
Name := class(xlsxXml).CurCodePageToUtf8(n);
End;
//Attributes //Attributes
TableName; Name;
TableStyle; TableStyle;
ShowFirstColumn; ShowFirstColumn;
ShowLastColumn; ShowLastColumn;
@ -7655,6 +7768,13 @@ Type DocObject = Class
Begin Begin
obj.NodeName := 'w:ins'; obj.NodeName := 'w:ins';
obj.name_ := obj.NodeName; obj.name_ := obj.NodeName;
tmpAuthor := obj.Author;
tmpTxt := obj.InsText;
if not class(xlsxXml).IsUtf8() then Begin
if ifstring(obj.Author) then
obj.Author := class(xlsxXml).CurCodePageToUtf8(obj.Author);
obj.InsText := class(xlsxXml).CurCodePageToUtf8(obj.InsText);
End;
r := _split_range(obj.sPos, 0); r := _split_range(obj.sPos, 0);
if length(r) then Begin if length(r) then Begin
rNode := r[length(r)-1]['rNode']; rNode := r[length(r)-1]['rNode'];
@ -7676,7 +7796,9 @@ Type DocObject = Class
node2 := node.InsertEndChild('element', 'w:r'); node2 := node.InsertEndChild('element', 'w:r');
End; End;
run := new TRun(node2); run := new TRun(node2);
run.SetText(obj.InsText); run.SetText(obj.InsText, true);
obj.InsText := tmpTxt;
obj.Author := tmpAuthor;
obj.Init(node); obj.Init(node);
return true; return true;
End; End;
@ -7686,6 +7808,9 @@ Type DocObject = Class
///返回:成功 true失败 false ///返回:成功 true失败 false
Function DelRevision(obj); Function DelRevision(obj);
Begin Begin
tmpAuthor := obj.Author;
if ifstring(obj.Author) and not class(xlsxXml).IsUtf8() then
obj.Author := class(xlsxXml).CurCodePageToUtf8(obj.Author);
r := _split_range(obj.sPos, obj.SelectLength); r := _split_range(obj.sPos, obj.SelectLength);
for i:=0 to length(r)-1 do Begin for i:=0 to length(r)-1 do Begin
rNode := r[i]['rNode']; rNode := r[i]['rNode'];
@ -7695,6 +7820,7 @@ Type DocObject = Class
delNode.InsertFirstChild(rXml); delNode.InsertFirstChild(rXml);
rNode.Parent().DeleteChild(rNode); rNode.Parent().DeleteChild(rNode);
End; End;
obj.Author := tmpAuthor;
return length(r); return length(r);
End; End;
@ -7804,7 +7930,9 @@ Type DocObject = Class
rSize := 0; rSize := 0;
for i:=0 to length(r)-1 do Begin for i:=0 to length(r)-1 do Begin
run := new TRun(r[i]['rNode']); run := new TRun(r[i]['rNode']);
txt := UTF8ToAnsi(run.Text()); txt := run.Text();
if class(xlsxXml).IsUtf8() then
txt := UTF8ToAnsi(txt);
txtLen := lengthW(txt); txtLen := lengthW(txt);
if rangeLength >= 0 and sPos + rangeLength <= rSize then Begin if rangeLength >= 0 and sPos + rangeLength <= rSize then Begin
return t; return t;
@ -8242,8 +8370,8 @@ Type TParagraph = Class(DocObject, TParagraphImpl)
o := new TRun(); o := new TRun();
o.Parent := self; o.Parent := self;
NewChildNode( array("field":"", "name":"w:r", "obj":o, "attrEx":"", "nodeType":"") ); NewChildNode( array("field":"", "name":"w:r", "obj":o, "attrEx":"", "nodeType":"") );
if ifString(txt) then if txt then
o.T := txt; o.SetText(txt);
if newLine then if newLine then
o.Br.Type := ''; o.Br.Type := '';
return o; return o;
@ -8492,26 +8620,52 @@ Type TRun = Class(DocObject, TRunImpl)
End; End;
///添加文字 ///添加文字
Function AddText(txt); ///[isUtf8]可选参数当前字符集是否utf8缺省false
Function AddText(txt, isUtf8);
Begin Begin
str := txt;
if not isUtf8 and not class(xlsxXml).IsUtf8() then
str := class(xlsxXml).CurCodePageToUtf8(txt);
if ifObj(node_) then Begin if ifObj(node_) then Begin
_insertText(txt, false); _insertText(str, false);
return; return;
End; End;
lines := str2array(txt,'\n'); lines := str2array(str,'\n');
for i:=0 to length(lines)-1 do Begin T := lines[0];
//line := TrimRight(lines[i]); if _preserve(T) then
if i then Space := 'preserve';
for i:=1 to length(lines)-1 do Begin
NewChildNode( array("field":"", "name":"w:br", "obj":1, "attrEx":"", "nodeType":"empty") ); NewChildNode( array("field":"", "name":"w:br", "obj":1, "attrEx":"", "nodeType":"empty") );
NewChildNode( array("field":"", "name":"w:t", "obj":lines[i], "attrEx":"", "nodeType":"pcdata") ); NewChildNode( array("field":"", "name":"w:t", "obj":lines[i], "attrEx":"", "nodeType":"pcdata") );
if _preserve(lines[i]) then
NewChildNode( array("field":"", "name":"w:t", "obj":'preserve', "attrEx":"xml:space", "nodeType":"") );
End; End;
End; End;
///修改文字 ///修改文字
Function SetText(txt); ///[isUtf8]可选参数当前字符集是否utf8缺省false
Function SetText(txt, isUtf8);
Begin Begin
str := txt;
if not isUtf8 and not class(xlsxXml).IsUtf8() then
str := class(xlsxXml).CurCodePageToUtf8(txt);
if ifObj(node_) then Begin
ClearText();//删除原来文字 ClearText();//删除原来文字
_insertText(txt, false);//添加文字 _insertText(str, false);//添加文字
return;
End;
ExtNodes := array();
T := nil;
AddText(str, true);
End;
Function _preserve(str);
Begin
cnt := length(str);
spaceArr := array(' ',' ');
if cnt and (str[1] in spaceArr or (cnt > 1 and str[cnt] in spaceArr)) then
return true;
return false;
End; End;
Function _insertText(txt, first); Function _insertText(txt, first);
@ -8545,6 +8699,8 @@ Type TRun = Class(DocObject, TRunImpl)
// txt += '\n'; // txt += '\n';
tNode := tNode.NextElement(); tNode := tNode.NextElement();
End; End;
if not class(xlsxXml).IsUtf8() then
return class(xlsxXml).Utf8ToCurCodePage(txt);
return txt; return txt;
End; End;
@ -8559,6 +8715,7 @@ Type TRun = Class(DocObject, TRunImpl)
///清除全部文字内容 ///清除全部文字内容
Function ClearText(); Function ClearText();
Begin Begin
if ifObj(node_) then Begin
n := node_.FirstChildElement('w:t'); n := node_.FirstChildElement('w:t');
while ifObj(n) do Begin while ifObj(n) do Begin
next := n.NextElement('w:t'); next := n.NextElement('w:t');
@ -8566,6 +8723,7 @@ Type TRun = Class(DocObject, TRunImpl)
n := next; n := next;
End; End;
End; End;
End;
End; End;
@ -8732,7 +8890,22 @@ Type TChart = Class(TChartImpl)
///添加图表Series数据 ///添加图表Series数据
Function AddSeries(Name, Categories, Value); Function AddSeries(Name, Categories, Value);
Begin Begin
Series union= array(("Name":Name,"Categories":Categories,"Values":Value)); SerName := name;
catArr := Categories;
if not class(xlsxXml).IsUtf8() then Begin
if name and ifstring(name) then
SerName := class(xlsxXml).CurCodePageToUtf8(name);
if ifstring(catArr) then
catArr := class(xlsxXml).CurCodePageToUtf8(catArr);
else if istable(catArr) then Begin
for i:=0 to length(catArr)-1 do Begin
if ifstring(catArr[i]) then
catArr[i] := class(xlsxXml).CurCodePageToUtf8(catArr[i]);
End;
End;
End;
Series union= array(("Name":SerName,"Categories":catArr,"Values":Value));
return length(Series); return length(Series);
End; End;
@ -9996,7 +10169,7 @@ Type TDocumentBody = Class(DocObject)
Function AddHeading(title, posOpt, styleId); Function AddHeading(title, posOpt, styleId);
Begin Begin
paragraph := new TParagraph(); paragraph := new TParagraph();
paragraph.Run.T := title; paragraph.Run.SetText( title );
if ifObj(document_) then Begin if ifObj(document_) then Begin
id := document_.GetBookMarkID(); id := document_.GetBookMarkID();
paragraph.MarkStart.Name := '_Toc' $ id; paragraph.MarkStart.Name := '_Toc' $ id;
@ -10127,14 +10300,7 @@ Type TDocumentBody = Class(DocObject)
tcArr union= array(('name':'w:tc','obj':tc,'attrEx':'','nodeType':'','attrName':'')); tcArr union= array(('name':'w:tc','obj':tc,'attrEx':'','nodeType':'','attrName':''));
tc.TcPr.Width := colWidth; tc.TcPr.Width := colWidth;
tc.TcPr.Type := 'dxa'; tc.TcPr.Type := 'dxa';
tc.AddText(data[i, j]); tc.SetText(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; End;
tr.Tc := tcArr; tr.Tc := tcArr;
End; End;
@ -10214,7 +10380,7 @@ Type TDocumentBody = Class(DocObject)
picId := getPictureMaxId() + 1; picId := getPictureMaxId() + 1;
picture.Run.Drawing.WInline.ID := picId; picture.Run.Drawing.WInline.ID := picId;
picture.Run.Drawing.WInline.Name := '图片 ' $ picId; picture.Run.Drawing.WInline.Name := '图片 ' $ picId;
picture.Run.Drawing.WInline.Descr := picture.Descr; picture.Run.Drawing.WInline.Descr := class(xlsxXml).CurCodePageToUtf8(picture.Descr);
picture.Run.Drawing.WInline.cNvGraphicFramePr.xmlns := 'http://schemas.openxmlformats.org/drawingml/2006/main'; picture.Run.Drawing.WInline.cNvGraphicFramePr.xmlns := 'http://schemas.openxmlformats.org/drawingml/2006/main';
picture.Run.Drawing.WInline.cNvGraphicFramePr.noChangeAspect := 1; 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.xmlns := 'http://schemas.openxmlformats.org/drawingml/2006/main';
@ -10592,8 +10758,7 @@ Type TDocHeaderFooter = Class(TDocumentBody)
class(xlsxXml).CopyRprFormat(run.rPr, font); class(xlsxXml).CopyRprFormat(run.rPr, font);
End End
else Begin else Begin
run.space := 'preserve'; run.SetText( r[i] );
run.T := r[i];
class(xlsxXml).CopyRprFormat(Run.rPr, font); class(xlsxXml).CopyRprFormat(Run.rPr, font);
End; End;
End; End;
@ -10848,7 +11013,7 @@ Type TCell = Class(TDocumentBody, TWTc)
End; End;
///添加文字 ///添加文字
Function AddText(txt); Function SetText(txt);
Begin Begin
if not ifString(txt) then if not ifString(txt) then
lines := array('' $ txt); lines := array('' $ txt);
@ -10860,7 +11025,7 @@ Type TCell = Class(TDocumentBody, TWTc)
newp.pPr.rPr.eastAsia := 'zh-CN'; newp.pPr.rPr.eastAsia := 'zh-CN';
newp.Run.rPr.Lang := 'en-US'; newp.Run.rPr.Lang := 'en-US';
newp.Run.rPr.eastAsia := 'zh-CN'; newp.Run.rPr.eastAsia := 'zh-CN';
newp.Run.T := lines[i]; newp.Run.SetText( lines[i] );
NewChildNode( array("field":"", "name":"w:p", "obj":newp, "attrEx":"", "nodeType":"") ); NewChildNode( array("field":"", "name":"w:p", "obj":newp, "attrEx":"", "nodeType":"") );
End; End;
if not istable(lines) then if not istable(lines) then
@ -11169,57 +11334,57 @@ Type TCoreProperties = Class(DocObject)
private private
Function readAuthor(); Function readAuthor();
Begin Begin
return class(xlsxXml).GetNode(node_, 'dc:creator'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'dc:creator'));
End; End;
Function readCategory(); Function readCategory();
Begin Begin
return class(xlsxXml).GetNode(node_, 'cp:category'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'cp:category'));
End; End;
Function readDescription(); Function readDescription();
Begin Begin
return class(xlsxXml).GetNode(node_, 'dc:description'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'dc:description'));
End; End;
Function readSubject(); Function readSubject();
Begin Begin
return class(xlsxXml).GetNode(node_, 'dc:subject'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'dc:subject'));
End; End;
Function readTitle(); Function readTitle();
Begin Begin
return class(xlsxXml).GetNode(node_, 'dc:title'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'dc:title'));
End; End;
Function readVersion(); Function readVersion();
Begin Begin
return class(xlsxXml).GetNode(node_, 'cp:version'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'cp:version'));
End; End;
Function readRversion(); Function readRversion();
Begin Begin
return class(xlsxXml).GetNode(node_, 'cp:rversion'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'cp:rversion'));
End; End;
Function readKeyWords(); Function readKeyWords();
Begin Begin
return class(xlsxXml).GetNode(node_, 'cp:keywords'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'cp:keywords'));
End; End;
Function readLastModifiedBy(); Function readLastModifiedBy();
Begin Begin
return class(xlsxXml).GetNode(node_, 'cp:lastModifiedBy'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'cp:lastModifiedBy'));
End; End;
Function readCreated(); Function readCreated();
Begin Begin
return class(xlsxXml).GetNode(node_, 'dcterms:created'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'dcterms:created'));
End; End;
Function readModified(); Function readModified();
Begin Begin
return class(xlsxXml).GetNode(node_, 'dcterms:modified'); return class(xlsxXml).Utf8ToCurCodePage(class(xlsxXml).GetNode(node_, 'dcterms:modified'));
End; End;
Function propNode(k); Function propNode(k);
@ -11231,47 +11396,47 @@ private
Function writeAuthor(v); Function writeAuthor(v);
Begin Begin
return propNode('dc:creator').SetValue(v); return propNode('dc:creator').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeCategory(v); Function writeCategory(v);
Begin Begin
return propNode('cp:category').SetValue(v); return propNode('cp:category').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeDescription(v); Function writeDescription(v);
Begin Begin
return propNode('dc:description').SetValue(v); return propNode('dc:description').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeSubject(v); Function writeSubject(v);
Begin Begin
return propNode('dc:subject').SetValue(v); return propNode('dc:subject').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeTitle(v); Function writeTitle(v);
Begin Begin
return propNode('dc:title').SetValue(v); return propNode('dc:title').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeVersion(v); Function writeVersion(v);
Begin Begin
return propNode('cp:version').SetValue(v); return propNode('cp:version').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeRversion(v); Function writeRversion(v);
Begin Begin
return propNode('cp:rversion').SetValue(v); return propNode('cp:rversion').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeKeyWords(v); Function writeKeyWords(v);
Begin Begin
return propNode('cp:keywords').SetValue(v); return propNode('cp:keywords').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeLastModifiedBy(v); Function writeLastModifiedBy(v);
Begin Begin
return propNode('cp:lastModifiedBy').SetValue(v); return propNode('cp:lastModifiedBy').SetValue(class(xlsxXml).CurCodePageToUtf8(v));
End; End;
Function writeCreated(v); Function writeCreated(v);

View File

@ -1,3 +1,5 @@
// Version 1.0.4
Type TSDocxFile = Class Type TSDocxFile = Class
///Version: V1.0 2022-09-20 ///Version: V1.0 2022-09-20
///适用于 Microsoft Word docx格式文件 ///适用于 Microsoft Word docx格式文件
@ -304,8 +306,10 @@ Type TSDocxFile = Class
node := node.NextElement('w:comment'); node := node.NextElement('w:comment');
End; End;
c := TOfficeObj('TDocComment'); c := TOfficeObj('TDocComment');
c.p.Run.T := txt; c.p.Run.SetText( txt );
c.Author := author; c.Author := author;
if author and not class(xlsxXml).IsUtf8() then
c.Author := class(xlsxXml).CurCodePageToUtf8(author);
c.ID := id; c.ID := id;
xmlfile.FirstChildElement('w:comments').InsertEndChild(c.Marshal()); xmlfile.FirstChildElement('w:comments').InsertEndChild(c.Marshal());
return c; return c;

View File

@ -1,18 +1,20 @@
// Version 1.0.4
Type TSExcelFile = Class Type TSExcelFile = Class
///Version: V1.0 2022-08-08 ///Version: V1.0 2022-08-08
///适用于 Microsoft Excel? 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式。 ///适用于 Microsoft Excel? 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式。
///纯TSL模块实现 ///纯TSL模块实现
///Excel文件读写接口 ///Excel文件读写接口
//缺省构造函数 ///缺省构造函数
Function Create(); overload; Function Create(); overload;
Begin Begin
init(); init();
End; End;
//构造函数打开已经存在的excel文件 ///构造函数打开已经存在的excel文件
//alias: string文件目录别名 ///alias: string文件目录别名
//fname: string文件名 ///fname: string文件名
Function Create(alias, fname); overload; Function Create(alias, fname); overload;
Begin Begin
init(); init();
@ -51,9 +53,9 @@ Type TSExcelFile = Class
Begin Begin
path := ExtractFileDir(ExtractFileDir(PluginPath())); path := ExtractFileDir(ExtractFileDir(PluginPath()));
if path[1] = '/' then if path[1] = '/' then
defaultFileName := path + '\\funcext\\TSOffice\\template\\default.xlsx';
else
defaultFileName := path + '/funcext/TSOffice/template/default.xlsx'; defaultFileName := path + '/funcext/TSOffice/template/default.xlsx';
else
defaultFileName := path + '\\funcext\\TSOffice\\template\\default.xlsx';
return OpenFile('', defaultFileName); return OpenFile('', defaultFileName);
End; End;
@ -84,7 +86,12 @@ Type TSExcelFile = Class
///返回: array('Sheet1','Sheet2') ///返回: array('Sheet1','Sheet2')
Function GetSheets(); Function GetSheets();
Begin Begin
return workbook_.GetSheets(); sheets := workbook_.GetSheets();
for i:=0 to length(sheets)-1 do
begin
sheets[i] := class(xlsxXml).Utf8ToCurCodePage(sheets[i]);
end
return sheets;
End; End;
///获取工作表数 ///获取工作表数
@ -94,38 +101,36 @@ Type TSExcelFile = Class
return workbook_.GetSheetsCount(); return workbook_.GetSheetsCount();
End; End;
///获取工作表名
///index: int工作表索引
///返回: string
Function GetSheetName(index);
Begin
name := workbook_.GetSheetName(index);
return class(xlsxXml).Utf8ToCurCodePage(name);
End;
///创建新sheet
///sheet: string工作表名称
Function NewSheet(sheet);
Begin
return workbook_.NewSheet(class(xlsxXml).CurCodePageToUtf8(sheet));
End;
///删除sheet
///sheet: string工作表名称
Function DeleteSheet(sheet);
Begin
return workbook_.DeleteSheet(class(xlsxXml).CurCodePageToUtf8(sheet));
End;
///设置工作表名 ///设置工作表名
///sourceName: string, 原工作表名 ///sourceName: string, 原工作表名
///destName: string,目标工作表名 ///destName: string,目标工作表名
///返回: [err, errinfo] ///返回: [err, errinfo]
Function SetSheetName(sourceName, destName); Function SetSheetName(sourceName, destName);
Begin Begin
return workbook_.SetSheetName(sourceName, destName); return workbook_.SetSheetName(class(xlsxXml).CurCodePageToUtf8(sourceName), class(xlsxXml).CurCodePageToUtf8(destName));
End;
///获取工作表名
///index: int工作表索引
///返回: string
Function GetSheetName(index);
Begin
name := workbook_.GetSheets()[index];
return ifString(name) ? name : '';
End;
///创建新sheet
///sheet: string工作表名称
///返回: [err, info]
Function NewSheet(sheet);
Begin
return workbook_.NewSheet(sheet);
End;
///删除sheet
///sheet: string工作表名称
///返回: [err, info]
Function DeleteSheet(sheet);
Begin
return workbook_.DeleteSheet(sheet);
End; End;
///获取总列数 ///获取总列数
@ -133,8 +138,7 @@ Type TSExcelFile = Class
///返回: int ///返回: int
Function TotalCols(sheet); Function TotalCols(sheet);
Begin Begin
o := workbook_.GetSheetObj(sheet); return workbook_.TotalCols(class(xlsxXml).CurCodePageToUtf8(sheet));
if ifObj(o) then return o.TotalCols();
End; End;
///获取总行数 ///获取总行数
@ -142,8 +146,7 @@ Type TSExcelFile = Class
///返回: int ///返回: int
Function TotalRows(sheet); Function TotalRows(sheet);
Begin Begin
o := workbook_.GetSheetObj(sheet); return workbook_.TotalRows(class(xlsxXml).CurCodePageToUtf8(sheet));
if ifObj(o) then return o.TotalRows();
End; End;
///获取单元格的值 ///获取单元格的值
@ -152,9 +155,9 @@ Type TSExcelFile = Class
///返回: [err, value:string] ///返回: [err, value:string]
Function GetCellValue(sheet, axis); Function GetCellValue(sheet, axis);
Begin Begin
o := workbook_.GetSheetObj(sheet); [err, value] := workbook_.GetCellValue(class(xlsxXml).CurCodePageToUtf8(sheet), axis);
if ifObj(o) then return o.GetCellValue(axis); if not err then return array(err, class(xlsxXml).Utf8ToCurCodePage(value));
return class(ErrorMessage).Fail(); return array(err, value);
End; End;
///设置单元格的值 ///设置单元格的值
@ -169,8 +172,9 @@ Type TSExcelFile = Class
/// 属性s单元格样式 /// 属性s单元格样式
Function SetCellValue(sheet, axis, val, opt); Function SetCellValue(sheet, axis, val, opt);
Begin Begin
o := workbook_.GetSheetObj(sheet); sheet_name := class(xlsxXml).CurCodePageToUtf8(sheet);
if ifObj(o) then return o.SetCellValue(axis, val, opt); value := class(xlsxXml).CurCodePageToUtf8(val);
return workbook_.SetCellValue(sheet_name, axis, value, opt);
End; End;
///获取富文本格式 ///获取富文本格式
@ -179,9 +183,9 @@ Type TSExcelFile = Class
///返回: [err, richtxt:string]参见SetCellRichText ///返回: [err, richtxt:string]参见SetCellRichText
Function GetCellRichText(sheet, axis); Function GetCellRichText(sheet, axis);
Begin Begin
o := workbook_.GetSheetObj(sheet); [err, str] := workbook_.GetCellRichText(class(xlsxXml).CurCodePageToUtf8(sheet), axis);
if ifObj(o) then return o.GetCellValue(axis, 'RichText'); if err then return array(err, str);
return class(ErrorMessage).Fail(); else return array(err, class(xlsxXml).Utf8ToCurCodePage(str));
End; End;
///设置富文本格式 ///设置富文本格式
@ -190,11 +194,13 @@ Type TSExcelFile = Class
///richtext: stringxml串或富文本对象TSOfficeObj('TRichText') ///richtext: stringxml串或富文本对象TSOfficeObj('TRichText')
Function SetCellRichText(sheet, axis, richtext); Function SetCellRichText(sheet, axis, richtext);
Begin Begin
o := workbook_.GetSheetObj(sheet); o := workbook_.GetSheetObj(class(xlsxXml).CurCodePageToUtf8(sheet));
if ifObj(o) then begin if ifObj(o) then
begin
xml := richtext;
if ifObj(richtext) then if ifObj(richtext) then
xml := class(xlsxXml).Dom2Xml(richtext.Marshal()); xml := class(xlsxXml).Dom2Xml(richtext.Marshal());
return o.SetCellValue(axis, xml, array('t':'s'), 'RichText'); return o.SetCellValue(axis, class(xlsxXml).CurCodePageToUtf8(xml), array('t':'s'), 'RichText');
end end
End; End;
@ -207,8 +213,7 @@ Type TSExcelFile = Class
/// 用法3ClearCell('A5', 'D8'); //Clear矩形区间所有单元格 /// 用法3ClearCell('A5', 'D8'); //Clear矩形区间所有单元格
Function ClearCell(sheet, topLeft, bottomRight); Function ClearCell(sheet, topLeft, bottomRight);
Begin Begin
o := workbook_.GetSheetObj(sheet); return workbook_.ClearCell(class(xlsxXml).CurCodePageToUtf8(sheet), topLeft, bottomRight);
if ifObj(o) then o.ClearCell(topLeft, bottomRight);
End; End;
///设置公式 ///设置公式
@ -217,8 +222,7 @@ Type TSExcelFile = Class
///formula: string公式 ///formula: string公式
Function SetCellFormula(sheet, axis, formula); Function SetCellFormula(sheet, axis, formula);
Begin Begin
o := workbook_.GetSheetObj(sheet); return workbook_.SetCellFormula(class(xlsxXml).CurCodePageToUtf8(sheet), axis, formula);
if ifObj(o) then o.SetCellFormula(axis, formula);
End; End;
///获取公式 ///获取公式
@ -227,9 +231,7 @@ Type TSExcelFile = Class
///返回: [err, formula:string] ///返回: [err, formula:string]
Function GetCellFormula(sheet, axis); Function GetCellFormula(sheet, axis);
Begin Begin
o := workbook_.GetSheetObj(sheet); return workbook_.GetCellFormula(class(xlsxXml).CurCodePageToUtf8(sheet), axis);
if ifObj(o) then return o.GetCellFormula(axis);
return class(ErrorMessage).Fail();
End; End;
///按行赋值 ///按行赋值
@ -302,8 +304,7 @@ Type TSExcelFile = Class
///返回: table ///返回: table
Function GetTable(sheet, topLeft, bottomRight); Function GetTable(sheet, topLeft, bottomRight);
Begin Begin
o := workbook_.GetSheetObj(sheet); return workbook_.GetTable(class(xlsxXml).CurCodePageToUtf8(sheet), topLeft, bottomRight);
if ifObj(o) then return o.Import(topLeft, bottomRight);
End; End;
///插入列,在指定列前插入空白列 ///插入列,在指定列前插入空白列
@ -311,7 +312,7 @@ Type TSExcelFile = Class
///col: string 列名,如: "D" ///col: string 列名,如: "D"
Function InsertCol(sheet, col); Function InsertCol(sheet, col);
Begin Begin
return workbook_.InsertCol(sheet, col); return workbook_.InsertCol(class(xlsxXml).CurCodePageToUtf8(sheet), col);
End; End;
///插入行,在指定行前插入空白行 ///插入行,在指定行前插入空白行
@ -319,7 +320,7 @@ Type TSExcelFile = Class
///row: int ///row: int
Function InsertRow(sheet, row); Function InsertRow(sheet, row);
Begin Begin
return workbook_.InsertRow(sheet, row); return workbook_.InsertRow(class(xlsxXml).CurCodePageToUtf8(sheet), row);
End; End;
///删除列 ///删除列
@ -327,7 +328,7 @@ Type TSExcelFile = Class
///col: string如: "D" ///col: string如: "D"
Function RemoveCol(sheet, col); Function RemoveCol(sheet, col);
Begin Begin
return workbook_.RemoveCol(sheet, col); return workbook_.RemoveCol(class(xlsxXml).CurCodePageToUtf8(sheet), col);
End; End;
///删除行 ///删除行
@ -335,7 +336,7 @@ Type TSExcelFile = Class
///row: int ///row: int
Function RemoveRow(sheet, row); Function RemoveRow(sheet, row);
Begin Begin
return workbook_.RemoveRow(sheet, row); return workbook_.RemoveRow(class(xlsxXml).CurCodePageToUtf8(sheet), row);
End; End;
///设置行高度 ///设置行高度
@ -344,7 +345,7 @@ Type TSExcelFile = Class
///height: double行高[0-409] ///height: double行高[0-409]
Function SetRowHeight(sheet, row, height); Function SetRowHeight(sheet, row, height);
Begin Begin
return workbook_.SetRowHeight(sheet, row, height); return workbook_.SetRowHeight(class(xlsxXml).CurCodePageToUtf8(sheet), row, height);
End; End;
///获取行高度 ///获取行高度
@ -353,7 +354,7 @@ Type TSExcelFile = Class
///返回: double ///返回: double
Function GetRowHeight(sheet, row); Function GetRowHeight(sheet, row);
Begin Begin
return workbook_.GetRowHeight(sheet, row); return workbook_.GetRowHeight(class(xlsxXml).CurCodePageToUtf8(sheet), row);
End; End;
///设置列宽度 ///设置列宽度
@ -363,7 +364,7 @@ Type TSExcelFile = Class
///width: double列宽[0-255] ///width: double列宽[0-255]
Function SetColWidth(sheet, startCol, endCol, width); Function SetColWidth(sheet, startCol, endCol, width);
Begin Begin
return workbook_.SetColWidth(sheet, startCol, endCol, width); return workbook_.SetColWidth(class(xlsxXml).CurCodePageToUtf8(sheet), startCol, endCol, width);
End; End;
///获取列宽度 ///获取列宽度
@ -372,7 +373,7 @@ Type TSExcelFile = Class
///返回: double ///返回: double
Function GetColWidth(sheet, col); Function GetColWidth(sheet, col);
Begin Begin
return workbook_.GetColWidth(sheet, col); return workbook_.GetColWidth(class(xlsxXml).CurCodePageToUtf8(sheet), col);
End; End;
///设置工作表默认列宽 ///设置工作表默认列宽
@ -380,7 +381,7 @@ Type TSExcelFile = Class
///width: double ///width: double
Function SetSheetDefaultColWidth(sheet, width); Function SetSheetDefaultColWidth(sheet, width);
Begin Begin
return workbook_.SetSheetDefaultColWidth(sheet, width); return workbook_.SetSheetDefaultColWidth(class(xlsxXml).CurCodePageToUtf8(sheet), width);
End; End;
///获取工作表默认列宽 ///获取工作表默认列宽
@ -388,7 +389,7 @@ Type TSExcelFile = Class
///返回: double ///返回: double
Function GetSheetDefaultColWidth(sheet); Function GetSheetDefaultColWidth(sheet);
Begin Begin
return workbook_.GetSheetDefaultColWidth(sheet); return workbook_.GetSheetDefaultColWidth(class(xlsxXml).CurCodePageToUtf8(sheet));
End; End;
///添加批注 ///添加批注
@ -417,7 +418,7 @@ Type TSExcelFile = Class
///返回: [err, ChartList] ///返回: [err, ChartList]
Function GetCharts(sheet); Function GetCharts(sheet);
Begin Begin
return workbook_.GetCharts(sheet); return workbook_.GetCharts(class(xlsxXml).CurCodePageToUtf8(sheet));
End; End;
///单元格坐标切分 ///单元格坐标切分
@ -507,8 +508,7 @@ Type TSExcelFile = Class
///styleid: string样式Id ///styleid: string样式Id
Function SetCellStyle(sheet, topLeft, bottomRight, styleid); Function SetCellStyle(sheet, topLeft, bottomRight, styleid);
Begin Begin
o := workbook_.GetSheetObj(sheet); return workbook_.SetCellStyle(class(xlsxXml).CurCodePageToUtf8(sheet), topLeft, bottomRight, styleid);
if ifObj(o) then return o.SetCellStyle(topLeft, bottomRight, styleid);
End; End;
///获取单元格样式Id获取到的Id可以在复制单元格样式时作为调用 SetCellValue、或SetCellStyle 函数的参数使用。 ///获取单元格样式Id获取到的Id可以在复制单元格样式时作为调用 SetCellValue、或SetCellStyle 函数的参数使用。
@ -517,7 +517,7 @@ Type TSExcelFile = Class
///返回: styleId: string ///返回: styleId: string
Function GetCellStyle(sheet, axis); Function GetCellStyle(sheet, axis);
Begin Begin
return workbook_.GetCellStyle(sheet, axis); return workbook_.GetCellStyle(class(xlsxXml).CurCodePageToUtf8(sheet), axis);
End; End;
///设置工作表页眉页脚 ///设置工作表页眉页脚
@ -534,7 +534,7 @@ Type TSExcelFile = Class
///visible: boolean ///visible: boolean
Function SetSheetVisible(sheet, visible); Function SetSheetVisible(sheet, visible);
Begin Begin
return workbook_.SetSheetVisible(sheet, visible); return workbook_.SetSheetVisible(class(xlsxXml).CurCodePageToUtf8(sheet), visible);
End; End;
///获取工作表可见性 ///获取工作表可见性
@ -542,7 +542,7 @@ Type TSExcelFile = Class
///visibility: boolean ///visibility: boolean
Function GetSheetVisible(sheet); Function GetSheetVisible(sheet);
Begin Begin
return workbook_.GetSheetVisible(sheet); return workbook_.GetSheetVisible(class(xlsxXml).CurCodePageToUtf8(sheet));
End; End;
///设置行可见性 ///设置行可见性
@ -551,7 +551,7 @@ Type TSExcelFile = Class
///visible: boolean ///visible: boolean
Function SetRowVisible(sheet, row, visible) Function SetRowVisible(sheet, row, visible)
Begin Begin
return workbook_.SetRowVisible(sheet, row, visible); return workbook_.SetRowVisible(class(xlsxXml).CurCodePageToUtf8(sheet), row, visible);
End; End;
///获取工作表行可见性 ///获取工作表行可见性
@ -560,7 +560,7 @@ Type TSExcelFile = Class
///返回: [err, visible:boolean] ///返回: [err, visible:boolean]
Function GetRowVisble(sheet, row); Function GetRowVisble(sheet, row);
Begin Begin
return workbook_.GetRowVisble(sheet, row); return workbook_.GetRowVisble(class(xlsxXml).CurCodePageToUtf8(sheet), row);
End; End;
///设置列可见性 ///设置列可见性
@ -571,7 +571,7 @@ Type TSExcelFile = Class
Begin Begin
[err, col] := ColumnNameToNumber(col); [err, col] := ColumnNameToNumber(col);
if err then return "Col error."; if err then return "Col error.";
return workbook_.SetColVisible(sheet, col, visible); return workbook_.SetColVisible(class(xlsxXml).CurCodePageToUtf8(sheet), col, visible);
End; End;
///获取列可见性 ///获取列可见性
@ -582,7 +582,7 @@ Type TSExcelFile = Class
Begin Begin
[err, col] := ColumnNameToNumber(col); [err, col] := ColumnNameToNumber(col);
if err then return array(-1, col); if err then return array(-1, col);
return workbook_.GetColVisble(sheet, col); return workbook_.GetColVisble(class(xlsxXml).CurCodePageToUtf8(sheet), col);
End; End;
///设置工作表页边距 ///设置工作表页边距
@ -610,7 +610,7 @@ Type TSExcelFile = Class
///vcell: string右下角坐标 ///vcell: string右下角坐标
Function MergeCell(sheet, hcell, vcell); Function MergeCell(sheet, hcell, vcell);
Begin Begin
return workbook_.MergeCell(sheet, hcell, vcell); return workbook_.MergeCell(class(xlsxXml).CurCodePageToUtf8(sheet), hcell, vcell);
End; End;
///取消合并单元格 ///取消合并单元格
@ -619,7 +619,7 @@ Type TSExcelFile = Class
///vcell: string右下角坐标 ///vcell: string右下角坐标
Function UnMergeCell(sheet, hcell, vcell); Function UnMergeCell(sheet, hcell, vcell);
Begin Begin
return workbook_.UnMergeCell(sheet, hcell, vcell); return workbook_.UnMergeCell(class(xlsxXml).CurCodePageToUtf8(sheet), hcell, vcell);
End; End;
///设置工作表视图属性 ///设置工作表视图属性
@ -649,7 +649,7 @@ Type TSExcelFile = Class
Function SetPageLayout(sheet, pageLayout); Function SetPageLayout(sheet, pageLayout);
Begin Begin
o := getOj(sheet, 'xlsxPageLayout'); o := getOj(sheet, 'xlsxPageLayout');
if ifObj(o) then return o.SetPageLayout(sheet, pageLayout); if ifObj(o) then return o.SetPageLayout(class(xlsxXml).CurCodePageToUtf8(sheet), pageLayout);
End; End;
///获取工作表页面设置 ///获取工作表页面设置
@ -665,14 +665,15 @@ Type TSExcelFile = Class
///sheet: string工作表名称 ///sheet: string工作表名称
Function SetDefaultSheet(sheet); Function SetDefaultSheet(sheet);
Begin Begin
return workbook_.SetDefaultSheet(sheet); return workbook_.SetDefaultSheet(class(xlsxXml).CurCodePageToUtf8(sheet));
End; End;
///获取默认工作表 ///获取默认工作表
///返回: string工作表名称 ///返回: string工作表名称
Function GetDefaultSheet(); Function GetDefaultSheet();
Begin Begin
return workbook_.GetDefaultSheet(); sheet := workbook_.GetDefaultSheet();
return class(xlsxXml).Utf8ToCurCodePage(sheet);
End; End;
///设置超链接 ///设置超链接
@ -744,7 +745,7 @@ Type TSExcelFile = Class
///row: int行号 ///row: int行号
Function InsertPageBreak(sheet, row); Function InsertPageBreak(sheet, row);
Begin Begin
return workbook_.InsertPageBreak(sheet, row); return workbook_.InsertPageBreak(class(xlsxXml).CurCodePageToUtf8(sheet), row);
End; End;
///删除指定行分页符 ///删除指定行分页符
@ -752,7 +753,7 @@ Type TSExcelFile = Class
///row: int行号 ///row: int行号
Function RemovePageBreak(sheet, row); Function RemovePageBreak(sheet, row);
Begin Begin
return workbook_.RemovePageBreak(sheet, row); return workbook_.RemovePageBreak(class(xlsxXml).CurCodePageToUtf8(sheet), row);
End; End;
///添加形状 ///添加形状
@ -810,8 +811,9 @@ Type TSExcelFile = Class
End; End;
private private
Function getOj(sheetname, objname); Function getOj(sheet, objname);
Begin Begin
sheetname := class(xlsxXml).CurCodePageToUtf8(sheet);
if not ifarray(objMgr_) then objMgr_:= array(); if not ifarray(objMgr_) then objMgr_:= array();
k := sheetname + '.' + objname; k := sheetname + '.' + objname;
o := objMgr_[ k ]; o := objMgr_[ k ];

View File

@ -103,7 +103,7 @@ Type TSChart = Class
Function Apply(xmlObj); Function Apply(xmlObj);
Begin Begin
chartData_.Serialize(IsWord()); //初始化图表数据 chartData_.Serialize(IsWord()); //初始化图表数据
task := array(('c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t', 'pcdata', chartData_.Title), task := array(('c:chartSpace/c:chart/c:title/c:tx/c:rich/a:p/a:r/a:t', 'pcdata', class(xlsxXml).CurCodePageToUtf8(chartData_.Title)),
('c:chartSpace/c:chart/c:plotVisOnly', 'val', chartData_.plotVisOnly), ('c:chartSpace/c:chart/c:plotVisOnly', 'val', chartData_.plotVisOnly),
('c:chartSpace/c:chart/c:dispBlanksAs', 'val', chartData_.ShowBlanksAs), ('c:chartSpace/c:chart/c:dispBlanksAs', 'val', chartData_.ShowBlanksAs),
('c:chartSpace/c:chart/c:legend', 'Del', ifnil(chartData_.Legend)), ('c:chartSpace/c:chart/c:legend', 'Del', ifnil(chartData_.Legend)),

View File

@ -304,6 +304,42 @@ Type xlsxXml = Class
End; End;
End; End;
class Function CodePage(zw);
Begin
cp := 'utf8';//默认环境为UTF8格式
str := StrToBase64(zw);
case str of
'1tDOxA==':
cp := 'gbk';
'5Lit5paH':
cp := 'utf8';
'pKSk5Q==':
cp := 'big5';
End;
sysparams['CodePage'] := cp;
End;
class Function IsUtf8();
Begin
if ifnil(sysparams['CodePage']) or sysparams['CodePage'] = 'utf8' then
return true;
return false;
End;
class Function Utf8ToCurCodePage(str);
Begin
if ifstring(str) and not class(xlsxXml).IsUtf8() then
return UTF8ToAnsi(str);
return str;
End;
class Function CurCodePageToUtf8(str);
Begin
if ifstring(str) and not class(xlsxXml).IsUtf8() then
return AnsiToUTF8(str);
return str;
End;
//字体属性 //字体属性
class Function ReadRprFormat(node); class Function ReadRprFormat(node);
Begin Begin

View File

@ -38,7 +38,7 @@ Type TDocxChart = Class(TSChart)
</a:graphic> </a:graphic>
</wp:inline> </wp:inline>
</w:drawing> </w:drawing>
</w:r>', integer(chartData_.Width * ETU), integer(chartData_.Height * ETU), chartId_, chartData_.Name, rId_); </w:r>', integer(chartData_.Width * ETU), integer(chartData_.Height * ETU), chartId_, class(xlsxXml).CurCodePageToUtf8(chartData_.Name), rId_);
End; End;
Function IsWord();override; Function IsWord();override;

View File

@ -34,3 +34,10 @@ Apply()函数可以修改属性值,例如:
newParagraph.Apply(); newParagraph.Apply();
★docx.StyleObject()TDocxStyles对象可以用户自己插入段落样式innerXml串或自定义TDocxStyle对象 ★docx.StyleObject()TDocxStyles对象可以用户自己插入段落样式innerXml串或自定义TDocxStyle对象
*如何设置字符集(中文支持)?
★用户的脚本可能是UFT8格式或可能是GBK码格式系统提供API自动设置当前字符集环境
class(xlsxXml).CodePage('中文'); //系统检测当前的环境字符集
...
p.Run.SetText('系统可以自动识别这里的中文字符集utf8或gbk');
★不设置默认当前字符集为UTF8

View File

@ -75,16 +75,16 @@ private
col_index := 1; col_index := 1;
if not includeHeader then if not includeHeader then
begin begin
excel_.InsertRow(sheetName_, row); excel_.WorkBook().InsertRow(sheetName_, row);
end end
for i:=begCol to endCol do for i:=begCol to endCol do
begin begin
[err, cell] := excel_.CoordinatesToCellName(i, row, false); [err, cell] := excel_.CoordinatesToCellName(i, row, false);
if includeHeader then if includeHeader then
name := excel_.GetCellValue(sheetName_, cell)[1]; name := excel_.WorkBook().GetCellValue(sheetName_, cell)[1];
else begin else begin
name := "列" $ col_index++; name := "列" $ col_index++;
excel_.SetCellValue(sheetName_, cell, name); excel_.WorkBook().SetCellValue(sheetName_, cell, name);
end end
table_str += fmt('<tableColumn id="{}" name="{}" />', id++, name); table_str += fmt('<tableColumn id="{}" name="{}" />', id++, name);
end end

View File

@ -57,19 +57,81 @@ Type xlsxWorkBook = Class
End; End;
///获取工作表列表 ///获取工作表列表
///返回: arry()
Function GetSheets(); Function GetSheets();
Begin Begin
return sselect ['name'] from sheetNames_ end; return sselect ['name'] from sheetNames_ end;
End; End;
Function GetSheetName(index);
Begin
name := GetSheets()[index];
return ifString(name) ? name : '';
End;
Function TotalCols(sheet);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.TotalCols();
End;
Function TotalRows(sheet);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.TotalRows();
End;
Function GetCellValue(sheet, axis);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.GetCellValue(axis);
return class(ErrorMessage).Fail();
End;
Function SetCellValue(sheet, axis, val, opt);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.SetCellValue(axis, val, opt);
End;
Function GetCellRichText(sheet, axis);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.GetCellValue(axis, 'RichText');
return class(ErrorMessage).Fail();
End;
Function ClearCell(sheet, topLeft, bottomRight);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then o.ClearCell(topLeft, bottomRight);
End;
Function SetCellFormula(sheet, axis, formula);
Begin
o := GetSheetObj(sheet);
if not o.CellIsExists(axis) then SetCellValue(sheet, axis, '');
if ifObj(o) then o.SetCellFormula(axis, formula);
End;
Function GetCellFormula(sheet, axis);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.GetCellFormula(axis);
return class(ErrorMessage).Fail();
End;
Function GetTable(sheet, topLeft, bottomRight);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.Import(topLeft, bottomRight);
End;
///创建新sheet ///创建新sheet
///sheet: string工作表名称 ///sheet: string工作表名称
///返回: [err, info]
Function NewSheet(sheet); Function NewSheet(sheet);
Begin Begin
lname := LowerCase(sheet); lname := LowerCase(sheet);
if ifint(sheetIndexMap_[ lname ]) then return class(ErrorMessage).SheetExist('The sheet'); if ifint(sheetIndexMap_[ lname ]) then return 'The sheet already exists.';
rid := getWorkbookRelsRid(); rid := getWorkbookRelsRid();
//添加文件xl/worksheets/sheetN.xml //添加文件xl/worksheets/sheetN.xml
@ -89,9 +151,9 @@ Type xlsxWorkBook = Class
//设置 xl/workbook.xml //设置 xl/workbook.xml
workbook := GetXmlFileObj('xl/workbook.xml'); workbook := GetXmlFileObj('xl/workbook.xml');
node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').InsertEndChild('element','sheet'); node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').InsertEndChild('element','sheet');
node.SetAttribute('r:id', rid);
node.SetAttribute('sheetId', sheetId);
node.SetAttribute('name', sheet); node.SetAttribute('name', sheet);
node.SetAttribute('sheetId', sheetId);
node.SetAttribute('r:id', rid);
//workbook.Print(); //workbook.Print();
//设置docProps/app.xml //设置docProps/app.xml
@ -126,7 +188,6 @@ Type xlsxWorkBook = Class
sheetIndexMap_[ LowerCase(sheet) ] := sheetsCount_; sheetIndexMap_[ LowerCase(sheet) ] := sheetsCount_;
sheetsCount_ ++; sheetsCount_ ++;
SetDefaultSheet(sheet); SetDefaultSheet(sheet);
return class(ErrorMessage).Ok();
End; End;
///删除sheet ///删除sheet
@ -134,9 +195,9 @@ Type xlsxWorkBook = Class
///返回: [err, info] ///返回: [err, info]
Function DeleteSheet(sheet); Function DeleteSheet(sheet);
Begin Begin
if sheetsCount_ <= 1 then return class(ErrorMessage).DeleteFailure(); if sheetsCount_ <= 1 then return 'Cant not delete the last sheet.';
ind := sheetIndexMap_[ LowerCase(sheet) ]; ind := sheetIndexMap_[ LowerCase(sheet) ];
if not ifint(ind) then return class(ErrorMessage).Ok(); if not ifint(ind) then return ;
del := sheetNames_[ind]; del := sheetNames_[ind];
defaultSheet := GetDefaultSheet(); defaultSheet := GetDefaultSheet();
@ -233,27 +294,29 @@ Type xlsxWorkBook = Class
xmlFileObjMap_ := array(); xmlFileObjMap_ := array();
//设置默认工作表 //设置默认工作表
ind := sheetIndexMap_[sheet]; sheet_name := LowerCase(sheet);
ind := sheetIndexMap_[sheet_name];
for k, v in sheetIndexMap_ do for k, v in sheetIndexMap_ do
Begin Begin
if v > ind then sheetIndexMap_[k] := v - 1; if v > ind then sheetIndexMap_[k] := v - 1;
End End
reindex(sheetIndexMap_, array(sheet: nil)); reindex(sheetIndexMap_, array(sheet_name: nil));
ind--; ind--;
if ind < 0 then SetDefaultSheet(sheetNames_[0]['name']); if ind < 0 then SetDefaultSheet(sheetNames_[0]['name']);
else if ind = length(sheetIndexMap_) then SetDefaultSheet(sheetNames_[length(sheetIndexMap_)]['name']); else if ind = length(sheetIndexMap_) then SetDefaultSheet(sheetNames_[length(sheetIndexMap_)]['name']);
else SetDefaultSheet(sheetNames_[ind]['name']); else SetDefaultSheet(sheetNames_[ind]['name']);
return class(ErrorMessage).Ok(); xmlFileObjMap_ := array();
End; End;
Function SetSheetName(sourceName, destName); Function SetSheetName(sourceName, destName);
Begin Begin
ind := sheetIndexMap_[ LowerCase(destName) ]; ind := sheetIndexMap_[ LowerCase(destName) ];
if ifint(ind) then return class(ErrorMessage).SheetExist(destName); if ifint(ind) then return destName $ ' already exists.';
ind := sheetIndexMap_[ LowerCase(sourceName) ]; ind := sheetIndexMap_[ LowerCase(sourceName) ];
if not ifint(ind) then return class(ErrorMessage).SheetNotExist(sourceName); if not ifint(ind) then return sourceName $ ' does not exists.';
//设置 xl/workbook.xml //设置 xl/workbook.xml
workbook := GetXmlFileObj('xl/workbook.xml'); workbook := GetXmlFileObj('xl/workbook.xml');
@ -282,7 +345,6 @@ Type xlsxWorkBook = Class
sheetNames_[ind]['name'] := destName; sheetNames_[ind]['name'] := destName;
reindex(sheetIndexMap_, array(LowerCase(sourceName) : LowerCase(destName))); reindex(sheetIndexMap_, array(LowerCase(sourceName) : LowerCase(destName)));
sheetObjMap_ := array(); sheetObjMap_ := array();
return class(ErrorMessage).Ok();
End; End;
Function InsertCol(sheet, col); Function InsertCol(sheet, col);
@ -309,9 +371,6 @@ Type xlsxWorkBook = Class
if ifObj(sObj) then sObj.RemoveRow(row); if ifObj(sObj) then sObj.RemoveRow(row);
End; End;
///获取图表列表
///sheet: string工作表名称
///返回: [err, ChartList]
Function GetCharts(sheet); Function GetCharts(sheet);
Begin Begin
ind := sheetIndexMap_[ LowerCase(sheet) ]; ind := sheetIndexMap_[ LowerCase(sheet) ];
@ -370,6 +429,14 @@ Type xlsxWorkBook = Class
workbook := GetXmlFileObj('xl/workbook.xml'); workbook := GetXmlFileObj('xl/workbook.xml');
node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet'); node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet');
hidden := visible = 1 ? 0 : 1; hidden := visible = 1 ? 0 : 1;
default_sheet_name := GetDefaultSheet();
if default_sheet_name = sheet then
begin
ind := sheetIndexMap_[LowerCase(default_sheet_name)];
if ind = 0 then default_name := sheetNames_[ind + 1]['name'];
else default_name := sheetNames_[ind - 1]['name'];
SetDefaultSheet(default_name);
end
while ifObj(node) do while ifObj(node) do
Begin Begin
name := node.GetAttribute('name'); name := node.GetAttribute('name');
@ -407,6 +474,12 @@ Type xlsxWorkBook = Class
Begin Begin
hidden := visible = 1 ? 0 : 1; hidden := visible = 1 ? 0 : 1;
sheet_obj := GetSheetObj(sheet); sheet_obj := GetSheetObj(sheet);
is_exists := sheet_obj.RowIsExists(row);
if not is_exists then
begin
[err, cell] := xlsx_call("CoordinatesToCellName", 1, row);
sheet_obj.SetCellValue(cell, '');
end
sheet_obj.SetAttribute(row, array("hidden": hidden)); sheet_obj.SetAttribute(row, array("hidden": hidden));
End End
@ -421,7 +494,7 @@ Type xlsxWorkBook = Class
if not err then if not err then
return array(0, hidden = '1' ? 0 : 1); return array(0, hidden = '1' ? 0 : 1);
end end
return array(0, 0); return array(0, 1);
End End
Function SetColVisible(sheet, col, visible) Function SetColVisible(sheet, col, visible)
@ -577,6 +650,12 @@ Type xlsxWorkBook = Class
return default_width; return default_width;
End; End;
Function SetCellStyle(sheet, topLeft, bottomRight, styleid);
Begin
o := GetSheetObj(sheet);
if ifObj(o) then return o.SetCellStyle(topLeft, bottomRight, styleid);
End;
Function GetCellStyle(sheet, axis); Function GetCellStyle(sheet, axis);
Begin Begin
sheet_obj := GetSheetObj(sheet); sheet_obj := GetSheetObj(sheet);

18
更新日志.md Normal file
View File

@ -0,0 +1,18 @@
# 2022-12-30
## V1.0.4
### word
1. 初步支持中文
### excel
1. 初步支持中文
2. `SetSheetName``NewSheet` 返回值不再是`[err, errinfo]`
3. 修复清除单元格`ClearCell`不正确问题
4. 修复`SetCellFormula``GetCellFormula`问题
5. 修复`SetRowVisible``GetRowVisible``SetSheetVisible`问题
如何设置字符集(中文支持)?
★用户的脚本可能是UFT8格式或可能是GBK码格式系统提供API自动设置当前字符集环境`class(xlsxXml).CodePage('中文');` 在文件头设置该代码后,系统会自动检测当前的环境字符集