This commit is contained in:
csh 2023-09-19 10:10:29 +08:00
parent 8aa050461c
commit addc41144e
11 changed files with 1784 additions and 678 deletions

View File

@ -1,28 +1,28 @@
path := ExtractFileDir(ExtractFileDir(PluginPath()));
{$IFNDEF Win32}
path := path + '\\funcext\\TSOffice\\TSExcelFile.tsf';
path := path + '\\funcext\\TSOffice\\TSXlsxFile.tsf';
{$ELSE}
path := path + '/funcext/TSOffice/TSExcelFile.tsf';
path := path + '/funcext/TSOffice/TSXlsxFile.tsf';
{$ENDIF}
funcs := LoadClassInfo(path);
testing := 1;
file := new TSExcelFile();
file := new TSXlsxFile();
[err, errinfo] := file.NewFile();
if err then
return PrintError("NewFile", err, errinfo);
PrintSuccess("NewFile", testing++);
file.SetSheetName('Sheet1', 'ExcelFile');
file.SetSheetName('Sheet1', 'XlsxFile');
PrintSuccess("SetSheetName", testing++);
file.NewSheet("Functions");
PrintSuccess("NewSheet", testing++);
file.SetDefaultSheet('ExcelFile');
file.SetDefaultSheet('TSXlsxFile');
richtext := TOfficeObj('TRichText');
txt1 := richtext.AddText('TSExcelFile类 ');
txt1 := richtext.AddText('TSXlsxFile类 ');
txt1.Font.Size := 35;
txt1.Font.Color := "FF0000";
txt1.Font.Bold := 1;
@ -34,14 +34,14 @@ txt2.Font.Bold := 1;
txt2.Font.Italic := 1;
txt2.Font.Color := "FFC0CB";
file.SetCellRichText('ExcelFile', 'A1', richtext);
file.SetCellRichText('XlsxFile', 'A1', richtext);
PrintSuccess("SetCellRichText", testing++);
[err, richText] := file.GetCellRichText('ExcelFile', 'A1');
[err, richText] := file.GetCellRichText('XlsxFile', 'A1');
if err then
return PrintError("GetCellRichText", err, errinfo);
PrintSuccess("GetCellRichText", testing++);
file.MergeCell('ExcelFile', 'A1', 'C1');
file.MergeCell('XlsxFile', 'A1', 'C1');
PrintSuccess("MergeCell", testing++);
@ -65,15 +65,15 @@ style.Fill.Gradient.Stop2.Color := "E0EBF5";
styleId := file.NewStyle(style);
PrintSuccess("NewStyle", testing++);
file.SetCellStyle("ExcelFile", 'A1', 'C1', styleId);
file.SetCellStyle("XlsxFile", '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);
file.SetCellValue("XlsxFile", "A3", "索引");
file.SetCellValue("XlsxFile", "B3", "函数名称");
file.SetCellValue("XlsxFile", "C3", "功能");
file.SetColWidth("XlsxFile", "A", "A", 6);
file.SetColWidth("XlsxFile", "B", "B", 55);
file.SetColWidth("XlsxFile", "C", "C", 100);
file.SetCellStyle("XlsxFile", "A3", "C3", styleId);
style2 := TOfficeObj("TStyle");
@ -108,9 +108,9 @@ 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']);
file.SetCellValue("XlsxFile", cell0, i+1);
file.SetCellValue("XlsxFile", cell1, funcs[i]['funcname']);
file.SetCellValue("XlsxFile", cell2, funcs[i]['name']);
str := funcs[i]['name'] + "\nFunction " + funcs[i]['funcname'] + funcs[i]['comment'];
arr := str2array(str, "\n");
@ -130,15 +130,15 @@ Begin
hyperlink.LinkType := "location";
hyperlink.LinkUrl := "Functions!" $ c1;
file.SetCellHyperLink("ExcelFile", cell1, hyperlink);
file.SetCellStyle("ExcelFile", cell1, cell1, styleId4);
file.SetCellHyperLink("XlsxFile", cell1, hyperlink);
file.SetCellStyle("XlsxFile", cell1, cell1, styleId4);
End
file.SetColWidth('Functions', 'A', 'A', 120);
PrintSuccess('SetColWidth', testing++);
saveName := utf8toansi("ExcelFile使用帮助.xlsx");
saveName := utf8toansi("XlsxFile使用帮助.xlsx");
[err, errinfo] := file.SaveAs('', saveName);
if err then
return PrintError("SaveAs", err, errinfo);

Binary file not shown.

Binary file not shown.

BIN
XlsxFile使用帮助.xlsx Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -1,4 +1,4 @@
// Version 1.4.5
// Version 1.4.6
Type TSExcelFile = Class
///Version: V1.0 2022-08-08

File diff suppressed because it is too large Load Diff

View File

@ -142,7 +142,7 @@ Type TTableContent = class
Begin
///获取标题列表 array((("Level":level,"Paragraph":"object","Text":title,"numId":,"ilvl":,"numArr":));
numMap := array();
r := docx_.Document().Body().GetHeadingListImpl(docx_, posOpt, UpperHeadingLevel, LowerHeadingLevel, numMap, true);
r := docx_.Document().Body().GetHeadingListImpl(docx_, -1, 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

View File

@ -166,64 +166,71 @@ Type xlsxWorkBook = Class
Begin
lname := LowerCase(sheet);
if ifint(sheetIndexMap_[ lname ]) then return 'The sheet already exists.';
rid := getWorkbookRelsRid();
fname := sheetPrefix_ $ inttostr(sheetsCount_ + 1) $ '.xml';
sheetId := addSheetN(fname);
rid := setWorkbookRels();
setWorkbookSheet(sheet, sheetId, rid);
setDocPropsApp(sheet);
setContentTypes(fname);
sheetNames_[sheetsCount_]['name'] := sheet;
sheetNames_[sheetsCount_]['sheetId'] := sheetId;
sheetNames_[sheetsCount_]['rid'] := rid;
sheetNames_[sheetsCount_]['file'] := fname;
sheetIndexMap_[ lname ] := sheetsCount_;
sheetsCount_ ++;
SetDefaultSheet(sheet);
End;
Function addSheetN(fname);
Begin
//添加文件xl/worksheets/sheetN.xml
sheetId := vselect maxof(['sheetId']) from sheetNames_ end;
sheetId := integer(sheetId) + 1;
fname := sheetPrefix_ $ inttostr(sheetsCount_ + 1) $ '.xml';
zipfile_.Add(fname, class(TSXml).XmlHeader() + class(TSXml).GetTemplate('sheet1'));
return sheetId;
End;
Function setWorkbookRels();
Begin
rid := getWorkbookRelsRid();
//设置 workbook.xml.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', class(TSXml).GetTemplate('RelationshipWorkSheet'));
rels.SetAttribute('Id', rid);
//workbook_rels.Print;
return rid;
End;
Function setWorkbookSheet(sheetName, sheetId, rid);
Begin
//设置 xl/workbook.xml
workbook := GetXmlFileObj('xl/workbook.xml');
node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').InsertEndChild('element','sheet');
node.SetAttribute('name', sheet);
node.SetAttribute('name', sheetName);
node.SetAttribute('sheetId', sheetId);
node.SetAttribute('r:id', rid);
//workbook.Print();
End;
Function setDocPropsApp(sheet);
Begin
//设置docProps/app.xml
app := GetXmlFileObj(class(TSXml).GetFileName('docProps_app'));
//app.Print();
node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts');
if not ifObj(node) then Begin
node := app.FirstChildElement('Properties').InsertEndChild('element','TitlesOfParts');
End;
vector := node.FirstChildElement('vt:vector');
if not ifObj(vector) then Begin
vector := node.InsertEndChild('element', 'vt:vector');
vector.SetAttribute('baseType', 'lpstr');
vector.SetAttribute('size', length(sheetNames_) + 1);
for i:=0 to length(sheetNames_)-1 do Begin
vector.InsertEndChild('element', 'vt:lpstr', sheetNames_[i]['name']);
End;
End
else
vector.SetAttribute('size', length(sheetNames_) + 1);
vector := class(TSXml).GetNode(app, 'Properties/TitlesOfParts/vt:vector');
vector.SetAttribute('size', length(sheetNames_) + 1);
vector.InsertEndChild('element', 'vt:lpstr', sheet);
//app.Print();
End;
Function setContentTypes(fname);
Begin
//设置[Content_Types].xml
content_xml := GetXmlFileObj(class(TSXml).GetFileName('Content_Types'));
class(TSXml).AddOverrideContentType(content_xml, '/' + fname, class(TSXml).GetTemplate('sheetContentType'));
sheetNames_[sheetsCount_]['name'] := sheet;
sheetNames_[sheetsCount_]['sheetId'] := sheetId;
sheetNames_[sheetsCount_]['rid'] := rid;
sheetNames_[sheetsCount_]['file'] := fname;
sheetIndexMap_[ LowerCase(sheet) ] := sheetsCount_;
sheetsCount_ ++;
SetDefaultSheet(sheet);
End;
Function NewSheet(sourceSheet, destSheet);overload;
Begin
lname := LowerCase(destSheet);
@ -726,23 +733,25 @@ Type xlsxWorkBook = Class
Function SetSheetVisible(sheet, visible);
Begin
workbook := GetXmlFileObj('xl/workbook.xml');
node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet');
hidden := visible = 1 ? 0 : 1;
default_sheet_name := GetDefaultSheet();
if default_sheet_name = sheet then
node := class(TSXml).GetNode(workbook, 'workbook/sheets/sheet');
if GetSheetsCount() = 1 then return "Only one sheet, can't set visible.";
sheet := lowercase(sheet);
default_sheet_name := lowercase(GetDefaultSheet());
if default_sheet_name = sheet and not visible 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'];
default_name := ind = 0 ? sheetNames_[1]['name'] : sheetNames_[ind - 1]['name'];
SetDefaultSheet(default_name);
end
if visible then SetDefaultSheet(sheet);
state := visible ? "nohidden" : "hidden";
while ifObj(node) do
Begin
name := node.GetAttribute('name');
name := lowercase(node.GetAttribute('name'));
if name = sheet then
Begin
if hidden then node.SetAttribute('state', 'hidden');
else node.DeleteAttribute('state');
node.SetAttribute('state', state);
break;
End
node := node.NextElement();
End
@ -753,11 +762,12 @@ Type xlsxWorkBook = Class
Begin
sheet_file := GetSheetXmlFile(sheet);
if not ifObj(sheet_file) then return 0;
sheet := lowercase(sheet);
workbook := GetXmlFileObj('xl/workbook.xml');
node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet');
node := class(TSXml).GetNode(workbook, 'workbook/sheets/sheet');
while ifObj(node) do
Begin
name := node.GetAttribute('name');
name := lowercase(node.GetAttribute('name'));
if name = sheet then
Begin
val := node.GetAttribute('state');
@ -1104,23 +1114,11 @@ Type xlsxWorkBook = Class
node := sheet_node.InsertFirstChild('element', 'sheetView');
node.SetAttribute('workbookViewId', 0);
end
if name = sheet then
if lowercase(name) = lowercase(sheet) then
Begin
node.SetAttribute('tabSelected', 1);
workbook := GetXmlFileObj('xl/workbook.xml');
workbook_node := workbook.FirstChildElement('workbook');
book_view_node := workbook_node.FirstChildElement('bookViews');
if not ifObj(book_view_node) then
begin
prev_node := class(TSXml).GetWorkBookPrevNode(workbook_node, 'bookViews');
if not ifObj(prev_node) then book_view_node := workbook_node.InsertFirstChild('element', 'bookViews');
else book_view_node := workbook_node.InsertAfterChild(prev_node, 'element', 'bookViews');
end;
view_node := book_view_node.FirstChildElement('workbookView');
if not ifObj(view_node) then
begin
view_node := book_view_node.InsertFirstChild('element', 'workbookView');
end
view_node := class(TSXml).GetNode(workbook, 'workbook/bookViews/workbookView');
view_node.SetAttribute('activeTab', ind);
End
else

View File

@ -1,5 +1,24 @@
# 更新日志
## 2023-9-19
### V1.4.6
#### word
1. 修复表格存在合并单元格,生成目录报错问题
2. 修复单元格添加run对象设置样式不生效问题
### excel
🔔 重要升级:`TSExcelFile`更名为`TSXlsxFile`,建议更改,旧名字现阶段仍可使用
1. 整理`NewSheet`和`SetSheetVisible`代码
#### excel
1. 修复`NewSheet`excel打开遇到提示错误问题
## 2023-8-30
### V1.4.5