// Version 1.5.0

Type TSExcelFile = Class
	///Version: V1.0 2022-08-08
	///适用于 Microsoft Excel? 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式。
	///纯TSL模块实现
	///Excel文件读写接口

	///缺省构造函数
	Function Create(); overload;
	Begin
		init();
	End;

	///构造函数，打开已经存在的excel文件
	///alias: string，文件目录别名
	///fname: string，文件名
	Function Create(alias, fname); overload;
	Begin
		init();
		OpenFile(alias, fname, nil);
	End;

	///构造函数，打开已经存在的excel文件
	///alias: string，文件目录别名
	///fname: string，文件名
	///passwd: string，密码
	Function Create(alias, fname, passwd); overload;
	Begin
		init();
		OpenFile(alias, fname, passwd);
	End;

	//析构函数
	Function Destory();
	Begin
	End;

	//初始化
	Function init();
	Begin
		zipfile_ := new ZipFile();
	End;

	///打开excel文件
	///alias: string，文件目录别名
	///fname: string，文件名
	///[passwd]: string，密码
	///返回: [err, errmsg]
	Function OpenFile(alias, fname, passwd);
	Begin
		if not ifObj(zipfile_) then return array(-1, 'Create ZipFile object fail.');
		if zipfile_.FilesCount() > 0 then zipfile_ := new ZipFile();
		[err, errmsg] := zipfile_.Open(alias, fname, passwd);
		if err=0 then Begin
			workbook_ := new xlsxWorkBook(zipfile_);
			workbook_.Load();
		End;
		return array(err, errmsg);
	End;

	///新建excel文件
	///返回: [err, info]
	Function NewFile();
	Begin
		def := TOfficeTemplate('default.xlsx', true);
		[err, errmsg] := zipfile_.LoadFromMem(def);
		if err = 0 then
		begin
			workbook_ := new xlsxWorkBook(zipfile_);
			workbook_.Load();
		end
		return array(err, errmsg);
	End;

	///保存文件
	///返回: [err, info]
	Function Save();
	Begin
		return zipfile_.Save();
	End;

	///设置密码
	Function SetPassword(passwd)
	Begin
		zipfile_.Password := passwd;
	End;

	///打开二进制内容
	///data: 二进制数据
	///返回: [err, errmsg]
	Function LoadFromMem(data);
	Begin
		[err, errmsg] := zipfile_.LoadFromMem(data);
		if err = 0 then
		begin
			workbook_ := new xlsxWorkBook(zipfile_);
			workbook_.Load();
		end
		return array(err, errmsg);
	End;

	///保存为二进制内容
	///返回: [err, fileContent] fileContent二进制文件内容
	Function SaveToMem();
	Begin
		return zipfile_.Save2Mem();
	End;

	///另存为
	///alias: string，文件目录别名
	///fname: string，文件名
	///返回: [err, info]
	Function SaveAs(alias, fname);
	Begin
		return zipfile_.Save(alias, fname);
	End;

	///真实文件名
	///返回: string
	Function FileName();
	Begin
		return zipfile_.FileName();
	End;

	///获取工作表列表
	///返回: array('Sheet1','Sheet2')
	Function GetSheets();
	Begin
		sheets := workbook_.GetSheets();
		for i:=0 to length(sheets)-1 do
		begin
			sheets[i] := class(TSXml).Utf8ToCurCodePage(sheets[i]);
		end
		return sheets;
	End;

	///获取工作表数
	///返回: integer
	Function GetSheetsCount();
	Begin
		return workbook_.GetSheetsCount();
	End;

	///获取工作表名
	///index: int，工作表索引
	///返回: string
	Function GetSheetName(index);
	Begin
		name := workbook_.GetSheetName(index);
		return class(TSXml).Utf8ToCurCodePage(name);
	End;

	///创建新sheet
	///sheet: string，工作表名称
	Function NewSheet(sheet);overload;
	Begin
		return workbook_.NewSheet(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///在指定sheet之后插入新sheet
	///sourceSheet: string，指定工作表名称
	///destSheet: string，目的工作表名称
	Function NewSheet(sourceSheet, destSheet);overload;
	Begin
		return workbook_.NewSheet(class(TSXml).CurCodePageToUtf8(sourceSheet), class(TSXml).CurCodePageToUtf8(destSheet));
	End;

	///在指定sheet之前插入新sheet
	///sourceSheet: string，指定工作表名称
	///destSheet: string，目的工作表名称
	Function InsertSheet(sourceSheet, destSheet);
	Begin
		return workbook_.InsertSheet(class(TSXml).CurCodePageToUtf8(sourceSheet), class(TSXml).CurCodePageToUtf8(destSheet));
	End;

	///删除sheet
	///sheet: string，工作表名称
	Function DeleteSheet(sheet);
	Begin
		return workbook_.DeleteSheet(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///设置工作表名
	///sourceName: string, 原工作表名
	///destName: string, 目标工作表名
	Function SetSheetName(sourceName, destName);
	Begin
		return workbook_.SetSheetName(class(TSXml).CurCodePageToUtf8(sourceName), class(TSXml).CurCodePageToUtf8(destName));
	End;

	///获取总列数
	///sheet: string，工作表名称
	///返回: int
	Function TotalCols(sheet);
	Begin
		return workbook_.TotalCols(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///获取总行数
	///sheet: string，工作表名称
	///返回: int
	Function TotalRows(sheet);
	Begin
		return workbook_.TotalRows(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///获取单元格的值
	///sheet: string，工作表名称
	///axis: string，单元格坐标，如: "A6"
	///返回: [err, value:string]
	Function GetCellValue(sheet, axis);
	Begin
		[err, value] := workbook_.GetCellValue(class(TSXml).CurCodePageToUtf8(sheet), axis);
		if not err then return array(err, class(TSXml).Utf8ToCurCodePage(value));
		return array(err, value);
	End;

	///获取单元格数据类型
	///sheet: string，工作表名称
	///axis: string，单元格坐标，如: "A6"
	///返回: type:string
	Function GetCellValueType(sheet, axis);
	Begin
		return workbook_.GetCellValueType(class(TSXml).CurCodePageToUtf8(sheet), axis);
	End;

	///设置单元格的值
	///sheet: string，工作表名称
	///axis: string，单元格坐标，如: "A6"
	///val: Var，可以是整数、字符串、数值型等；nil 不设置值(可以调用ClearCell方法清空单元格)，只设置属性
	///[opt:Tany]，可选参数，单元格属性，可以是xml字符串或天软数组
	///		 xml串：opt := '<c t="s" s="1"></c>';
	///		 数组： opt := array('t':'s', 's':'1');
	///		 属性t：单元格数据类型，不设置的话，数据类型为val的数据类型；
	///				t ->（'s' 共享字符串、'b' bool 类型、'e' 错误类型、'inlineStr' 内联字符串类型、nil 数字类型、'str' 公式类型）
	///		 属性s：单元格样式
	Function SetCellValue(sheet, axis, val, opt);
	Begin
		sheet_name := class(TSXml).CurCodePageToUtf8(sheet);
		value := class(TSXml).CurCodePageToUtf8(val);
		return workbook_.SetCellValue(sheet_name, axis, value, opt);
	End;

	///获取富文本格式
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///返回: [err, richtxt:string]，参见SetCellRichText
	Function GetCellRichText(sheet, axis);
	Begin
		[err, str] := workbook_.GetCellRichText(class(TSXml).CurCodePageToUtf8(sheet), axis);
		if err then return array(err, str);
		else return array(err, class(TSXml).Utf8ToCurCodePage(str));
	End;

	///设置富文本格式
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///richtext: string，xml串或富文本对象TSOfficeObj('TRichText')
	Function SetCellRichText(sheet, axis, richtext);
	Begin
		o := workbook_.GetSheetObj(class(TSXml).CurCodePageToUtf8(sheet));
		if ifObj(o) then
		begin
			xml := richtext;
			if ifObj(richtext) then
				xml := class(TSXml).Dom2Xml(richtext.Marshal());
			return o.SetCellValue(axis, xml, array('t':'s'), 'RichText');
		end
	End;

	///清空单元格
	///sheet: string，工作表名称
	///[topLeft: string]，左上角坐标，可选参数
	///[bottomRight: string]，右下角坐标，可选参数，
	///		用法1：ClearCell();		//Clear整个sheet
	///		用法2：ClearCell('A2'); //Clear 'A2'单元格
	///		用法3：ClearCell('A5', 'D8'); //Clear矩形区间所有单元格
	Function ClearCell(sheet, topLeft, bottomRight);
	Begin
		return workbook_.ClearCell(class(TSXml).CurCodePageToUtf8(sheet), topLeft, bottomRight);
	End;

	///设置公式
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///formula: string，公式
	Function SetCellFormula(sheet, axis, formula);
	Begin
		return workbook_.SetCellFormula(class(TSXml).CurCodePageToUtf8(sheet), axis, formula);
	End;

	///获取公式
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///返回: [err, formula:string]
	Function GetCellFormula(sheet, axis);
	Begin
		return workbook_.GetCellFormula(class(TSXml).CurCodePageToUtf8(sheet), axis);
	End;

	///按行赋值
	///sheet: string，工作表名称
	///axis: string，起始坐标，如: "A4"
	///slice: array()，一维数组array(1,2,3,2,1,"hello")
	Function SetSheetRow(sheet, axis, slice);
	Begin
		[err, col, row] := CellNameToCoordinates(axis);
		if not err then
		begin
			for i:=0 to length(slice)-1 do
			begin
				[err, cell] := CoordinatesToCellName(col + i, row);
				SetCellValue(sheet, cell, slice[i]);
			end
		end
	End;

	///插入数据表
	///sheet: string，工作表名称
	///axis: string，左上角坐标，如: "A4"
	///data: table，数据表
	///[IncludeHeader: bool] 是否包括表头，默认FALSE
	///[IncludeIndex: bool] 是否自动添加索引号，默认FALSE
	///返回: [err, info]
	Function InsertTable(sheet, axis, data, IncludeHeader, IncludeIndex);
	Begin
		if not ifarray(data) or length(data)=0 then
			return array(-1, "Invalid Data.");
		if FieldCount(data)=0 then Begin //数据是一维数组
			return SetSheetRow(sheet, axis, data);
		End;
		[err, colNum, rowNum] := CellNameToCoordinates(axis);
		if err then
			return array(err, colNum);
		if IncludeHeader then Begin
			fields := FieldNames(data);
			if IncludeIndex then Begin
				fields := array("Index") union fields;
			End;
			SetSheetRow(sheet, axis, fields);
			rowNum ++;
		End;
		if IncludeIndex then Begin
			for i:=0 to length(data)-1 do Begin
				[err, cell] := CoordinatesToCellName(colNum, rowNum + i);
				if err then
					return array(err, cell);
				SetCellValue(sheet, cell, i+1);
			End;
			colNum ++;
		End;
		for i:=0 to length(data)-1 do Begin
			[err, cell] := CoordinatesToCellName(colNum, rowNum + i);
			if err then
				return array(err, cell);
			t := sselect * from data where thisrowindex = i End;
			SetSheetRow(sheet, cell, t);
			if err then
				return array(err, info);
		End;
		return array(0, "OK");
	End;

	///读取数据表
	///sheet: string，工作表名称
	///topLeft: string，左上角坐标，如: "A4"
	///bottomRight: string，右下角坐标，如: "B8"，为空获取从topLeft开始的整张表
	///[IncludeHeader: bool] 是否包括表头，默认FALSE
	///[IncludeIndex: bool] 是否包括索引号，默认FALSE
	///返回: table
	Function GetTable(sheet, topLeft, bottomRight, includeHeader, includeIndex, forceSingle);
	Begin
		return workbook_.GetTable(class(TSXml).CurCodePageToUtf8(sheet), topLeft, bottomRight, includeHeader, includeIndex, forceSingle);
	End;

	///插入列，在指定列前插入空白列
	///sheet: string，工作表名称
	///col: string 列名，如: "D"
	Function InsertCol(sheet, col);
	Begin
		return workbook_.InsertCol(class(TSXml).CurCodePageToUtf8(sheet), col);
	End;

	///插入行，在指定行前插入空白行
	///sheet: string，工作表名称
	///row: int
	Function InsertRow(sheet, row);
	Begin
		return workbook_.InsertRow(class(TSXml).CurCodePageToUtf8(sheet), row);
	End;

	///删除列
	///sheet: string，工作表名称
	///col: string，如: "D"
	Function RemoveCol(sheet, col);
	Begin
		return workbook_.RemoveCol(class(TSXml).CurCodePageToUtf8(sheet), col);
	End;

	///删除行
	///sheet: string，工作表名称
	///row: int
	Function RemoveRow(sheet, row);
	Begin
		return workbook_.RemoveRow(class(TSXml).CurCodePageToUtf8(sheet), row);
	End;

	///设置行高度
	///sheet: string，工作表
	///row: int，行
	///height: double，行高[0-409]
	Function SetRowHeight(sheet, row, height);
	Begin
		return workbook_.SetRowHeight(class(TSXml).CurCodePageToUtf8(sheet), row, height);
	End;

	///获取行高度
	///sheet: string，工作表
	///row: int，行
	///返回: double
	Function GetRowHeight(sheet, row);
	Begin
		return workbook_.GetRowHeight(class(TSXml).CurCodePageToUtf8(sheet), row);
	End;

	///设置列宽度
	///sheet: string，工作表
	///startcol: string，开始列，如: "A"
	///endcol: string，结束列，如: "D"
	///width: double，列宽[0-255]
	Function SetColWidth(sheet, startCol, endCol, width);
	Begin
		return workbook_.SetColWidth(class(TSXml).CurCodePageToUtf8(sheet), startCol, endCol, width);
	End;

	///获取列宽度
	///sheet: string，工作表
	///col: string，列
	///返回: double
	Function GetColWidth(sheet, col);
	Begin
		return workbook_.GetColWidth(class(TSXml).CurCodePageToUtf8(sheet), col);
	End;

	///设置工作表默认列宽
	///sheet: string，工作表
	///width: double
	Function SetSheetDefaultColWidth(sheet, width);
	Begin
		return workbook_.SetSheetDefaultColWidth(class(TSXml).CurCodePageToUtf8(sheet), width);
	End;

	///获取工作表默认列宽
	///sheet: string，工作表
	///返回: double
	Function GetSheetDefaultColWidth(sheet);
	Begin
		return workbook_.GetSheetDefaultColWidth(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///添加批注
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///Author:string
	///comment: string
	Function AddComment(sheet, axis, Author, comment);
	Begin
		o := getOj(sheet, 'xlsxComment');
		if ifObj(o) then return o.AddComment(axis, Author, comment);
	End;

	///获取批注
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///返回: [author:string, comment: string]
	Function GetComment(sheet, axis);
	Begin
		author := nil;
		comment := nil;
		o := getOj(sheet, 'xlsxComment');
		if ifObj(o) then [author, comment] := o.GetComment(axis);
		return array(class(TSXml).Utf8ToCurCodePage(author), class(TSXml).Utf8ToCurCodePage(comment));
	End;

	///移除批注
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	Function RemoveComment(sheet, axis);
	Begin
		o := getOj(sheet, 'xlsxComment');
		if ifObj(o) then return o.RemoveComment(axis);
	End;

	///添加图表
	///sheet: string，工作表名称
	///range:string，图表所处矩形区域，"A5:F10"
	///chart:TChart对象
	Function AddChart(sheet, range, chart);
	Begin
		o := getOj(sheet, 'xlsxChart');
		if ifObj(chart) then return o.AddChart(range, chart);
	End;

	///获取图表列表
	///sheet: string，工作表名称
	///返回: [err, ChartList]
	Function GetCharts(sheet);
	Begin
		return workbook_.GetCharts(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///单元格坐标切分
	///cell: string，单元格坐标
	///返回: [err, col:string, row:int]，"AK47" -> return array(0, "AK", 47);
	Function SplitCellName(cell);
	Begin
		return SplitCellName(cell);
	End;

	///列名转索引
	///name: string
	///返回 [err, index:int]，"AK" -> return array(0, 37);
	Function ColumnNameToNumber(name);
	Begin
		return ColumnNameToNumber(name);
	End;

	///索引转列名
	///index: int
	///返回 [err, name:string]，37 -> return array(0, "AK");
	Function ColumnNumberToName(index);
	Begin
		return ColumnNumberToName(index);
	End;

	///单元格坐标转索引
	///cell: string
	///返回 [err, col:int, row: int] "A2" -> [1,2]
	Function CellNameToCoordinates(cell);
	Begin
		return CellNameToCoordinates(cell);
	End;

	///索引转单元格坐标
	///col: int
	///row: int
	///abs: bool ,true返回"$A$1"格式，false返回"A1"格式
	///返回 [err, cell:string] [1,2,true] -> "$A$2"
	Function CoordinatesToCellName(col, row, abs);
	Begin
		return CoordinatesToCellName(col, row, abs);
	End;

	///RGB与HSL色彩空间色值转换
	///r: int
	///g: int
	///b: int
	///返回: [h:double, s:double, l:double]
	Function RGBToHSL(r, g, b);
	Begin
		return RGBToHSL(r, g, b);
	End;

	///HSL与RGB色彩空间色值转换
	///h: double
	///s: double
	///l: double
	///返回: [r:int, g:int, b:int]
	Function HSLToRGB(h, s, l);
	Begin
		return HSLToRGB(h, s, l);
	End;

	///新建样式对象
	///style: TStyle对象
	///返回: styleid
	Function NewStyle(style); overload;
	Begin
		styleObj := new xlsxStyles('', self);
		return styleObj.GetStyleId(style);
	End;

	///新建样式对象，已存在样式的基础上返回新的样式Id
	///style: TStyle对象
	///oldStyleId: 已存在的styleId
	///返回: styleid
	Function NewStyle(style, oldStyleId); overload;
	Begin
		styleObj := new xlsxStyles('', self);
		return styleObj.GetStyleId(style, oldStyleId);
	End;

	///获取样式对象
	///返回: TStyle对象
	Function GetStyle(styleid);
	Begin
		styleObj := new xlsxStyles('', self);
		return styleObj.GetStyle(styleid);
	End;

	///设置单元格样式
	///sheet: string，工作表名称
	///topLeft: string，左上角坐标
	///bottomRight: string，右下角坐标
	///styleid: string，样式Id
	Function SetCellStyle(sheet, topLeft, bottomRight, styleid);
	Begin
		return workbook_.SetCellStyle(class(TSXml).CurCodePageToUtf8(sheet), topLeft, bottomRight, styleid);
	End;

	///获取单元格样式Id，获取到的Id可以在复制单元格样式时，作为调用 SetCellValue、或SetCellStyle 函数的参数使用。
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///返回: styleId: string
	Function GetCellStyle(sheet, axis);
	Begin
		return workbook_.GetCellStyle(class(TSXml).CurCodePageToUtf8(sheet), axis);
	End;

	///设置工作表页眉页脚
	///sheet: string，工作表名称
	///headerFooter: THeaderFooter对象
	Function SetSheetHeaderFooter(sheet, headerFooter);
	Begin
		o := getOj(sheet, 'xlsxHeaderFooter');
		if ifObj(o) then o.SetHeaderFooter(headerFooter);
	End;

	///设置工作表可见性
	///sheet: string, 工作表名称
	///visible: boolean
	Function SetSheetVisible(sheet, visible);
	Begin
		return workbook_.SetSheetVisible(class(TSXml).CurCodePageToUtf8(sheet), visible);
	End;

	///获取工作表可见性
	///sheet: string，工作表名称
	///visibility: boolean
	Function GetSheetVisible(sheet);
	Begin
		return workbook_.GetSheetVisible(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///设置行可见性
	///sheet: string，工作表
	///row: int，行
	///visible: boolean
	Function SetRowVisible(sheet, row, visible)
	Begin
		return workbook_.SetRowVisible(class(TSXml).CurCodePageToUtf8(sheet), row, visible);
	End;

	///获取工作表行可见性
	///sheet: string，工作表名称
	///row: int, 行
	///返回: [err, visible:boolean]
	Function GetRowVisble(sheet, row);
	Begin
		return workbook_.GetRowVisble(class(TSXml).CurCodePageToUtf8(sheet), row);
	End;

	///设置列可见性
	///sheet: string，工作表
	///col: string，列，如：'A'
	///visible: boolean
	Function SetColVisible(sheet, col, visible)
	Begin
		[err, col] := ColumnNameToNumber(col);
		if err then return "Col error.";
		return workbook_.SetColVisible(class(TSXml).CurCodePageToUtf8(sheet), col, visible);
	End;

	///获取列可见性
	///sheet: string，工作表名称
	///col: string，列
	///返回: [err, visible:int]
	Function GetColVisble(sheet, col);
	Begin
		[err, col] := ColumnNameToNumber(col);
		if err then return array(-1, col);
		return workbook_.GetColVisble(class(TSXml).CurCodePageToUtf8(sheet), col);
	End;

	///设置工作表页边距
	///sheet: string，工作表名称
	///margins: TMargins 对象
	Function SetPageMargins(sheet, margins);
	Begin
		return workbook_.SetPageMargins(class(TSXml).CurCodePageToUtf8(sheet), margins);
	End;

	///获取工作表页边距
	///sheet: string，工作表名称
	///返回: TMargins对象
	Function GetPageMargins(sheet);
	Begin
		return workbook_.GetPageMargins(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///合并单元格
	///sheet: string，工作表名称
	///hcell: string，左上角坐标
	///vcell: string，右下角坐标
	Function MergeCell(sheet, hcell, vcell);
	Begin
		return workbook_.MergeCell(class(TSXml).CurCodePageToUtf8(sheet), hcell, vcell);
	End;

	///取消合并单元格
	///sheet: string，工作表名称
	///hcell: string，左上角坐标
	///vcell: string，右下角坐标
	Function UnMergeCell(sheet, hcell, vcell);
	Begin
		return workbook_.UnMergeCell(class(TSXml).CurCodePageToUtf8(sheet), hcell, vcell);
	End;

	///新建窗口
	///返回：windowsIndex int, 窗口索引
	Function NewSheetPane();
	Begin
		return workbook_.NewSheetView();
	End;

	///设置窗格
	///sheet: string，工作表名称
	///windowsIndex: int，窗口索引，从0开始
	///Pane: TPane对象
	Function SetPane(sheet, windowsIndex, Pane);
	Begin
		o := getOj(sheet, 'xlsxSheetView');
		if ifObj(o) then return o.SetPane(windowsIndex, Pane);
	End;

	///设置工作表视图属性
	///sheet: string，工作表名称
	///windowsIndex: int，窗口索引，从0开始
	///sheet: object，TSheetView对象
	Function SetSheetViewOptions(sheet, windowsIndex, sheetView);
	Begin
		o := getOj(sheet, 'xlsxSheetView');
		if ifObj(o) then return o.SetSheetViewOptions(windowsIndex, sheetView);
	End;

	///获取工作表视图属性
	///sheet: string，工作表名称
	///windowsIndex: int，窗口索引，从0开始
	///返回: object, TSheetView对象
	Function GetSheetViewOptions(sheet, windowsIndex);
	Begin
		o := getOj(sheet, 'xlsxSheetView');
		if ifObj(o) then return o.GetSheetViewOptions(windowsIndex);
	End;

	// TODO printerSettings1.bin?
	///设置工作表页面布局
	///sheet: string，工作表名称
	///pageLayout: TPageLayout对象，属性:
	Function SetPageLayout(sheet, pageLayout);
	Begin
		o := getOj(sheet, 'xlsxPageLayout');
		if ifObj(o) then return o.SetPageLayout(class(TSXml).CurCodePageToUtf8(sheet), pageLayout);
	End;

	///获取工作表页面布局
	///sheet: string，工作表名称
	///返回: TPageLayout对象
	Function GetPageLayout(sheet);
	Begin
		o := getOj(sheet, 'xlsxPageLayout');
		if ifObj(o) then return o.GetPageLayout();
		return "error sheet";
	End;

	///设置默认工作表
	///sheet: string，工作表名称
	Function SetDefaultSheet(sheet);
	Begin
		return workbook_.SetDefaultSheet(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///获取默认工作表
	///返回: string，工作表名称
	Function GetDefaultSheet();
	Begin
		sheet := workbook_.GetDefaultSheet();
		return class(TSXml).Utf8ToCurCodePage(sheet);
	End;

	///设置超链接
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///hyplink: THyperLink对象
	Function SetCellHyperLink(sheet, axis, hyperlink);
	Begin
		o := getOj(sheet, 'xlsxHyperLink');
		if ifObj(o) then return o.SetCellHyperLink(axis, hyperlink);
	End;

	// TODO 返回的结果有点问题
	///获取超链接
	///sheet: string，工作表名称
	///axis: string，单元格，如"A7"
	///返回: THyperLink对象
	Function GetCellHyperLink(sheet, axis);
	Begin
		o := getOj(sheet, 'xlsxHyperLink');
		if not ifObj(o) then return array(1, 'The sheet is not exist.');
		return o.GetCellHyperLink(axis);
	End;

	///设置工作表背景图片
	///picture: TPicture图片对象
	Function SetSheetBackground(sheet, picture);
	Begin
		o := getOj(sheet, 'xlsxImage');
		if ifObj(o) then return o.SetSheetBackground(picture);
	End;

	///添加图片
	///sheet: string, 工作表名称
	///topLeft: string, 图片插入左上角单元格
	///bottomRight: string, 图片插入右下角单元格
	///picture: TPicture 图片对象
	///format: TPictureFormat 图片设置对象
	Function AddPicture(sheet, topLeft, bottomRight, picture, format);
	Begin
		o := getOj(sheet, 'xlsxImage');
		if ifObj(o) then return o.AddPicture(topLeft, bottomRight, picture, format);
	End;

	///删除图片
	///sheet: 工作表名称
	///topLeft: string, 图片插入左上角单元格
	///bottomRight: string, 图片插入右下角单元格
	Function DeletePicture(sheet, topLeft, bottomRight);
	Begin
		o := getOj(sheet, 'xlsxImage');
		if ifObj(o) then return o.DeletePicture(topLeft, bottomRight);
	End;

	///创建表格
	///sheet: string，工作表名称
	///topLeft: string, 左上角单元格
	///bottomRight: string, 右下角单元格
	///tableStyle: 表格选项类 TTableStyle
	///[includeHeader: bool] 是否包括表头，默认FALSE
	Function AddTable(sheet, topLeft, bottomRight, tableStyle, includeHeader);
	Begin
		o := getOj(sheet, 'xlsxTable');
		if ifObj(o) then return o.AddTable(topLeft, bottomRight, tableStyle, includeHeader);
	End;

	///指定行前插入分页符
	///sheet: string，工作表名称
	///row: int，行号
	Function InsertPageBreak(sheet, row);
	Begin
		return workbook_.InsertPageBreak(class(TSXml).CurCodePageToUtf8(sheet), row);
	End;

	///删除指定行分页符
	///sheet: string，工作表名称
	///row: int，行号
	Function RemovePageBreak(sheet, row);
	Begin
		return workbook_.RemovePageBreak(class(TSXml).CurCodePageToUtf8(sheet), row);
	End;

	///添加形状
	///sheet: string，工作表名称
	///topLeft: string, 左上角单元格
	///bottomRight: string, 右下角单元格
	///shapeType: string, 形状类型
	///format: 形状设置，TShapeFormat类
	Function AddShape(sheet, topLeft, bottomRight, shapeType, format);
	Begin
		o := getOj(sheet, 'xlsxShape');
		if ifObj(o) then return o.AddShape(topLeft, bottomRight, shapeType, format);
	End;

	///设置工作簿的核心属性
	///coreProps: TCoreProperty对象
	Function SetCoreProps(coreProps);
	Begin
		o := getOj('', 'xlsxDocProps');
		if ifObj(o) then return o.SetCoreProps(coreProps);
	End;

	///获取工作簿的核心属性
	///返回: TCoreProperty对象
	Function GetCoreProps();
	Begin
		o := getOj('', 'xlsxDocProps');
		if ifObj(o) then return o.GetCoreProps();
	End;

	///设置工作簿应用程序属性
	///appProps: TAppProperty对象，属性:
	Function SetAppProps(appProps);
	Begin
		o := getOj('', 'xlsxDocProps');
		if ifObj(o) then return o.SetAppProps(appProps);
	End;

	///获取应用程序属性
	///返回: TAppProperty对象
	Function GetAppProps();
	Begin
		o := getOj('', 'xlsxDocProps');
		return o.GetAppProps();
	End;

	///复制Sheet
	///sourceSheet: 源工作表
	///destSheet: 目的工作表，如果destSheet存在，则覆盖destSheet，否则末尾新增destSheet
	Function CopySheet(sourceSheet, destSheet);
	Begin
		return workbook_.CopySheet(class(TSXml).CurCodePageToUtf8(sourceSheet), class(TSXml).CurCodePageToUtf8(destSheet));
	End;

	///保护工作表
	///sheet: 工作表
	///protect: TProtect对象
	Function ProtectSheet(sheet, protect);
	Begin
		return workbook_.ProtectSheet(class(TSXml).CurCodePageToUtf8(sheet), protect);
	End;

	///取消保护工作
	///sheet: 工作表
	Function UnProtectSheet(sheet);
	Begin
		return workbook_.UnProtectSheet(class(TSXml).CurCodePageToUtf8(sheet));
	End;

	///设置默认字体
	///font: TFont对象
	Function SetDefaultFont(font);
	Begin
		return workbook_.SetDefaultFont(font);
	End;

	///获取默认字体
	///返回: TFont对象
	Function GetDefaultFont();
	Begin
		return workbook_.GetDefaultFont();
	End;

	///设置工作簿计算选项
	///calcPr: TCalcPr对象
	Function SetCalcOptions(calcPr);
	Begin
		return workbook_.SetCalcOptions(calcPr);
	End;

	///获取工作簿计算选项
	///返回: TCalcPr对象
	Function GetCalcOptions();
	Begin
		return workbook_.GetCalcOptions();
	End;

	///创建行的分级显示，根据给定的工作表、行号和分级参数创建组
	///sheet: string, 工作表名称
	///row: int, 行号
	///level: int, 分级参数
	Function SetRowOutlineLevel(sheet, row, level);
	Begin
		return workbook_.SetRowOutlineLevel(class(TSXml).CurCodePageToUtf8(sheet), row, level);
	End;

	///获取行的分级参数
	///sheet: string, 工作表名称
	///row: int, 行号
	///返回: int，分级参数，分级不存在返回0
	Function GetRowOutlineLevel(sheet, row);
	Begin
		return workbook_.GetRowOutlineLevel(class(TSXml).CurCodePageToUtf8(sheet), row);
	End;

	///

	///创建列的分级显示，根据给定的工作表、列名和分级参数创建组
	///sheet: string, 工作表名称
	///col: string, 列名
	///level: int, 分级参数
	Function SetColOutlineLevel(sheet, col, level);
	Begin
		[err, col] := ColumnNameToNumber(col);
		if err then return "Col error.";
		return workbook_.SetColOutlineLevel(class(TSXml).CurCodePageToUtf8(sheet), col, level);
	End;

	///获取列的分级参数
	///sheet: string, 工作表名称
	///col: string, 列名
	///返回: int，分级参数，分级不存在返回0
	Function GetColOutlineLevel(sheet, col);
	Begin
		[err, col] := ColumnNameToNumber(col);
		if err then return "Col error.";
		return workbook_.GetColOutlineLevel(class(TSXml).CurCodePageToUtf8(sheet), col);
	End;

	Function WorkBook();
	Begin
		return workbook_;
	End;

	Function Zip();
	Begin
		return zipfile_;
	End;

private
	Function getOj(sheet, objname);
	Begin
		sheetname := class(TSXml).CurCodePageToUtf8(sheet);
		if not ifarray(objMgr_) then objMgr_:= array();
		k := sheetname + '.' + objname;
		o := objMgr_[ k ];
		if not ifnil(o) then return o;
		case objname of
		'xlsxMargin':
			o := class(xlsxMargin).NewObject(sheetname, self);
		'xlsxComment':
			o := class(xlsxComment).NewObject(sheetname, self);
		'xlsxStyles':
			o := class(xlsxStyles).NewObject(sheetname, self);
		'xlsxChart':
			return class(xlsxChart).NewObject(sheetname, self);//不缓存xlsxChart对象
		'xlsxHeaderFooter':
			o := class(xlsxHeaderFooter).NewObject(sheetname, self);
		'xlsxSheetView':
			o := class(xlsxSheetView).NewObject(sheetname, self);
		'xlsxPageLayout':
			o := class(xlsxPageLayout).NewObject(sheetname, self);
		'xlsxDocProps':
			return class(xlsxDocProps).NewObject(self);
		'xlsxImage':
			o := class(xlsxImage).NewObject(sheetname, self);
		'xlsxHyperLink':
			o := class(xlsxHyperLink).NewObject(sheetname, self);
		'xlsxShape':
			o := class(xlsxShape).NewObject(sheetname, self);
		'xlsxTable':
			o := class(xlsxTable).NewObject(sheetname, self);
		End;
		if ifObj(o) then objMgr_[k] := o;
		return o;
	End;

	zipfile_;	//压缩文件对象
	workbook_;	//WorkBook对象
	objMgr_;	//各种对象缓存、管理
End;

