v1.4.6
This commit is contained in:
parent
8aa050461c
commit
addc41144e
|
|
@ -1,28 +1,28 @@
|
||||||
path := ExtractFileDir(ExtractFileDir(PluginPath()));
|
path := ExtractFileDir(ExtractFileDir(PluginPath()));
|
||||||
{$IFNDEF Win32}
|
{$IFNDEF Win32}
|
||||||
path := path + '\\funcext\\TSOffice\\TSExcelFile.tsf';
|
path := path + '\\funcext\\TSOffice\\TSXlsxFile.tsf';
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
path := path + '/funcext/TSOffice/TSExcelFile.tsf';
|
path := path + '/funcext/TSOffice/TSXlsxFile.tsf';
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
funcs := LoadClassInfo(path);
|
funcs := LoadClassInfo(path);
|
||||||
|
|
||||||
testing := 1;
|
testing := 1;
|
||||||
file := new TSExcelFile();
|
file := new TSXlsxFile();
|
||||||
[err, errinfo] := file.NewFile();
|
[err, errinfo] := file.NewFile();
|
||||||
if err then
|
if err then
|
||||||
return PrintError("NewFile", err, errinfo);
|
return PrintError("NewFile", err, errinfo);
|
||||||
PrintSuccess("NewFile", testing++);
|
PrintSuccess("NewFile", testing++);
|
||||||
|
|
||||||
file.SetSheetName('Sheet1', 'ExcelFile');
|
file.SetSheetName('Sheet1', 'XlsxFile');
|
||||||
PrintSuccess("SetSheetName", testing++);
|
PrintSuccess("SetSheetName", testing++);
|
||||||
|
|
||||||
file.NewSheet("Functions");
|
file.NewSheet("Functions");
|
||||||
PrintSuccess("NewSheet", testing++);
|
PrintSuccess("NewSheet", testing++);
|
||||||
|
|
||||||
file.SetDefaultSheet('ExcelFile');
|
file.SetDefaultSheet('TSXlsxFile');
|
||||||
|
|
||||||
richtext := TOfficeObj('TRichText');
|
richtext := TOfficeObj('TRichText');
|
||||||
txt1 := richtext.AddText('TSExcelFile类 ');
|
txt1 := richtext.AddText('TSXlsxFile类 ');
|
||||||
txt1.Font.Size := 35;
|
txt1.Font.Size := 35;
|
||||||
txt1.Font.Color := "FF0000";
|
txt1.Font.Color := "FF0000";
|
||||||
txt1.Font.Bold := 1;
|
txt1.Font.Bold := 1;
|
||||||
|
|
@ -34,14 +34,14 @@ txt2.Font.Bold := 1;
|
||||||
txt2.Font.Italic := 1;
|
txt2.Font.Italic := 1;
|
||||||
txt2.Font.Color := "FFC0CB";
|
txt2.Font.Color := "FFC0CB";
|
||||||
|
|
||||||
file.SetCellRichText('ExcelFile', 'A1', richtext);
|
file.SetCellRichText('XlsxFile', 'A1', richtext);
|
||||||
PrintSuccess("SetCellRichText", testing++);
|
PrintSuccess("SetCellRichText", testing++);
|
||||||
[err, richText] := file.GetCellRichText('ExcelFile', 'A1');
|
[err, richText] := file.GetCellRichText('XlsxFile', 'A1');
|
||||||
if err then
|
if err then
|
||||||
return PrintError("GetCellRichText", err, errinfo);
|
return PrintError("GetCellRichText", err, errinfo);
|
||||||
PrintSuccess("GetCellRichText", testing++);
|
PrintSuccess("GetCellRichText", testing++);
|
||||||
|
|
||||||
file.MergeCell('ExcelFile', 'A1', 'C1');
|
file.MergeCell('XlsxFile', 'A1', 'C1');
|
||||||
PrintSuccess("MergeCell", testing++);
|
PrintSuccess("MergeCell", testing++);
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -65,15 +65,15 @@ style.Fill.Gradient.Stop2.Color := "E0EBF5";
|
||||||
styleId := file.NewStyle(style);
|
styleId := file.NewStyle(style);
|
||||||
PrintSuccess("NewStyle", testing++);
|
PrintSuccess("NewStyle", testing++);
|
||||||
|
|
||||||
file.SetCellStyle("ExcelFile", 'A1', 'C1', styleId);
|
file.SetCellStyle("XlsxFile", 'A1', 'C1', styleId);
|
||||||
|
|
||||||
file.SetCellValue("ExcelFile", "A3", "索引");
|
file.SetCellValue("XlsxFile", "A3", "索引");
|
||||||
file.SetCellValue("ExcelFile", "B3", "函数名称");
|
file.SetCellValue("XlsxFile", "B3", "函数名称");
|
||||||
file.SetCellValue("ExcelFile", "C3", "功能");
|
file.SetCellValue("XlsxFile", "C3", "功能");
|
||||||
file.SetColWidth("ExcelFile", "A", "A", 6);
|
file.SetColWidth("XlsxFile", "A", "A", 6);
|
||||||
file.SetColWidth("ExcelFile", "B", "B", 55);
|
file.SetColWidth("XlsxFile", "B", "B", 55);
|
||||||
file.SetColWidth("ExcelFile", "C", "C", 100);
|
file.SetColWidth("XlsxFile", "C", "C", 100);
|
||||||
file.SetCellStyle("ExcelFile", "A3", "C3", styleId);
|
file.SetCellStyle("XlsxFile", "A3", "C3", styleId);
|
||||||
|
|
||||||
|
|
||||||
style2 := TOfficeObj("TStyle");
|
style2 := TOfficeObj("TStyle");
|
||||||
|
|
@ -108,9 +108,9 @@ Begin
|
||||||
[err0, cell0] := file.CoordinatesToCellName(1, i+4);
|
[err0, cell0] := file.CoordinatesToCellName(1, i+4);
|
||||||
[err1, cell1] := file.CoordinatesToCellName(2, i+4);
|
[err1, cell1] := file.CoordinatesToCellName(2, i+4);
|
||||||
[err2, cell2] := file.CoordinatesToCellName(3, i+4);
|
[err2, cell2] := file.CoordinatesToCellName(3, i+4);
|
||||||
file.SetCellValue("ExcelFile", cell0, i+1);
|
file.SetCellValue("XlsxFile", cell0, i+1);
|
||||||
file.SetCellValue("ExcelFile", cell1, funcs[i]['funcname']);
|
file.SetCellValue("XlsxFile", cell1, funcs[i]['funcname']);
|
||||||
file.SetCellValue("ExcelFile", cell2, funcs[i]['name']);
|
file.SetCellValue("XlsxFile", cell2, funcs[i]['name']);
|
||||||
|
|
||||||
str := funcs[i]['name'] + "\nFunction " + funcs[i]['funcname'] + funcs[i]['comment'];
|
str := funcs[i]['name'] + "\nFunction " + funcs[i]['funcname'] + funcs[i]['comment'];
|
||||||
arr := str2array(str, "\n");
|
arr := str2array(str, "\n");
|
||||||
|
|
@ -130,15 +130,15 @@ Begin
|
||||||
hyperlink.LinkType := "location";
|
hyperlink.LinkType := "location";
|
||||||
hyperlink.LinkUrl := "Functions!" $ c1;
|
hyperlink.LinkUrl := "Functions!" $ c1;
|
||||||
|
|
||||||
file.SetCellHyperLink("ExcelFile", cell1, hyperlink);
|
file.SetCellHyperLink("XlsxFile", cell1, hyperlink);
|
||||||
file.SetCellStyle("ExcelFile", cell1, cell1, styleId4);
|
file.SetCellStyle("XlsxFile", cell1, cell1, styleId4);
|
||||||
|
|
||||||
End
|
End
|
||||||
|
|
||||||
file.SetColWidth('Functions', 'A', 'A', 120);
|
file.SetColWidth('Functions', 'A', 'A', 120);
|
||||||
PrintSuccess('SetColWidth', testing++);
|
PrintSuccess('SetColWidth', testing++);
|
||||||
|
|
||||||
saveName := utf8toansi("ExcelFile使用帮助.xlsx");
|
saveName := utf8toansi("XlsxFile使用帮助.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);
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
|
@ -1,4 +1,4 @@
|
||||||
// Version 1.4.5
|
// Version 1.4.6
|
||||||
|
|
||||||
Type TSDocxFile = Class
|
Type TSDocxFile = Class
|
||||||
///Version: V1.0 2022-09-20
|
///Version: V1.0 2022-09-20
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Version 1.4.5
|
// Version 1.4.6
|
||||||
|
|
||||||
Type TSExcelFile = Class
|
Type TSExcelFile = Class
|
||||||
///Version: V1.0 2022-08-08
|
///Version: V1.0 2022-08-08
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -142,7 +142,7 @@ Type TTableContent = class
|
||||||
Begin
|
Begin
|
||||||
///获取标题列表 array((("Level":level,"Paragraph":"object","Text":title,"numId":,"ilvl":,"numArr":));
|
///获取标题列表 array((("Level":level,"Paragraph":"object","Text":title,"numId":,"ilvl":,"numArr":));
|
||||||
numMap := array();
|
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
|
for i:=0 to length(r)-1 do Begin
|
||||||
p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, r[i]['Level'], i = 0 ? true: false);
|
p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, r[i]['Level'], i = 0 ? true: false);
|
||||||
//fldCharType
|
//fldCharType
|
||||||
|
|
|
||||||
|
|
@ -166,64 +166,71 @@ Type xlsxWorkBook = Class
|
||||||
Begin
|
Begin
|
||||||
lname := LowerCase(sheet);
|
lname := LowerCase(sheet);
|
||||||
if ifint(sheetIndexMap_[ lname ]) then return 'The sheet already exists.';
|
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
|
//添加文件xl/worksheets/sheetN.xml
|
||||||
sheetId := vselect maxof(['sheetId']) from sheetNames_ end;
|
sheetId := vselect maxof(['sheetId']) from sheetNames_ end;
|
||||||
sheetId := integer(sheetId) + 1;
|
sheetId := integer(sheetId) + 1;
|
||||||
fname := sheetPrefix_ $ inttostr(sheetsCount_ + 1) $ '.xml';
|
|
||||||
zipfile_.Add(fname, class(TSXml).XmlHeader() + class(TSXml).GetTemplate('sheet1'));
|
zipfile_.Add(fname, class(TSXml).XmlHeader() + class(TSXml).GetTemplate('sheet1'));
|
||||||
|
return sheetId;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function setWorkbookRels();
|
||||||
|
Begin
|
||||||
|
rid := getWorkbookRelsRid();
|
||||||
//设置 workbook.xml.rels
|
//设置 workbook.xml.rels
|
||||||
workbook_rels := GetXmlFileObj('xl/_rels/workbook.xml.rels');
|
workbook_rels := GetXmlFileObj('xl/_rels/workbook.xml.rels');
|
||||||
rels := workbook_rels.FirstChildElement('Relationships').InsertEndChild('element', 'Relationship');
|
rels := workbook_rels.FirstChildElement('Relationships').InsertEndChild('element', 'Relationship');
|
||||||
rels.SetAttribute('Target', getTarget( sheetsCount_ + 1));
|
rels.SetAttribute('Target', getTarget( sheetsCount_ + 1));
|
||||||
rels.SetAttribute('Type', class(TSXml).GetTemplate('RelationshipWorkSheet'));
|
rels.SetAttribute('Type', class(TSXml).GetTemplate('RelationshipWorkSheet'));
|
||||||
rels.SetAttribute('Id', rid);
|
rels.SetAttribute('Id', rid);
|
||||||
//workbook_rels.Print;
|
return rid;
|
||||||
|
End;
|
||||||
|
|
||||||
|
Function setWorkbookSheet(sheetName, sheetId, rid);
|
||||||
|
Begin
|
||||||
//设置 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('name', sheet);
|
node.SetAttribute('name', sheetName);
|
||||||
node.SetAttribute('sheetId', sheetId);
|
node.SetAttribute('sheetId', sheetId);
|
||||||
node.SetAttribute('r:id', rid);
|
node.SetAttribute('r:id', rid);
|
||||||
//workbook.Print();
|
End;
|
||||||
|
|
||||||
|
Function setDocPropsApp(sheet);
|
||||||
|
Begin
|
||||||
//设置docProps/app.xml
|
//设置docProps/app.xml
|
||||||
app := GetXmlFileObj(class(TSXml).GetFileName('docProps_app'));
|
app := GetXmlFileObj(class(TSXml).GetFileName('docProps_app'));
|
||||||
//app.Print();
|
vector := class(TSXml).GetNode(app, 'Properties/TitlesOfParts/vt:vector');
|
||||||
node := app.FirstChildElement('Properties').FirstChildElement('TitlesOfParts');
|
vector.SetAttribute('size', length(sheetNames_) + 1);
|
||||||
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.InsertEndChild('element', 'vt:lpstr', sheet);
|
vector.InsertEndChild('element', 'vt:lpstr', sheet);
|
||||||
//app.Print();
|
End;
|
||||||
|
|
||||||
|
Function setContentTypes(fname);
|
||||||
|
Begin
|
||||||
//设置[Content_Types].xml
|
//设置[Content_Types].xml
|
||||||
content_xml := GetXmlFileObj(class(TSXml).GetFileName('Content_Types'));
|
content_xml := GetXmlFileObj(class(TSXml).GetFileName('Content_Types'));
|
||||||
class(TSXml).AddOverrideContentType(content_xml, '/' + fname, class(TSXml).GetTemplate('sheetContentType'));
|
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;
|
End;
|
||||||
|
|
||||||
|
|
||||||
Function NewSheet(sourceSheet, destSheet);overload;
|
Function NewSheet(sourceSheet, destSheet);overload;
|
||||||
Begin
|
Begin
|
||||||
lname := LowerCase(destSheet);
|
lname := LowerCase(destSheet);
|
||||||
|
|
@ -726,23 +733,25 @@ Type xlsxWorkBook = Class
|
||||||
Function SetSheetVisible(sheet, visible);
|
Function SetSheetVisible(sheet, visible);
|
||||||
Begin
|
Begin
|
||||||
workbook := GetXmlFileObj('xl/workbook.xml');
|
workbook := GetXmlFileObj('xl/workbook.xml');
|
||||||
node := workbook.FirstChildElement('workbook').FirstChildElement('sheets').FirstChildElement('sheet');
|
node := class(TSXml).GetNode(workbook, 'workbook/sheets/sheet');
|
||||||
hidden := visible = 1 ? 0 : 1;
|
if GetSheetsCount() = 1 then return "Only one sheet, can't set visible.";
|
||||||
default_sheet_name := GetDefaultSheet();
|
sheet := lowercase(sheet);
|
||||||
if default_sheet_name = sheet then
|
default_sheet_name := lowercase(GetDefaultSheet());
|
||||||
|
if default_sheet_name = sheet and not visible then
|
||||||
begin
|
begin
|
||||||
ind := sheetIndexMap_[LowerCase(default_sheet_name)];
|
ind := sheetIndexMap_[LowerCase(default_sheet_name)];
|
||||||
if ind = 0 then default_name := sheetNames_[ind + 1]['name'];
|
default_name := ind = 0 ? sheetNames_[1]['name'] : sheetNames_[ind - 1]['name'];
|
||||||
else default_name := sheetNames_[ind - 1]['name'];
|
|
||||||
SetDefaultSheet(default_name);
|
SetDefaultSheet(default_name);
|
||||||
end
|
end
|
||||||
|
if visible then SetDefaultSheet(sheet);
|
||||||
|
state := visible ? "nohidden" : "hidden";
|
||||||
while ifObj(node) do
|
while ifObj(node) do
|
||||||
Begin
|
Begin
|
||||||
name := node.GetAttribute('name');
|
name := lowercase(node.GetAttribute('name'));
|
||||||
if name = sheet then
|
if name = sheet then
|
||||||
Begin
|
Begin
|
||||||
if hidden then node.SetAttribute('state', 'hidden');
|
node.SetAttribute('state', state);
|
||||||
else node.DeleteAttribute('state');
|
break;
|
||||||
End
|
End
|
||||||
node := node.NextElement();
|
node := node.NextElement();
|
||||||
End
|
End
|
||||||
|
|
@ -753,11 +762,12 @@ Type xlsxWorkBook = Class
|
||||||
Begin
|
Begin
|
||||||
sheet_file := GetSheetXmlFile(sheet);
|
sheet_file := GetSheetXmlFile(sheet);
|
||||||
if not ifObj(sheet_file) then return 0;
|
if not ifObj(sheet_file) then return 0;
|
||||||
|
sheet := lowercase(sheet);
|
||||||
workbook := GetXmlFileObj('xl/workbook.xml');
|
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
|
while ifObj(node) do
|
||||||
Begin
|
Begin
|
||||||
name := node.GetAttribute('name');
|
name := lowercase(node.GetAttribute('name'));
|
||||||
if name = sheet then
|
if name = sheet then
|
||||||
Begin
|
Begin
|
||||||
val := node.GetAttribute('state');
|
val := node.GetAttribute('state');
|
||||||
|
|
@ -1104,23 +1114,11 @@ Type xlsxWorkBook = Class
|
||||||
node := sheet_node.InsertFirstChild('element', 'sheetView');
|
node := sheet_node.InsertFirstChild('element', 'sheetView');
|
||||||
node.SetAttribute('workbookViewId', 0);
|
node.SetAttribute('workbookViewId', 0);
|
||||||
end
|
end
|
||||||
if name = sheet then
|
if lowercase(name) = lowercase(sheet) then
|
||||||
Begin
|
Begin
|
||||||
node.SetAttribute('tabSelected', 1);
|
node.SetAttribute('tabSelected', 1);
|
||||||
workbook := GetXmlFileObj('xl/workbook.xml');
|
workbook := GetXmlFileObj('xl/workbook.xml');
|
||||||
workbook_node := workbook.FirstChildElement('workbook');
|
view_node := class(TSXml).GetNode(workbook, 'workbook/bookViews/workbookView');
|
||||||
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.SetAttribute('activeTab', ind);
|
view_node.SetAttribute('activeTab', ind);
|
||||||
End
|
End
|
||||||
else
|
else
|
||||||
|
|
|
||||||
19
更新日志.md
19
更新日志.md
|
|
@ -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
|
## 2023-8-30
|
||||||
|
|
||||||
### V1.4.5
|
### V1.4.5
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue