Compare commits

..
1 Commits
Author SHA1 Message Date
csh 4a2961a635 Merge branch 'word' 2023-12-07 13:41:38 +08:00
35 changed files with 13160 additions and 14151 deletions
-4
View File
@@ -1,4 +0,0 @@
*.swp
*.swo
*.cmd
script.ps1
-3
View File
@@ -1,3 +0,0 @@
[submodule "funcext/TSOffice/Extensions/OfficeVba"]
path = funcext/TSOffice/Extensions/OfficeVba
url = https://git.mytsl.cn/tinysoft/OfficeVba.git
+1 -1
View File
@@ -73,7 +73,7 @@ content := docx.AddTableContent(paragraphTitle, 1, 3);
docx.AddPageBreak(content.node_); docx.AddPageBreak(content.node_);
v := docx.SaveAs('', 'DocxFile使用帮助.docx'); v := docx.SaveAs('', TOfficeApi().CurCodePageToGBK('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);
+3 -5
View File
@@ -1,8 +1,8 @@
path := ExtractFileDir(ExtractFileDir(PluginPath())); path := ExtractFileDir(ExtractFileDir(PluginPath()));
{$IFNDEF Win32} {$IFNDEF Win32}
path := path + '/funcext/TSOffice/TSXlsxFile.tsf';
{$ELSE}
path := path + '\\funcext\\TSOffice\\TSXlsxFile.tsf'; path := path + '\\funcext\\TSOffice\\TSXlsxFile.tsf';
{$ELSE}
path := path + '/funcext/TSOffice/TSXlsxFile.tsf';
{$ENDIF} {$ENDIF}
funcs := LoadClassInfo(path); funcs := LoadClassInfo(path);
@@ -43,7 +43,6 @@ PrintSuccess("GetCellRichText", testing++);
file.MergeCell('XlsxFile', 'A1', 'C1'); file.MergeCell('XlsxFile', 'A1', 'C1');
PrintSuccess("MergeCell", testing++); PrintSuccess("MergeCell", testing++);
file.SetRowHeight('XlsxFile', 1, 60);
style := TOfficeObj('TStyle'); style := TOfficeObj('TStyle');
@@ -139,7 +138,7 @@ End
file.SetColWidth('Functions', 'A', 'A', 120); file.SetColWidth('Functions', 'A', 'A', 120);
PrintSuccess('SetColWidth', testing++); PrintSuccess('SetColWidth', testing++);
saveName := "XlsxFile使用帮助.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);
@@ -321,7 +320,6 @@ Begin
excel.SetCellValue(sheet_name, cell_1, name); excel.SetCellValue(sheet_name, cell_1, name);
excel.MergeCell(sheet_name, cell_1, cell_2); excel.MergeCell(sheet_name, cell_1, cell_2);
excel.SetCellStyle(sheet_name, cell_1, cell_2, styleid1); excel.SetCellStyle(sheet_name, cell_1, cell_2, styleid1);
excel.SetRowHeight(sheet_name, row, 25);
row++; row++;
desc_arr := obj_info[i]['Desc']; desc_arr := obj_info[i]['Desc'];
Binary file not shown.
Binary file not shown.
+5 -12
View File
@@ -1,4 +1,4 @@
# TSOffice # OfficePlugin
TSOffice 项目:纯 TSL 代码实现 excel、word 文件读写 TSOffice 项目:纯 TSL 代码实现 excel、word 文件读写
@@ -6,19 +6,19 @@ TSOffice 项目:纯 TSL 代码实现 excel、word 文件读写
### windows ### windows
对应文件夹的 dll 文件按如下要求 对应文件夹的dll文件按如下要求
- `office_plugin` 放入 tsl 安装根目录下 Plugin 文件夹 - `office_plugin` 放入 tsl 安装根目录下 Plugin 文件夹
可选: 可选:
- `fmt_pubkrnl_plugin` 放入 tsl 安装根目录下 Plugin 文件夹,若需要执行 Demo 文件夹下的[XlsxHelp.tsl](./Demo/XlsxHelp.tsl)和[DocxHelp.tsl](./Demo/DocxHelp.tsl),需要部署改动态库 - `fmt_pubkrnl_plugin` 放入 tsl 安装根目录下 Plugin 文件夹,若需要执行Demo文件夹下的[XlsxHelp.tsl](./Demo/XlsxHelp.tsl)和[DocxHelp.tsl](./Demo/DocxHelp.tsl),需要部署改动态库
### Linux ### Linux
#### Ubuntu-18.04 #### Ubuntu-18.04
根据架构选择 aarch64x86 版本将对应文件夹内容进行部署 根据架构选择aarch64x86版本将对应文件夹内容进行部署
- `liboffice_plugin` 放入 tsl 安装根目录下 Plugin 文件夹 - `liboffice_plugin` 放入 tsl 安装根目录下 Plugin 文件夹
@@ -28,14 +28,7 @@ TSOffice 项目:纯 TSL 代码实现 excel、word 文件读写
- [Word 帮助文档](./DocxFile使用帮助.docx) - [Word 帮助文档](./DocxFile使用帮助.docx)
## 扩展
扩展模块的内容需要通过`git submodule update --init --recursive`获取,相关帮助文档在`./funcext/TSOffice/Extensions/模块名`目录下可获取
支持的扩展:
- **OfficeVba** 可通过类 Vba 方式对 office文件 进行读写操作。
## Demo ## Demo
Demo 文件夹提供了一些参考的 demo Demo文件夹提供了一些参考的demo
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+271 -299
View File
@@ -1,299 +1,271 @@
Type NodeInfo = class Type NodeInfo = class
public public
Function Create(parentObj, name); Function Create(parentObj, name);
Begin Begin
if ifObj(parentObj) then if ifObj(parentObj) then
NodeUri := parentObj.NodeUri = '' ? name : (parentObj.NodeUri + '/' + name); NodeUri := parentObj.NodeUri = '' ? name : (parentObj.NodeUri + '/' + name);
else else
NodeUri := ''; NodeUri := '';
NodeName := name; NodeName := name;
ExtAttr := array(); ExtAttr := array();
ExtNodes := array(); ExtNodes := array();
ReplaceArr := array(); ReplaceArr := array();
End End
Function Root(); virtual; Function Root(); virtual;
Begin Begin
return RootObj; return RootObj;
End End
Function Update(position);overload; Function Update(position);overload;
Begin Begin
if ifObj(RootObj) then Begin if ifObj(RootObj) then Begin
arr := Marshal(); arr := Marshal();
if length(arr['attributes']) or length(arr['children']) then Begin if length(arr['attributes']) or length(arr['children']) then Begin
curNode := class(TSXml).GetNode(RootObj, NodeUri, position); curNode := class(TSXml).GetNode(RootObj, NodeUri, position);
if ifObj(curNode) then if ifObj(curNode) then
class(TSXml).UpdateNode(curNode, arr['attributes'], arr['children']); class(TSXml).UpdateNode(curNode, arr['attributes'], arr['children']);
End; End;
End; End;
End; End;
Function Update();overload; Function Update();overload;
Begin Begin
self.Update("end"); self.Update("end");
End; End;
Function Delete();overload; Function Delete();
Begin Begin
if ifObj(RootObj) then if ifObj(RootObj) then
begin begin
curNode := class(TSXml).GetNode(RootObj, NodeUri); curNode := class(TSXml).GetNode(RootObj, NodeUri);
if ifObj(curNode) then curNode.DeleteChildren(); if ifObj(curNode) then curNode.DeleteChildren();
end end
End; End;
Function Delete(name);overload; Function GetAttrs(); virtual;
Begin Begin
if not ifObj(RootObj) then return false; return ExtAttr;
node := NodeUri <> '' ? class(TSXml).GetNode(RootObj, NodeUri) : RootObj; End
attrs := GetAttrsEx(); Function GetChildren(); virtual;
lName := lowerCase(name); Begin
r := sselect * from attrs where lName = lowerCase([0]) end; return ExtNodes;
if istable(r) then End
begin
node.DeleteAttribute(r[1]); Function GetNode(index); // 返回的index的对象
return true; Begin
end return ExtNodes[index]['obj'];
End
children := GetChildren();
r := select * from children where lName = lowerCase(['field']) end; Function GetCount(); // 返回当前节点的个数
if istable(r) then Begin Begin
r := r[0]; return length(ExtAttr);
delete_node := node.FirstChildElement(r['name']); End
if ifObj(delete_node) then
begin // arr := array(('Size', 'sz', 15), ('Style', 'style', 'line'));
node.DeleteChild(delete_node); Function AddAttr(arr); // 添加属性
return true; Begin
end if not istable(arr) then return;
End; ExtAttr union= arr;
return false; return 1;
End; End
Function GetAttrs(); virtual; Function Marshal();
Begin Begin
return ExtAttr; children_ := nil;
End GetChildrenEx(); //优化为变量,减少数据COPY2022-12-10
child_arr := array();
Function GetChildren(); virtual; name_map := array();
Begin len := 0;
return ExtNodes; for i:=0 to length(children_)-1 do
End begin
node_type := children_[i]['nodeType'];
Function GetNode(index); // 返回的index的对象 obj := children_[i]['obj'];
Begin if ifnil(obj) then continue;
return ExtNodes[index]['obj']; if not ifObj(obj) and not ifnil(name_map[children_[i]['name']]) and children_[i]['attrEx'] <> '' then
End begin
child_arr[name_map[children_[i]['name']]]['attributes'] union=array(children_[i]['attrEx'] : obj);
Function GetCount(); // 返回当前节点的个数 continue;
Begin end
return length(ExtAttr);
End arr := array('type': 'element', 'name': children_[i]['name'], 'attributes': array());
if node_type = 'empty' then // <b/>
// arr := array(('Size', 'sz', 15), ('Style', 'style', 'line')); begin
Function AddAttr(arr); // 添加属性 empty_name := children_[i]['attrEx'] ? children_[i]['attrEx'] : 'val';
Begin if obj = 0 then arr['attributes'] := array(empty_name: 0);
if not istable(arr) then return; else if obj = 1 then arr['attributes'] := array(empty_name: 1)
ExtAttr union= arr; end
return 1; else if node_type = 'pcdata' then
End begin
arr['children'] := array(('type': 'pcdata', 'value': obj));
Function Marshal(); end
Begin else if ifObj(obj) then
children_ := nil; begin
GetChildrenEx(); //优化为变量,减少数据COPY2022-12-10 marshal := obj.Marshal();
child_arr := array(); if length(marshal['children'])=0 and length(marshal['attributes'])=0 then continue;
name_map := array(); arr['children'] := marshal['children'];
len := 0; arr['attributes'] union= marshal['attributes'];
for i:=0 to length(children_)-1 do end
begin else
node_type := children_[i]['nodeType']; begin
obj := children_[i]['obj']; key := children_[i]['attrName'] ? children_[i]['attrName'] : children_[i]['attrEx'] ? children_[i]['attrEx'] : 'val';
if ifnil(obj) then continue; arr['attributes'] := array(key : obj);
if not ifObj(obj) and not ifnil(name_map[children_[i]['name']]) and children_[i]['attrEx'] <> '' then end
begin name_map[children_[i]['name']] := len;
child_arr[name_map[children_[i]['name']]]['attributes'] union=array(children_[i]['attrEx'] : obj); child_arr[len++] := arr;
continue; end
end
name_arr := str2array(NodeName, '/');
arr := array('type': 'element', 'name': children_[i]['name'], 'attributes': array()); tmp_arr := array('type': 'element', 'name': name_arr[length(name_arr)-1], 'children': child_arr);
if node_type = 'empty' then // <b/> for i:=length(name_arr)-2 downto 0 do
begin begin
empty_name := children_[i]['attrEx'] ? children_[i]['attrEx'] : 'val'; tmp_arr := array('type': 'element', 'name': name_arr[i], 'children': array(tmp_arr));
if obj = 0 then arr['attributes'] := array(empty_name: 0); end
else if obj = 1 then arr['attributes'] := array(empty_name: 1);
end attrs_arr := GetAttrs();
else if node_type = 'pcdata' then tmp_arr['attributes'] := array();
begin for i:=0 to length(attrs_arr)-1 do
arr['children'] := array(('type': 'pcdata', 'value': obj)); begin
end if not ifnil(attrs_arr[i, 2]) then Begin
else if ifObj(obj) then tmp_arr['attributes'][ attrs_arr[i, 1] ] := attrs_arr[i, 2];
begin End;
marshal := obj.Marshal(); end
if length(marshal['children'])=0 and length(marshal['attributes'])=0 then continue; return tmp_arr;
arr['children'] := marshal['children']; End
arr['attributes'] union= marshal['attributes'];
end Function NewChildNode(nodeArr);
else Begin
begin if not ifarray(nodeArr) then return 0;
key := children_[i]['attrName'] ? children_[i]['attrName'] : children_[i]['attrEx'] ? children_[i]['attrEx'] : 'val'; if not ifstring(nodeArr['name']) then return 0;
arr['attributes'] := array(key : obj); arr := array((
end 'name': nodeArr['name'],
name_map[children_[i]['name']] := len; 'obj': nodeArr['obj'],
child_arr[len++] := arr; 'attrEx': nodeArr['attrEx'],
end 'nodeType': nodeArr['nodeType'],
));
name_arr := str2array(NodeName, '/'); ExtNodes union= arr;
tmp_arr := array('type': 'element', 'name': name_arr[length(name_arr)-1], 'children': child_arr); return 1;
for i:=length(name_arr)-2 downto 0 do End
begin
tmp_arr := array('type': 'element', 'name': name_arr[i], 'children': array(tmp_arr)); Function Value(name, nottransferable);
end Begin
if not ifObj(RootObj) then return nil;
attrs_arr := GetAttrs(); if NodeUri <> '' then
tmp_arr['attributes'] := array(); node := class(TSXml).GetNode(RootObj, NodeUri);
for i:=0 to length(attrs_arr)-1 do else
begin node := RootObj;
if not ifnil(attrs_arr[i, 2]) then Begin if not ifObj(node) then return nil;
tmp_arr['attributes'][ attrs_arr[i, 1] ] := attrs_arr[i, 2];
End; attrs := GetAttrsEx();
end lName := lowerCase(name);
return tmp_arr; r := sselect * from attrs where lName = lowerCase([0]) end;
End if istable(r) then
begin
Function NewChildNode(nodeArr); value := node.GetAttribute(r[1]);
Begin return nottransferable ? value : trystrtofloat(value, r) ? r : value;
if not ifarray(nodeArr) then return 0; end
if not ifstring(nodeArr['name']) then return 0;
arr := array(( children := GetChildren();
'name': nodeArr['name'], r := select * from children where lName = lowerCase(['field']) end;
'obj': nodeArr['obj'], if istable(r) then Begin
'attrEx': nodeArr['attrEx'], r := r[0];
'nodeType': nodeArr['nodeType'], node := node.FirstChildElement(r['name']);
)); if not ifObj(node) and r['nodeType'] = 'empty' then return false;
ExtNodes union= arr; if not ifObj(node) then return nil;
return 1; if r['nodeType'] = 'pcdata' then //返回文本串
End return node.GetText();
if ifObj(r['obj']) then //对象,返回XML串
Function Value(name, nottransferable); return node.Data();
Begin key := r['attrName'] ? r['attrName'] : r['attrEx'] ? r['attrEx'] : 'val';
if not ifObj(RootObj) then return nil; value := node.GetAttribute(key);
if NodeUri <> '' then if r['nodeType'] = 'empty' and value = '' then return true;
node := class(TSXml).GetNode(RootObj, NodeUri); return nottransferable ? value : trystrtofloat(value, r) ? r : value;
else End;
node := RootObj; return nil;
if not ifObj(node) then return nil; End;
attrs := GetAttrsEx(); Function Replace(hash, bChild);
lName := lowerCase(name); Begin
r := sselect * from attrs where lName = lowerCase([0]) end; if istable(hash) then Begin
if istable(r) then ReplaceArr := hash;
begin replaceNodeName();
value := node.GetAttribute(r[1]); if bChild then Begin
return nottransferable ? value : trystrtofloat(value, r) ? r : value; r := GetChildren();
end for i:=0 to length(r)-1 do Begin
if ifObj(r[i]['obj']) then
children := GetChildren(); r[i]['obj'].Replace(hash, bChild);
r := select * from children where lName = lowerCase(['field']) end; End;
if istable(r) then Begin End;
r := r[0]; End;
node := node.FirstChildElement(r['name']); End
if not ifObj(node) and r['nodeType'] = 'empty' and not nottransferable then return false;
if not ifObj(node) then return nil; Function GetChildrenEx();
if r['nodeType'] = 'pcdata' then //返回文本串 Begin
return node.GetText(); if not ifarray(children_) then Begin
if ifObj(r['obj']) then //对象,返回XML串 children_ := getChildren();
return node.Data(); if not istable(ReplaceArr) then Begin
key := r['attrName'] ? r['attrName'] : r['attrEx'] ? r['attrEx'] : 'val'; for i:=0 to length(children_)-1 do Begin
value := node.GetAttribute(key); if ifarray(children_[i]['obj']) then Begin
if r['nodeType'] = 'empty' and value = '' then return true; if istable(children_[i]['obj']) then
return nottransferable ? value : trystrtofloat(value, r) ? r : value; hasArr := 1;
End; else
return nil; children_[i]['obj'] := nil;
End; End;
End;
Function Replace(hash, bChild); End;
Begin if hasArr or istable(ReplaceArr) then Begin
if istable(hash) then Begin a := array();
ReplaceArr := hash; for i:=0 to length(children_)-1 do Begin
replaceNodeName(); if istable(ReplaceArr) then
if bChild then Begin children_[i]['name'] := ReplaceName(children_[i]['name']);
r := GetChildren(); if istable(children_[i]['obj']) then Begin
for i:=0 to length(r)-1 do Begin a union= children_[i]['obj'];
if ifObj(r[i]['obj']) then End
r[i]['obj'].Replace(hash, bChild); else
End; a[ length(a) ] := children_[i];
End; end;
End; children_ := a;
End End;
End;
Function GetChildrenEx(); End;
Begin
if not ifarray(children_) then Begin Function GetAttrsEx();
children_ := getChildren(); Begin
if not istable(ReplaceArr) then Begin return GetAttrs();//暂时没有发现需要更新属性前缀的情况
for i:=0 to length(children_)-1 do Begin if not istable(ReplaceArr) then return GetAttrs();
if ifarray(children_[i]['obj']) then Begin attr := GetAttrs();
if istable(children_[i]['obj']) then for i:=0 to length(attr)-1 do
hasArr := 1; attr[i][1] := ReplaceName(attr[i][1]);
else return attr;
children_[i]['obj'] := nil; End
End;
End; private
End; Function replaceNodeName();
if hasArr or istable(ReplaceArr) then Begin Begin
a := array(); for k, v in ReplaceArr do
for i:=0 to length(children_)-1 do Begin begin
if istable(ReplaceArr) then NodeName := ReplaceStr(NodeName, k, v);
children_[i]['name'] := ReplaceName(children_[i]['name']); end
if istable(children_[i]['obj']) then Begin End
a union= children_[i]['obj'];
End Function ReplaceName(name);
else Begin
a[ length(a) ] := children_[i]; for k,v in ReplaceArr do Begin
end; if k='' then
children_ := a; name := v + name;
End; else
End; name := ReplaceStr(name, k, v);
End; End;
return name;
Function GetAttrsEx(); End;
Begin public
return GetAttrs();//暂时没有发现需要更新属性前缀的情况 NodeName;
if not istable(ReplaceArr) then return GetAttrs(); ExtAttr;
attr := GetAttrs(); ExtNodes;
for i:=0 to length(attr)-1 do ReplaceArr;
attr[i][1] := ReplaceName(attr[i][1]); RootObj; // xml node
return attr; NodeUri:string;
End children_;
End
private
Function replaceNodeName();
Begin
for k, v in ReplaceArr do
begin
NodeName := ReplaceStr(NodeName, k, v);
end
End
Function ReplaceName(name);
Begin
for k,v in ReplaceArr do Begin
if k='' then
name := v + name;
else
name := ReplaceStr(name, k, v);
End;
return name;
End;
public
NodeName;
ExtAttr;
ExtNodes;
ReplaceArr;
RootObj; // xml node
NodeUri:string;
children_;
End
-27
View File
@@ -178,33 +178,6 @@ Type TOffice = Class
Begin Begin
return getTextBoxImpl(p, true); return getTextBoxImpl(p, true);
End; End;
///获取docx的类型
///普通段落:0
///图片段落:1
///表格:2
///其他:-1
Function GetDocxPartType(part);
Begin
if not ifObj(part) then return -1;
case part.name_ of
'w:p':
begin
if class(TSXml).GetNode(part.node_, 'w:r/w:drawing') then return 1;
return 0;
end
'w:tbl':
return 2;
else
return -1;
end;
End;
///单元格内的标题是否添加到目录
Function SetCellTableContent(flag);
Begin
hash_["CELLFLAG"] := flag;
End;
Function Set(k, v); Function Set(k, v);
Begin Begin
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -52,8 +52,8 @@ Type TDocxChart = Class(TSChart)
return true; return true;
End; End;
[weakref]docx_; docx_;
chartId_; chartId_;
rId_; rId_;
xmlObj_; xmlObj_;
End; End;
File diff suppressed because it is too large Load Diff
+206 -207
View File
@@ -1,207 +1,206 @@
Type TDocxStyles = Class Type TDocxStyles = Class
//段落格式 //段落格式
Function Create(docx); Function Create(docx);
Begin Begin
docx_ := docx; docx_ := docx;
stylesXml_ := docx.Zip().Get('word/styles.xml'); stylesXml_ := docx.Zip().Get('word/styles.xml');
idMap_ := array(); idMap_ := array();
nameMap_ := array(); nameMap_ := array();
maxStyleId_ := 1; maxStyleId_ := 1;
if ifObj(stylesXml_) then Begin if ifObj(stylesXml_) then Begin
stylesNode := stylesXml_.FirstChildElement('w:styles'); stylesNode := stylesXml_.FirstChildElement('w:styles');
if ifObj(stylesNode) then Begin if ifObj(stylesNode) then Begin
node := stylesNode.FirstChildElement('w:style'); node := stylesNode.FirstChildElement('w:style');
while ifObj(node) do Begin while ifObj(node) do Begin
o := TOfficeObj('TDocxStyle'); o := TOfficeObj('TDocxStyle');
o.Init(node); o.Init(node);
id := StrToIntDef(o.StyleId, 0); id := StrToIntDef(o.StyleId, 0);
if id > 0 and maxStyleId_ <= id then if id > 0 and maxStyleId_ <= id then
maxStyleId_ := id + 1; maxStyleId_ := id + 1;
_addStyle(o); _addStyle(o);
node := node.NextElement('w:style'); node := node.NextElement('w:style');
End; End;
pNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:pPrDefault'); pNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:pPrDefault');
if ifObj(pNode) then if ifObj(pNode) then
defaultPpr_ := Class(TSXml).ReadPprFormat(pNode); defaultPpr_ := Class(TSXml).ReadPprFormat(pNode);
rNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:rPrDefault'); rNode := class(TSXml).GetNode(stylesNode, 'w:docDefaults/w:rPrDefault');
if ifObj(rNode) then if ifObj(rNode) then
defaultRpr_ := Class(TSXml).ReadRprFormat(rNode); defaultRpr_ := Class(TSXml).ReadRprFormat(rNode);
End; End;
End; End;
End; End;
///缺省样式 ///缺省样式
///styleType:样式类型(paragraph、character、table ///styleType:样式类型(paragraph、character、table
///返回:TDocxStyle对象 ///返回:TDocxStyle对象
Function Default(styleType); Function Default(styleType);
Begin Begin
for k, obj in idMap_ do Begin for k, obj in idMap_ do Begin
if obj.wType = styleType then Begin if obj.wType = styleType then Begin
v := obj.node_.GetAttribute('w:default'); v := obj.node_.GetAttribute('w:default');
if v <> '1' then if v <> '1' then
return obj; return obj;
End; End;
End End
return nil; return nil;
End; End;
///返回指定名称的TDocxStyle ///返回指定名称的TDocxStyle
///name:样式名称 ///name:样式名称
///返回:TDocxStyle对象 ///返回:TDocxStyle对象
Function GetStyle(name); Function GetStyle(name);
Begin Begin
return nameMap_[ class(TSXml).CurCodePageToUtf8(lowercase(name)) ]; return nameMap_[ class(TSXml).CurCodePageToUtf8(lowercase(name)) ];
End; End;
///返回指定StyleId名称的TDocxStyle ///返回指定StyleId名称的TDocxStyle
///idStyleID号(数字ID号或名称字符串) ///idStyleID号(数字ID号或名称字符串)
///返回:TDocxStyle对象 ///返回:TDocxStyle对象
Function GetStyleById(id); Function GetStyleById(id);
Begin Begin
newid := ifnumber(id) ? tostring(id) : id; newid := ifnumber(id) ? tostring(id) : id;
return idMap_[ newid ]; return idMap_[ newid ];
End; End;
//返回全部LatentStyles对象列表 //返回全部LatentStyles对象列表
//返回:TDocxStyle对象列表 //返回:TDocxStyle对象列表
Function LatentStyles(); Function LatentStyles();
Begin Begin
r := array(); r := array();
node := stylesXml_.FirstChildElement('w:styles'); node := stylesXml_.FirstChildElement('w:styles');
if ifObj(node) then if ifObj(node) then
node := node.FirstChildElement('w:latentStyles'); node := node.FirstChildElement('w:latentStyles');
if ifObj(node) then Begin if ifObj(node) then Begin
node := node.FirstChildElement('w:lsdException'); node := node.FirstChildElement('w:lsdException');
while ifObj(node) do Begin while ifObj(node) do Begin
o := TOfficeObj('TDocxStyle'); o := TOfficeObj('TDocxStyle');
o.Init(node); o.Init(node);
r[ length(r) ] := o; r[ length(r) ] := o;
node := node.NextElement('w:lsdException'); node := node.NextElement('w:lsdException');
End; End;
End; End;
return r; return r;
End; End;
///返回全部Styles对象列表 ///返回全部Styles对象列表
///返回:TDocxStyle对象列表 ///返回:TDocxStyle对象列表
Function Styles(); Function Styles();
Begin Begin
return idMap_; return idMap_;
End; End;
///插入新的段落样式 ///插入新的段落样式
///styleId:样式ID,可以是自定义名称 ///styleId:样式ID,可以是自定义名称
///xmlStrInnerXml串 ///xmlStrInnerXml串
///返回:TDocxStyle对象 ///返回:TDocxStyle对象
Function AddStyleByInnerXml(styleId, xmlStr); Function AddStyleByInnerXml(styleId, xmlStr);
Begin Begin
if ifstring(styleId) and styleId <> '' then Begin if ifstring(styleId) and styleId <> '' then Begin
style := GetStyle(styleId); style := GetStyle(styleId);
if ifObj(style) then if ifObj(style) then
return style; return style;
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr); node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr);
node.SetAttribute('w:styleId', styleId); node.SetAttribute('w:styleId', styleId);
End End
else Begin else Begin
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr); node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(xmlStr);
node.SetAttribute('w:styleId', maxStyleId_++); node.SetAttribute('w:styleId', maxStyleId_++);
End; End;
o := TOfficeObj('TDocxStyle'); o := TOfficeObj('TDocxStyle');
o.Init(node); o.Init(node);
_addStyle(o); _addStyle(o);
return o; return o;
End; End;
///插入新的段落样式 ///插入新的段落样式
///oTDocxStyle对象 ///oTDocxStyle对象
///StyleId:样式ID,可以是自定义名称 ///StyleId:样式ID,可以是自定义名称
///返回:TDocxStyle对象 ///返回:TDocxStyle对象
Function AddStyle(o, StyleId); Function AddStyle(o, StyleId);
Begin Begin
if ifObj(o) then Begin if ifObj(o) then Begin
if ifString(StyleId) and StyleId <> '' and not ifObj(idMap_[ StyleId ]) then if ifString(StyleId) and StyleId <> '' and not ifObj(idMap_[ StyleId ]) then
o.StyleId := StyleId; o.StyleId := StyleId;
else else
o.StyleId := maxStyleId_++; o.StyleId := maxStyleId_++;
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(o.Marshal()); node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(o.Marshal());
obj := TOfficeObj('TDocxStyle'); obj := TOfficeObj('TDocxStyle');
obj.Init(node); obj.Init(node);
_addStyle(obj); _addStyle(obj);
return obj; return obj;
End; End;
return nil; return nil;
End; End;
///复制样式 ///复制样式
///newstyle:样式节点TDocxStyle对象 ///newstyle:样式节点TDocxStyle对象
///返回:TDocxStyle对象 ///返回:TDocxStyle对象
Function CopyStyle(newstyle); Function CopyStyle(newstyle);
Begin Begin
if ifObj(newstyle) and ifObj(newstyle.node_) then Begin if ifObj(newstyle) and ifObj(newstyle.node_) then Begin
node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(newstyle.node_.Marshal()[0]); node := stylesXml_.FirstChildElement('w:styles').InsertEndChild(newstyle.node_.Marshal()[0]);
node.DeleteAttribute('w:default'); obj := TOfficeObj('TDocxStyle');
obj := TOfficeObj('TDocxStyle'); obj.StyleId := node.GetAttribute('w:styleId');
obj.StyleId := node.GetAttribute('w:styleId'); obj.Name := node.FirstChildElement('w:name').GetAttribute('w:val');
obj.Name := node.FirstChildElement('w:name').GetAttribute('w:val'); obj.Init(node);
obj.Init(node); _addStyle(obj);
_addStyle(obj); return obj;
return obj; End;
End; return nil;
return nil; End;
End;
///插入新的LatentStyle段落样式
///插入新的LatentStyle段落样式 ///oTDocxStyle对象
///oTDocxStyle对象 ///返回TDocxStyle对象
///返回:TDocxStyle对象 Function AddLatentStyle(o);
Function AddLatentStyle(o); Begin
Begin if ifObj(o) then Begin
if ifObj(o) then Begin latentStyles := stylesXml_.FirstChildElement('w:styles').InsertEndChild('w:latentStyles');
latentStyles := stylesXml_.FirstChildElement('w:styles').InsertEndChild('w:latentStyles'); node := latentStyles.InsertEndChild('lsdException');
node := latentStyles.InsertEndChild('lsdException'); node.UnMarshal(o);
node.UnMarshal(o); latentStyles.SetAttribute('w:count', length(LatentStyles()));
latentStyles.SetAttribute('w:count', length(LatentStyles())); return node;
return node; End;
End; return nil;
return nil; End;
End;
///插入缺省的段落样式(Title、Heading1-9
///插入缺省的段落样式(Title、Heading1-9 ///返回:TDocxStyle对象
///返回:TDocxStyle对象 Function AddDefaultStyle(Name);
Function AddDefaultStyle(Name); Begin
Begin styleId := AnsiReplaceText(Name, ' ', '');
styleId := AnsiReplaceText(Name, ' ', ''); charId := StyleId + 'Char';
charId := StyleId + 'Char'; styleFname := 'wStyle/' + styleId + '.xml';
styleFname := 'wStyle/' + styleId + '.xml'; cStyleFname := 'wStyle/' + charId + '.xml';
cStyleFname := 'wStyle/' + charId + '.xml'; xmlData := TOfficeTemplate(styleFname);
xmlData := TOfficeTemplate(styleFname); if ifnil(xmlData) then
if ifnil(xmlData) then return xmlData;
return xmlData; o := AddStyleByInnerXml(styleId, xmlData);
o := AddStyleByInnerXml(styleId, xmlData);
charStyle := idMap_[charId];
charStyle := idMap_[charId]; if not ifObj(charStyle) then Begin
if not ifObj(charStyle) then Begin xmlData := TOfficeTemplate(cStyleFname);
xmlData := TOfficeTemplate(cStyleFname); if ifstring(xmlData) then Begin
if ifstring(xmlData) then Begin AddStyleByInnerXml(charId, xmlData);
AddStyleByInnerXml(charId, xmlData); End;
End; End;
End; return o;
return o; End;
End;
Function _addStyle(o);
Function _addStyle(o); Begin
Begin idMap_[ o.StyleId ] := o;
idMap_[ o.StyleId ] := o; nameMap_[ lowercase(o.Name) ] := o;
nameMap_[ lowercase(o.Name) ] := o; End;
End;
defaultPpr_;
defaultPpr_; defaultRpr_;
defaultRpr_; private
private docx_;
[weakref]docx_; stylesXml_;
stylesXml_; idMap_;
idMap_; nameMap_;
nameMap_; maxStyleId_:integer;
maxStyleId_:integer; End;
End;
+1 -1
View File
@@ -228,7 +228,7 @@ Type TNumbering = Class
class(TSXml).UpdateNode(o.node_, arr['attributes'], arr['children']); class(TSXml).UpdateNode(o.node_, arr['attributes'], arr['children']);
End; End;
private private
[weakref]docx_; docx_;
numberingXml_; numberingXml_;
maxAbstractNumId_:integer; maxAbstractNumId_:integer;
maxNumId_:integer; maxNumId_:integer;
+4 -14
View File
@@ -94,16 +94,6 @@ Type TTableContent = class
_AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel); _AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel);
End; End;
///添加目录条目
///UpperHeadingLevel:标题最高级别
///LowerHeadingLevel:标题最低级别
/// 使用 UpperHeadingLevel 属性可设置起始标题级别(最高)。例如,若要设置 TOC 域语法 {TOC \o "1-3"},可将 LowerHeadingLevel 属性设为 3,并将 UpperHeadingLevel 属性设为 1。
Function CustomAdd(posOpt, UpperHeadingLevel, LowerHeadingLevel);
Begin
//自定义页码计算与word、wps有差异,不推荐使用
_AddTableContent(posOpt, UpperHeadingLevel, LowerHeadingLevel);
End;
Function _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel); Function _AddDefaultTableContent(UpperHeadingLevel, LowerHeadingLevel);
Begin Begin
p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, UpperHeadingLevel - 1, true); p := _AddItem(UpperHeadingLevel, LowerHeadingLevel, UpperHeadingLevel - 1, true);
@@ -128,13 +118,13 @@ Type TTableContent = class
tab := TOfficeObj('TTabStop'); tab := TOfficeObj('TTabStop');
tab.Val := 'right'; tab.Val := 'right';
tab.leader := 'dot'; tab.leader := 'dot';
tab.Position := TOfficeApi().Get("TTableContent-tab-position") ?: 8306; tab.Position := 8640;
p.Format.Tabs.Add(0, tab); p.Format.Tabs.Add(0, tab);
if first then Begin if first then Begin
//fldCharType //fldCharType
r1 := p.AddRun(); r1 := p.AddRun();
r1.fldCharType := 'begin'; r1.fldCharType := 'begin';
r1.Dirty := 0; r1.Dirty := 'true';
//instrText //instrText
r2 := p.AddRun(); r2 := p.AddRun();
@@ -294,7 +284,7 @@ Type TTableContent = class
if ifObj(node) then if ifObj(node) then
return node.GetAttribute('w:name'); return node.GetAttribute('w:name');
bookMarkID := docx_.Document().GetBookMarkID(); bookMarkID := docx_.Document().GetBookMarkID();
return p.AddBookMark(bookMarkID); return p.AddBookMark();
End; End;
Function _CheckNodes(name); Function _CheckNodes(name);
@@ -324,7 +314,7 @@ Type TTableContent = class
End; End;
End; End;
[weakref]docx_; docx_;
node_; node_;
impl_; impl_;
End; End;
@@ -20,11 +20,6 @@ Type docxDocument = Class
Begin Begin
return body_; return body_;
End; End;
Function AddNameSpace(prefix, uri);
Begin
root_.SetAttribute('xmlns:' + prefix, uri);
End;
Function GetBookMarkID(); Function GetBookMarkID();
Begin Begin
+1 -1
View File
@@ -65,7 +65,7 @@ Type xlsxChart = Class(TSChart)
node := drawingXmlObj_.FirstChild('xdr:wsDr').InsertEndChild(o.Marshal()); node := drawingXmlObj_.FirstChild('xdr:wsDr').InsertEndChild(o.Marshal());
End; End;
private private
[weakref]excel_; excel_;
drawingRID_:integer; drawingRID_:integer;
chartId_; chartId_;
chartRid_; chartRid_;
+2 -6
View File
@@ -148,11 +148,7 @@ xmlns:v="urn:schemas-microsoft-com:vml">
comment += r_node.FirstChildElement('t').GetText(); comment += r_node.FirstChildElement('t').GetText();
r_node := r_node.NextElement(); r_node := r_node.NextElement();
end end
if length(comment) > 1 then if length(comment) > 1 then comment := comment[2:];
begin
if comment[1] = "\n" then comment := comment[2:];
else if comment[1:2] = "\r\n" then comment := comment[3:];
end
return array(author, comment); return array(author, comment);
End; End;
@@ -184,7 +180,6 @@ private
End; End;
End; End;
[weakref]excel_;//TSXlsxFile对象
authors_; authors_;
commentId_; commentId_;
commentFileName_:string;//'../comments/comment1.xml' commentFileName_:string;//'../comments/comment1.xml'
@@ -192,6 +187,7 @@ private
rId_:string; rId_:string;
sheetName_:string;//sheet名称 sheetName_:string;//sheet名称
sheetFileName_;//xl/worksheets/sheetN.xml sheetFileName_;//xl/worksheets/sheetN.xml
excel_;//TSExcelFile对象
commentXmlFile_;//XmlFile对象 commentXmlFile_;//XmlFile对象
commentObjs_; commentObjs_;
End; End;
+1 -1
View File
@@ -45,5 +45,5 @@ Type xlsxDocProps = Class
End; End;
private private
[weakref]excel_; //TSExcelFile对象 excel_; //TSExcelFile对象
End; End;
@@ -33,6 +33,6 @@ Type xlsxHeaderFooter = Class
private private
sheet_; //XmlSheet对象 sheet_; //XmlSheet对象
[weakref]file_; //TSExcelFile对象 file_; //TSExcelFile对象
xmlFile_; //sheet对应的xml对象 xmlFile_; //sheet对应的xml对象
End; End;
+1 -1
View File
@@ -92,7 +92,7 @@ Type xlsxHyperLink = Class
End; End;
private private
[weakref]file_; //TSExcelFile对象 file_; //TSExcelFile对象
xmlFile_;//XmlFile对象 xmlFile_;//XmlFile对象
sheetName_; sheetName_;
+1 -1
View File
@@ -169,6 +169,6 @@ private
private private
sheetName_:string; //sheet名称 sheetName_:string; //sheet名称
[weakref]excel_;//TSExcelFile对象 excel_;//TSExcelFile对象
zipfile_; zipfile_;
End; End;
@@ -38,7 +38,7 @@ Type xlsxPageLayout = Class
End; End;
private private
[weakref]file_; //TSExcelFile对象 file_; //TSExcelFile对象
sheet_;//XmlSheet对象 sheet_;//XmlSheet对象
xmlFile_; //sheet对应的xml对象 xmlFile_; //sheet对应的xml对象
End; End;
+1 -1
View File
@@ -113,7 +113,7 @@ private
private private
sheetName_:string; //sheet名称 sheetName_:string; //sheet名称
[weakref]excel_;//TSExcelFile对象 excel_;//TSExcelFile对象
zipfile_; zipfile_;
drawingXmlObj_; drawingXmlObj_;
End; End;
+1 -1
View File
@@ -95,7 +95,7 @@ Type xlsxSheetView = Class
End; End;
private private
[weakref]file_; //TSExcelFile对象 file_; //TSExcelFile对象
sheet_;//XmlSheet对象 sheet_;//XmlSheet对象
xmlFile_; //sheet对应的xml对象 xmlFile_; //sheet对应的xml对象
End; End;
+22 -126
View File
@@ -1,29 +1,15 @@
Type xlsxStyles = Class Type xlsxStyles = Class
Function Create(file); Function Create(sheetobj, file);
Begin Begin
sheet_ := sheetobj;
file_ := file; file_ := file;
style_xml_file_ := file_.WorkBook().GetXmlFileObj('xl/styles.xml'); styleXmlFile_ := file_.WorkBook().GetXmlFileObj('xl/styles.xml');
style_ := array();
Init();
End End
Function Init();
Begin
style_node := style_xml_file_.FirstChildElement("styleSheet");
xfs_node := style_node.FirstChildElement("cellXfs");
xf_node := xfs_node.FirstChildElement("xf");
count := 0;
while ifObj(xf_node) do
begin
style_[inttostr(count++)] := xf_node;
xf_node := xf_node.NextElement("xf");
end
End
Function GetStyleId(style);overload; Function GetStyleId(style);overload;
Begin Begin
node := style_xml_file_.FirstChildElement('styleSheet'); node := styleXmlFile_.FirstChildElement('styleSheet');
font_id := insertNode(node, 'fonts', style.Font); font_id := insertNode(node, 'fonts', style.Font);
border_id := insertNode(node, 'borders', style.Border); border_id := insertNode(node, 'borders', style.Border);
fill_id := insertNode(node, 'fills', style.Fill); fill_id := insertNode(node, 'fills', style.Fill);
@@ -54,16 +40,15 @@ Type xlsxStyles = Class
node := node.FirstChildElement('cellXfs'); node := node.FirstChildElement('cellXfs');
count := node.GetAttribute('count'); count := node.GetAttribute('count');
node.InsertEndChild(xf.Marshal());
node.SetAttribute('count', strtoint(count) + 1); node.SetAttribute('count', strtoint(count) + 1);
xf_node := node.InsertEndChild(xf.Marshal());
style_[count] := xf_node;
return count; return count;
End; End;
Function GetStyleId(newStyle, oldStyleId);overload; Function GetStyleId(newStyle, oldStyleId);overload;
Begin Begin
if oldStyleId = '' then return nil; if oldStyleId = '' then return nil;
style_node := style_xml_file_.FirstChildElement('styleSheet'); style_node := styleXmlFile_.FirstChildElement('styleSheet');
cellXfs_node := style_node.FirstChildElement('cellXfs'); cellXfs_node := style_node.FirstChildElement('cellXfs');
count := strtoint(cellXfs_node.GetAttribute('count')); count := strtoint(cellXfs_node.GetAttribute('count'));
Id := strtoint(oldStyleId); Id := strtoint(oldStyleId);
@@ -104,14 +89,19 @@ Type xlsxStyles = Class
xf_node.SetAttribute('applyProtection', 1); xf_node.SetAttribute('applyProtection', 1);
end end
style_[inttostr(count)] := xf_node;
return inttostr(count); return inttostr(count);
End; End;
Function GetStyle(styleId); Function GetStyle(styleId);
Begin Begin
xf := style_[styleId]; if styleId = '' then return nil;
if not ifObj(xf) then return nil; style_node := styleXmlFile_.FirstChildElement('styleSheet');
cellXfs_node := style_node.FirstChildElement('cellXfs');
count := strtoint(cellXfs_node.GetAttribute('count'));
Id := strtoint(styleId);
if Id > count-1 then return nil;
xf := getNode(cellXfs_node, 'xf', Id);
attrs := xf.Attributes(); attrs := xf.Attributes();
numfmt_id := trystrtoint(attrs['numFmtId'], r) ? r : 0; numfmt_id := trystrtoint(attrs['numFmtId'], r) ? r : 0;
font_id := trystrtoint(attrs['fontId'], r) ? r : 0; font_id := trystrtoint(attrs['fontId'], r) ? r : 0;
@@ -120,7 +110,6 @@ Type xlsxStyles = Class
alignment := xf.FirstChildElement('alignment'); alignment := xf.FirstChildElement('alignment');
protection := xf.FirstChildElement('protection'); protection := xf.FirstChildElement('protection');
style_node := style_xml_file_.FirstChildElement('styleSheet');
style := TOfficeObj('TStyle'); style := TOfficeObj('TStyle');
numFmts_node := style_node.FirstChildElement('numFmts'); numFmts_node := style_node.FirstChildElement('numFmts');
fonts_node := style_node.FirstChildElement('fonts'); fonts_node := style_node.FirstChildElement('fonts');
@@ -138,51 +127,12 @@ Type xlsxStyles = Class
return style; return style;
End; End;
Function GetNumFmtId(styleId); class Function NewObject(sheetname, file);
Begin Begin
node := style_[styleId]; o := file.WorkBook().GetSheetObj(sheetname);
if ifnil(node) then return '0'; if not ifObj(o) then return 0;
numfmt := node.GetAttribute("numFmtId"); styles := new xlsxStyles(o, file);
return numfmt = '' ? '' : numfmt; return styles;
End;
Function GetType(styleId, value);
Begin
numfmt_id := GetNumFmtId(styleId);
if numfmt_id = '' then return array(nil, value);
numfmt_id := strtoint(numfmt_id);
if numfmt_id = 0 then return array(nil, value);
if numfmt_id >= 1 and numfmt_id <= 10 then return array('n', value);
if numfmt_id >= 11 and numfmt_id <= 26 then
begin
if ifstring(value) and (trystrtodate(value, r) or trystrtodatetime(value, r) or trystrtotime(value, r)) then return array('n', r);
t := ifstring(value) ? 's' : 'n';
return array(t, value);
end
if numfmt_id >= 27 and numfmt_id <= 34 then return array('e', value);
if numfmt_id >= 35 and numfmt_id <= 48 then return array('n', value);
if numfmt_id = 49 then return array('s', value);
if numfmt_id >= 50 and numfmt_id <= 55 then
begin
if ifstring(value) and trystrtodate(value, r) then return array('n', r);
t := ifstring(value) ? 's' : 'n';
return array(t, value);
end
if numfmt_id >= 56 and numfmt_id <= 58 then
begin
if ifstring(value) and trystrtodatetime(value, r) then return array('n', r);
t := ifstring(value) ? 's' : 'n';
return array(t, value);
end
else begin
if ifstring(value) then
begin
if (pos("-", value) or pos("/", value)) and (trystrtodatetime(value, r) or trystrtodate(value, r)) then return array('n', r);
if trystrtofloat(value, r) then return array("n", value);
return array("s", value);
end
return array("n", value);
end
End; End;
private private
@@ -336,61 +286,7 @@ private
End End
private private
[weakref]file_; //TSXlsxFile对象 sheet_; //XmlSheet对象
style_xml_file_; file_; //TSExcelFile对象
style_; // 缓存style styleXmlFile_; //xmlFile对象
End; End;
// 参考:https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.spreadsheet.numberingformat?view=openxml-3.0.1
// 0 General
// 1 0
// 2 0.00
// 3 #,##0
// 4 #,##0.00
// 5 整数,货币符号旁边($#,##0_);($#,##0)
// 6 带两位小数的货币符号($#,##0.00_);($#,##0.00)
// 7 整数,带括号表示负数($#,##0_);Red
// 8 带两位小数的货币符号和红色负数($#,##0.00_);Red
// 9 0%
// 10 0.00%
// 11 0.00E+00
// 12 # ?/?
// 13 # ??/??
// 14 mm-dd-yy
// 15 d-mmm-yy
// 16 d-mmm
// 17 mmm-yy
// 18 h:mm AM/PM
// 19 h:mm:ss AM/PM
// 20 h:mm
// 21 h:mm:ss
// 22 m/d/yy h:mm
// 27 [$-404]e/m/d yyyy"年"m"月"
// 28 [$-404]e"年"m"月"d"日" m"月"d"日"
// 29 [$-404]e"年"m"月"d"日" m"月"d"日"
// 30 m/d/yy m-d-yy
// 31 yyyy"年"m"月"d"日" yyyy"年"m"月"d"日"
// 32 hh"時"mm"分" h"时"mm"分"
// 33 hh"時"mm"分"ss"秒" h"时"mm"分"ss"秒"
// 34 上午/下午hh"時"mm"分" 上午/下午h"时"mm"分"
// 35 上午/下午hh"時"mm"分"ss"秒" 上午/下午h"时"mm"分"ss"秒"
// 36 [$-404]e/m/d yyyy"年"m"月"
// 37 #,##0 ;(#,##0)
// 38 #,##0 ;[Red](#,##0)
// 39 #,##0.00;(#,##0.00)
// 40 #,##0.00;[Red](#,##0.00)
// 45 mm:ss
// 46 [h]:mm:ss
// 47 mmss.0
// 48 ##0.0E+0
// 49 @(文本)
// 50 [$-404]e/m/d yyyy"年"m"月"
// 51 [$-404]e"年"m"月"d"日" m"月"d"日"
// 52 上午/下午hh"時"mm"分" yyyy"年"m"月"
// 53 上午/下午hh"時"mm"分"ss"秒" m"月"d"日"
// 54 [$-404]e"年"m"月"d"日" m"月"d"日"
// 55 上午/下午hh"時"mm"分" 上午/下午h"时"mm"分"
// 56 上午/下午hh"時"mm"分"ss"秒" 上午/下午h"时"mm"分"ss"秒"
// 57 [$-404]e/m/d yyyy"年"m"月"
// 58 [$-404]e"年"m"月"d"日" m"月"d"日"
+1 -1
View File
@@ -126,7 +126,7 @@ private
private private
sheetName_:string; //sheet名称 sheetName_:string; //sheet名称
[weakref]excel_;//TSExcelFile对象 excel_;//TSExcelFile对象
zipfile_; zipfile_;
tableXmlFile_; tableXmlFile_;
End; End;
File diff suppressed because it is too large Load Diff
+488 -839
View File
File diff suppressed because it is too large Load Diff