commit 951d4da7ec075e0a9a9157aca4f55b789f3a02b8 Author: hans Date: Thu Jan 20 12:11:36 2022 +0800 first commit diff --git a/ExcelFile.tsf b/ExcelFile.tsf new file mode 100755 index 0000000..c2c5a7b --- /dev/null +++ b/ExcelFile.tsf @@ -0,0 +1,1621 @@ +Type ExcelFile = Class + /// Version: V1.0 2022-01-10 + /// 适用于 Microsoft Excel? 2007 及以上版本创建的电子表格文档。支持 XLSX / XLSM / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档。 + /// windows: plugin\TSXlsx_plugin.dll、tsxlsx.dll + /// linux: plugin/libtsxlsx_plugin.so、libTsXlsx.so + /// ExcelFile所有类方法返回值: + /// [err, v] := f.SetActiveSheet(); + /// if err then + /// Println("ErrorNo={}, ErrorMsg={}", err, v) + /// else + /// Println("return value={}", v); + /// + /// ExcelFile底层基于Excelize + /// Excelize是 Go 语言编写的用于操作 Office Excel 文档基础库 + /// https://xuri.me/excelize/zh-hans/ + + fh_; //文件句柄 + + ///缺省构造函数 + Function Create(); overload; + Begin + End; + + ///构造函数,打开已经存在的excel文件 + ///alias: string,文件目录别名 + ///fname: string,文件名 + ///[opt]: string,参数同OpenFile + Function Create(alias, fname, opt); overload; + Begin + OpenFile(alias, fname, opt); + End; + + ///析构函数 + Function Destory(); + Begin + xlsx_call("Close",fh_); + End; + + ///打开已经存在的excel文件 + ///alias: string,文件目录别名 + ///fname: string,文件名 + ///[opt]: string,可选参数,打开、创建文件option,json字符串 + ///定义输入、输出字符集(默认GBK),excel文件是否需要密码打开 + ///eg. opt := '{"in":"utf8","out":"utf8","password":"******"}'; + ///返回: [err, info] + Function OpenFile(alias, fname, opt); + Begin + if not ifstring(opt) or opt="" then opt := "{}"; + [err, fh, n] := xlsx_call("OpenFile", alias, fname, opt); + if err then + PrintLn("OpenFile fail: {}, fname: {}", fh, n) + else + fh_ := fh; + println("fh={}",fh); + return array(err, fh); + End; + + ///创建新xlsx文件 + ///[opt]: string,参数同openfile,NewFile方法不支持password加密文件 + ///返回: [err, info] + Function NewFile(opt); + Begin + [err, fh_] := xlsx_call("NewFile", opt); + return array(err, fh_); + End; + + ///保存文件 + ///返回: [err, info] + Function Save(); + Begin + return xlsx_call("Save", fh_); + End; + + ///另存为 + ///alias: string,文件目录别名 + ///fname: string,文件名 + ///返回: [err, info] + Function SaveAs(alias, fname); + Begin + return xlsx_call("SaveAs", fh_, alias, fname); + End; + + ///创建新sheet + ///sheet: string,工作表名称 + ///返回: [err, info] + Function NewSheet(sheet); + Begin + return xlsx_call("NewSheet", fh_, sheet); + End; + + ///删除sheet + ///sheet: string,工作表名称 + ///返回: [err, info] + Function DeleteSheet(sheet); + Begin + return xlsx_call("DeleteSheet", fh_, sheet); + End; + + ///复制sheet + ///from_sheet: string,工作表名称 + ///to_sheet: string,工作表名称 + ///返回: [err, info] + Function CopySheet(from_sheet, to_sheet); + Begin + return xlsx_call("CopySheet", fh_, from_sheet, to_sheet); + End; + + ///工作表分组 + ///sheets: json字符串,sheet数组 + ///eg. sheets := '["sheet1","sheet2"]'; + ///返回: [err, info] + Function GroupSheets(sheets); + Begin + return xlsx_call("GroupSheets", fh_, sheets); + End; + + ///取消工作表分组 + ///sheets: json字符串,sheet数组 + ///eg. sheets := '["sheet1","sheet2"]'; + ///返回: [err, info] + Function UnGroupSheets(sheets); + Begin + return xlsx_call("UnGroupSheets", fh_, sheets); + End; + + ///设置工作表背景图片 + ///picture: string,图片文件路径 + ///返回: [err, info] + Function SetSheetBackground(picture); + Begin + return xlsx_call("SetSheetBackground", fh_, picture); + End; + + ///设置默认(活动)工作表 + ///index: 整数, 工作表索引 >= 0 + ///返回: [err, info] + Function SetActiveSheet(index); + Begin + return xlsx_call("SetActiveSheet", fh_, index); + End; + + ///获取默认(活动)工作表索引 + ///返回: [err, index:int] + Function GetActiveSheet(); + Begin + return xlsx_call("GetActiveSheet", fh_); + End; + + ///设置工作表可见性 + ///sheet: string,工作表名称 + ///visible: bool + ///返回: [err, info] + Function SetSheetVisible(sheet, visible); + Begin + return xlsx_call("SetSheetVisible", fh_, sheet, visible); + End; + + ///获取工作表可见性 + ///sheet: string,工作表名称 + ///返回: [err, visible:int] + Function GetSheetVisible(sheet); + Begin + return xlsx_call("GetSheetVisible", fh_, sheet); + End; + + ///设置工作表格式属性 + ///sheet: string,工作表名称 + ///opts: string,json字符串,表格属性: + /// BaseColWidth int + /// DefaultColWidth double + /// DefaultRowHeight double + /// CustomHeight bool + /// ZeroHeight bool + /// ThickTop bool + /// ThickBottom bool + ///eg. opts := '{"BaseColWidth":8,"DefaultColWidth":4.2,"ZeroHeight":true}'; + ///返回: [err, info] + Function SetSheetFormatPr(sheet, opts); + Begin + return xlsx_call("SetSheetFormatPr", fh_, sheet, opts); + End; + + ///获取工作表格式属性 + ///sheet: string,工作表名称 + ///返回: [err, option:json],json字符串表格属性,参考SetSheetFormatPr + Function GetSheetFormatPr(sheet); + Begin + return xlsx_call("GetSheetFormatPr", fh_, sheet); + End; + + ///设置工作表视图属性 + ///sheet: string,工作表名称 + ///viewIndex: int,视图索引,viewIndex 可以是负数,如果是这样,则向后计数(-1 代表最后一个视图) + ///opts: string,json字符串,工作表视图属性: + /// + /// DefaultGridColor bool + /// RightToLeft bool + /// ShowFormulas bool + /// ShowGridLines bool + /// ShowRowColHeaders bool + /// ZoomScale double + /// TopLeftCell string + /// ShowZeros bool + ///eg. opts := '{"DefaultGridColor":true,"DefaultGridColor":2.0,"TopLeftCell":"A4"}'; + ///返回: [err, info] + Function SetSheetViewOptions(sheet, viewIndex, opts); + Begin + return xlsx_call("SetSheetViewOptions", fh_, sheet, viewIndex, opts); + End; + + ///获取工作表视图属性 + ///sheet: string,工作表名称 + ///viewindex: int,视图索引,viewIndex 可以是负数,如果是这样,则向后计数(-1 代表最后一个视图) + ///返回: [err, option:json],json字符串表格属性,参考SetSheetViewOptions + Function GetSheetViewOptions(sheet, viewIndex); + Begin + return xlsx_call("GetSheetViewOptions", fh_, viewIndex); + End; + + ///设置工作表页面布局 + ///sheet: string,工作表名称 + ///opts: string,json字符串,页面布局参数: + /// BlackAndWhite bool //BlackAndWhite specified print black and white. + /// FirstPageNumber int //FirstPageNumber specified the first printed page number. If no value is specified, then 'automatic' is assumed. + /// PageLayoutOrientation string //PageLayoutOrientation defines the orientation of page layout for a worksheet. + /// PageLayoutPaperSize int //PageLayoutPaperSize defines the paper size of the worksheet. + /// FitToHeight int //FitToHeight specified the number of vertical pages to fit on. + /// FitToWidth int //FitToWidth specified the number of horizontal pages to fit on. + /// PageLayoutScale int //PageLayoutScale defines the print scaling. This attribute is restricted to values ranging from 10 (10%) to 400 (400%). This setting is overridden when fitToWidth and/or fitToHeight are in use. + ///eg. opts := '{"BlackAndWhite":true,"FirstPageNumber":1,"PageLayoutScale":10}'; + ///返回: [err, info] + Function SetPageLayout(sheet, opts); + Begin + return xlsx_call("SetPageLayout", fh_, sheet, opts); + End; + + ///获取工作表页面布局 + ///sheet: string,工作表名称 + ///返回: [err, option:json],json字符串表格属性,参考SetPageLayout + Function GetPageLayout(sheet); + Begin + return xlsx_call("GetPageLayout", fh_, sheet); + End; + + ///设置工作表页边距 + ///sheet: string,工作表名称 + ///opts: string,json字符串,页边距参数: + /// PageMarginBotom double + /// PageMarginFooter double + /// PageMarginHeader double + /// PageMarginLeft double + /// PageMarginRight double + /// PageMarginTop double + ///eg. opts := '{"PageMarginBotom":4.2,"PageMarginLeft":1,"PageMarginTop":4.2}'; + ///返回: [err, info] + Function SetPageMargins(sheet, opts); + Begin + return xlsx_call("SetPageMargins", fh_, sheet, opts); + End; + + ///获取工作表页边距 + ///sheet: string,工作表名称 + ///返回: [err, option:json],json字符串表格属性,参考SetPageMargins + Function GetPageMargins(sheet); + Begin + return xlsx_call("GetPageMargins", fh_, sheet); + End; + + ///设置页眉和页脚 + ///sheet: string,工作表名称 + ///opts: string,json字符串,页眉和页脚参数: + /// AlignWithMargins bool //设定页眉页脚页边距与页边距对齐 + /// DifferentFirst bool //设定第一页页眉和页脚 + /// DifferentOddEven bool //设定奇数和偶数页页眉和页脚 + /// ScaleWithDoc bool //设定页眉和页脚跟随文档缩放 + /// OddFooter string //奇数页页脚控制字符 + /// OddHeader string //奇数页页眉控制字符 + /// EvenFooter string //偶数页页脚控制字符 + /// EvenHeader string //偶数页页眉控制字符 + /// FirstFooter string //首页页脚控制字符 + /// FirstHeader string //首页页眉控制字符 + ///eg. opts := '{"AlignWithMargins":true,"ScaleWithDoc":true,"EvenHeader":"&L&D&R&T"}'; + ///返回: [err, info] + Function SetHeaderFooter(sheet, opts); + Begin + return xlsx_call("SetHeaderFooter", fh_, sheet, opts); + End; + + ///设置名称,根据给定的名称和引用区域设置名称,默认范围是工作簿。 + ///opts: string,json字符串,参数: + /// Name string + /// Comment string + /// RefersTo string + /// Scope string + ///eg. opts := '{"Name":"Amount","RefersTo":"Sheet1!$A$2:$D$5","Comment":"defined name comment","Scope":"Sheet2"}'; + ///返回: [err, info] + Function SetDefinedName(opts); + Begin + return xlsx_call("SetDefinedName", fh_, opts); + End; + + ///获取作用范围内的工作簿和工作表的名称列表 + ///返回: [err, definedname:json],json字符串,所有名称列表,参见SetDefinedName + Function GetDefinedName(); + Begin + return xlsx_call("GetDefinedName", fh_); + End; + + ///删除名称,根据给定的名称和名称作用范围删除已定义的名称,默认名称的作用范围为工作簿。 + ///opts: string,json字符串,参见SetDefinedName + ///返回: [err, info] + Function DeleteDefinedName(opts); + Begin + return xlsx_call("DelDefinedName", fh_, opts); + End; + + ///设置工作簿应用程序属性 + ///opts: string,json字符串,参数: + /// Application string + /// ScaleCrop bool + /// DocSecurity int + /// Company string + /// LinksUpToDate bool + /// HyperlinksChanged bool + /// AppVersion string + ///eg. opts := '{"Application":"TS_Xlsx_Test","Company":"Shenzhen Tinysoft Co.,LTD","LinksUpToDate":true,"AppVersion":"10.1"}'; + ///返回: [err, info] + Function SetAppProps(opts); + Begin + return xlsx_call("SetAppProps", fh_, opts); + End; + + ///获取应用程序属性 + ///返回: [err, props:json],json字符串,所有名称列表,参见SetAppProps + Function GetAppProps(); + Begin + return xlsx_call("GetAppProps", fh_); + End; + + ///设置工作簿的核心属性 + ///opts: string,json字符串,参数: + /// Title string 文档标题 + /// Subject string 文档主题 + /// Creator string 创作者 + /// Keywords string 文档关键词 + /// Description string 资源内容的说明 + /// LastModifiedBy string 执行上次修改的用户 + /// Language string 文档内容的主要语言 + /// Identifier string 对给定上下文中的资源的明确引用 + /// Revision string 文档修订版本 + /// ContentStatus string 文档内容的状态。例如: 值可能包括 "Draft"、"Reviewed" 和 "Final" + /// Category string 文档内容的分类 + /// Version string 版本号,该值由用户或应用程序设置 + ///eg. opts := '{"Title":"Test","Subject":"test","Creator":"Hans"}'; + ///返回: [err, info] + Function SetDocProps(opts); + Begin + return xlsx_call("SetDocProps", fh_, opts); + End; + + ///获取工作簿的核心属性 + ///返回: [err, props:json],json字符串,所有名称列表,参见SetDocProps + Function GetDocProps(); + Begin + return xlsx_call("GetDocProps", fh_); + End; + + ///设置列可见性 + ///sheet: string,工作表 + ///col: string,列,如: "A" + ///visible: bool + ///返回: [err, info] + Function SetColVisible(sheet, col, visible); + Begin + return xlsx_call("SetColVisible", fh_, sheet, col, visible); + End; + + ///设置列宽度 + ///sheet: string,工作表 + ///startcol: string,开始列,如: "A" + ///endcol: string,结束列,如: "D" + ///width: double + ///返回: [err, info] + Function SetColWidth(sheet, startcol, endcol, width); + Begin + return xlsx_call("SetColWidth", fh_, sheet, startcol, endcol, width); + End; + + ///设置行可见性 + ///sheet: string,工作表 + ///row: int,行 + ///visible: bool + ///返回: [err, info] + Function SetRowVisible(sheet, row, visible); + Begin + return xlsx_call("SetRowVisible", fh_, sheet, row, visible); + End; + + ///设置行高度 + ///sheet: string,工作表 + ///row: int,行 + ///height: double + ///返回: [err, info] + Function SetRowHeight(sheet, row, height); + Begin + return xlsx_call("SetRowHeight", fh_, sheet, row, height); + End; + + ///获取工作表名 + ///index: int,工作表索引 + ///返回: [err, sheetname:string] + Function GetSheetName(index); + Begin + return xlsx_call("GetSheetName", fh_, index); + End; + + ///获取工作表索引 + ///sheet: string,工作表名 + ///返回: [err, sheetindex:int] + Function GetSheetIndex(sheet); + Begin + return xlsx_call("GetSheetIndex", fh_, sheet); + End; + + ///获取工作表映射表 + ///返回: [err, namemap:json],json串 {"1":"Sheet1","2":"Sheet2"} + Function GetSheetMap(); + Begin + return xlsx_call("GetSheetMap", fh_); + End; + + ///获取工作表列表 + ///返回: [err, nameArr:json],json串 ["Sheet1","Sheet2"] + Function GetSheetS(); + Begin + return xlsx_call("GetSheetS", fh_); + End; + + ///设置工作表名称 + ///oldname: string + ///newname: string + ///返回: [err, info] + Function SetSheetName(oldname, newname); + Begin + return xlsx_call("SetSheetName", fh_, oldname, newname); + End; + + ///设置工作表属性 + ///根据给定的工作表名称(大小写敏感)和筛选项设置工作表属性。 + ///sheet: string,工作表名称 + ///opts: string,json字符串,属性: + /// CodeName string + /// EnableFormatConditionsCalculation bool + /// Published bool + /// FitToPage bool + /// TabColor string + /// AutoPageBreaks bool + /// OutlineSummaryBelow bool + ///eg. opts := '{"CodeName":"code","EnableFormatConditionsCalculation":false,"TabColor":"#FFFF00","AutoPageBreaks":true}'; + ///返回: [err, info] + Function SetSheetPrOptions(sheet, opts); + Begin + return xlsx_call("SetSheetPrOptions", fh_, sheet, opts); + End; + + ///获取工作表属性 + ///根据给定的工作表名称(大小写敏感)和筛选项获取工作表属性。 + ///sheet: string,工作表名称 + ///返回: [err, options:json],json串,参见: SetSheetPrOptions + Function GetSheetPrOptions(sheet); + Begin + return xlsx_call("GetSheetPrOptions", fh_, sheet); + End; + + ///插入列,在指定列前插入空白列 + ///sheet: string,工作表名称 + ///col: string 列名,如: "D" + ///返回: [err, info] + Function InsertCol(sheet, col); + Begin + return xlsx_call("InsertCol", fh_, sheet, col); + End; + + ///插入行,在指定列前插入空白行 + ///sheet: string,工作表名称 + ///row: int + ///返回: [err, info] + Function InsertRow(sheet, row); + Begin + return xlsx_call("InsertRow", fh_, sheet, row); + End; + + ///追加复制行,根据给定的工作表名称(大小写敏感)和行号,在该行后追加复制。 + ///sheet: string,工作表名称 + ///row: int + ///返回: [err, info] + Function DuplicateRow(sheet, row); + Begin + return xlsx_call("DuplicateRow", fh_, sheet, row); + End; + + ///复制行,根据给定的工作表名称(大小写敏感)和行号,在指定行后复制该行。 + ///sheet: string,工作表名称 + ///row: int + ///row2: int + ///返回: [err, info] + Function DuplicateRowTo(sheet, row, row2); + Begin + return xlsx_call("DuplicateRowTo", fh_, sheet, row, row2); + End; + + ///创建行的分级显示,根据给定的工作表名称(大小写敏感)、行号和分级参数创建组。 + ///sheet: string,工作表名称 + ///row: int + ///level: int,分级参数 + ///返回: [err, info] + Function SetRowOutlineLevel(sheet, row, level); + Begin + return xlsx_call("SetRowOutlineLevel", fh_, sheet, row, level); + End; + + ///创建列的分级显示,根据给定的工作表名称(大小写敏感)、列名称和分级参数创建组。 + ///sheet: string,工作表名称 + ///col: string + ///level: int,分级参数 + ///返回: [err, info] + Function SetColOutlineLevel(sheet, col, level); + Begin + return xlsx_call("SetColOutlineLevel", fh_, sheet, col, level); + End; + + ///获取行的分级显示 + ///sheet: string,工作表名称 + ///row: int + ///返回: [err, level:int] + Function GetRowOutlineLevel(sheet, row); + Begin + return xlsx_call("GetRowOutlineLevel", fh_, sheet, row); + End; + + ///获取列的分级显示 + ///sheet: string,工作表名称 + ///col: string + ///返回: [err, level:int] + Function GetColOutlineLevel(sheet, col); + Begin + return xlsx_call("GetColOutlineLevel", fh_, sheet, col); + End; + + ///在工作表中搜索,根据给定的工作表名称(大小写敏感),单元格值或正则表达式来获取坐标。此函数仅支持字符串和数字的完全匹配,不支持公式计算后的结果、格式化数字和条件搜索。如果搜索结果是合并的单元格,将返回合并区域左上角的坐标。 + ///sheet: string,工作表名称 + ///value: string + ///reg: bool,是否正则表达式 + ///返回: [err, coordinates:json],json串,满足条件的坐标数组 + Function SearchSheet(sheet, value, reg); + Begin + return xlsx_call("SearchSheet", fh_, value, reg); + End; + + ///保护工作表,防止其他用户意外或有意更改、移动或删除工作表中的数据。 + ///sheet: string,工作表名称 + ///opts: string,json字符串,属性: + /// AutoFilter bool + /// DeleteColumns bool + /// DeleteRows bool + /// EditObjects bool + /// EditScenarios bool + /// FormatCells bool + /// FormatColumns bool + /// FormatRows bool + /// InsertColumns bool + /// InsertHyperlinks bool + /// InsertRows bool + /// Password string + /// PivotTables bool + /// SelectLockedCells bool + /// SelectUnlockedCells bool + /// Sort bool + ///eg. opts := '{"AutoFilter":true,"DeleteRows":true}'; + ///返回: [err, info] + Function ProtectSheet(sheet, opts); + Begin + return xlsx_call("ProtectSheet", fh_, sheet, opts); + End; + + ///取消保护工作表 + ///sheet: string,工作表名称 + ///返回: [err, info] + Function UnProtectSheet(sheet); + Begin + return xlsx_call("UnProtectSheet", fh_, sheet); + End; + + ///删除列 + ///sheet: string,工作表名称 + ///col: string,如: "D" + ///返回: [err, info] + Function RemoveCol(sheet, col); + Begin + return xlsx_call("RemoveCol", fh_, sheet, col); + End; + + ///删除行 + ///sheet: string,工作表名称 + ///row: int + ///返回: [err, info] + Function RemoveRow(sheet, row); + Begin + return xlsx_call("RemoveRow", fh_, sheet, row); + End; + + ///按行赋值 + ///sheet: string,工作表名称 + ///axis: string,起始坐标,如: "A4" + ///slice: [string,array],一维数组或json串一维数组,如: '[1,3,2,2.1,"hello"]' array(1,2,3,2,1,"hello") + ///返回: [err, info] + Function SetSheetRow(sheet, axis, slice); + Begin + if ifarray(slice) then slice := ExportJsonString(slice); + return xlsx_call("SetSheetRow", fh_, sheet, axis, slice); + End; + + ///插入分页符 + ///sheet: string,工作表名称 + ///cell: string,单元格坐标,如: "A4" + ///返回: [err, info] + Function InsertPageBreak(sheet, cell); + Begin + return xlsx_call("InsertPageBreak", fh_, sheet, cell); + End; + + ///删除分页符 + ///sheet: string,工作表名称 + ///cell: string,单元格坐标 + ///返回: [err, info] + Function RemovePageBreak(sheet, cell); + Begin + return xlsx_call("RemovePageBreak", fh_, sheet, cell); + End; + + ///按列获取全部单元格的值 + ///根据给定的工作表名(大小写敏感)按列获取该工作表上全部单元格的值,以二维数组形式返回,其中单元格的值将转换为 string 类型。如果可以将单元格格式应用于单元格的值,将使用应用后的值,否则将使用原始值。 + ///sheet: string,工作表名称 + ///opts: string,输出格式 + ///返回: [err, results:json], json串二维字符串数组 + Function GetRows(sheet); + Begin + return xlsx_call("GetRows", fh_, sheet, opts); + End; + + ///按行获取全部单元格的值 + ///根据给定的工作表名(大小写敏感)按行获取该工作表上全部单元格的值,以二维数组形式返回,其中单元格的值将转换为 string 类型。如果可以将单元格格式应用于单元格的值,将使用应用后的值,否则将使用原始值。 + ///sheet: string,工作表名称 + ///opts: string,输出格式 + ///返回: [err, results:json], json串二维字符串数组 + Function GetCols(sheet, opts); + Begin + return xlsx_call("GetCols", fh_, sheet, opts); + End; + + ///设置单元格的值 + ///sheet: string,工作表名称 + ///axis: string,单元格坐标,如: "A6" + ///val: Var,可以是整数、字符串、数值型 + ///返回: [err, info] + Function SetCellValue(sheet, axis, val); + Begin + return xlsx_call("SetCellValue", fh_, sheet, axis, val); + End; + + ///获取单元格的值 + ///sheet: string,工作表名称 + ///axis: string,单元格坐标,如: "A6" + ///opts: string,输出格式 + ///返回: [err, value:string, datatype:int],datatype参见GetCellType + Function GetCellValue(sheet, axis, opts); + Begin + return xlsx_call("GetCellValue", fh_, sheet, axis, opts); + End; + + ///设置布尔型值 + ///sheet: string,工作表名称 + ///axis: string,单元格坐标,如: "A6" + ///val: bool + ///返回: [err, info] + Function SetCellBool(sheet, axis, val); + Begin + return xlsx_call("SetCellBool", fh_, sheet, axis,val); + End; + + ///设置默认字符型值 + ///sheet: string,工作表名称 + ///axis: string,单元格坐标,如: "A6" + ///val: string,缺省值 + ///返回: [err, info] + Function SetCellDefault(sheet, axis, val); + Begin + return xlsx_call("SetCellDefault", fh_, sheet, axis, val); + End; + + ///创建单元格样式 + /// Alignment 映射单元格对齐样式设置。 + /// type Alignment struct { + /// Horizontal string + /// Indent int + /// JustifyLastLine bool + /// ReadingOrder int64 + /// RelativeIndent int + /// ShrinkToFit bool + /// TextRotation int + /// Vertical string + /// WrapText bool + /// } + /// + /// Border 映射单元格边框样式设置。 + /// type Border struct { + /// Type string + /// Color string + /// Style int + /// } + /// Font 映射字体样式设置。 + /// type Font struct { + /// Bold bool + /// Italic bool + /// Underline string + /// Family string + /// Size double + /// Strike bool + /// Color string + /// } + /// + /// Fill 映射单元格样式填充设置。 + /// type Fill struct { + /// Type string + /// Pattern int + /// Color string数组 + /// Shading int + /// } + /// + /// Protection 映射保护单元格属性设置。 + /// type Protection struct { + /// Hidden bool + /// Locked bool + /// } + /// + /// Style 映射单元格样式设置。 + /// type Style struct { + /// Border Border数组 + /// Fill Fill + /// Font Font + /// Alignment Alignment + /// Protection Protection + /// NumFmt int + /// DecimalPlaces int + /// CustomNumFmt string + /// Lang string + /// NegRed bool + /// } + ///opts: string,json串,Style结构体 + ///返回: [err, StyleID:int] + Function NewStyle(opts); + Begin + return xlsx_call("NewStyle", fh_, opts); + End; + + ///设置单元格样式 + ///sheet: string,工作表名称 + ///hcell: string,左上角坐标 + ///vcell: string,右下角坐标 + ///styleid: int,样式Id + ///返回: [err, info] + Function SetCellStyle(sheet, hcell, vcell, styleid); + Begin + return xlsx_call("SetCellStyle", fh_, sheet, hcell, vcell, styleid); + End; + + ///设置超链接 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///link: string,链接URL + ///linkType: string,链接类型,资源类型分为外部链接地址 External 和工作簿内部位置链接 Location 两种。 + ///opts: string,json串 + ///type HyperlinkOpts struct { + /// Display string + /// Tooltip string + ///} + ///返回: [err, info] + Function SetCellHyperLink(sheet, axis, link, linkType, opts); + Begin + return xlsx_call("SetCellHyperLink", fh_, sheet, axis, link, linkType, opts); + End; + + ///获取超链接 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, link:string] + Function GetCellHyperLink(sheet, axis); + Begin + return xlsx_call("GetCellHyperLink", fh_, sheet); + End; + + ///设置富文本格式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///txt: string,json串,RichText结构数组 + /// type RichText struct { + /// Font Font + /// Text string + /// } + /// type Font struct { + /// Bold bool + /// Italic bool + /// Underline string + /// Family string + /// Size double + /// Strike bool + /// Color string + /// } + ///返回: [err, info] + Function SetCellRichText(sheet, axis, txt); + Begin + return xlsx_call("SetCellRichText", fh_, sheet, axis, txt); + End; + + ///获取富文本格式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, txt:json],参见SetCellRichText + Function GetCellRichText(sheet, axis); + Begin + return xlsx_call("GetCellRichText", fh_, sheet, axis); + End; + + ///获取单元格数据类型 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, datatype:int],(Int = 0, Int64 = 20, Double = 1, String = 2, Date = 3, UnSet = 10, Err = -1) + Function GetCellType(sheet, axis); + Begin + return xlsx_call("GetCellType", fh_, sheet, axis); + End; + + ///获取单元格样式索引,获取到的索引可以在复制单元格样式时,作为调用 SetCellValue 函数的参数使用。 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, datastyle: int] + Function GetCellStyle(sheet, axis); + Begin + return xlsx_call("GetCellStyle", fh_, sheet, axis); + End; + + ///合并单元格 + ///sheet: string,工作表名称 + ///hcell: string,左上角坐标 + ///vcell: string,右下角坐标 + ///返回: [err, info] + Function MergeCell(sheet, hcell, vcell); + Begin + return xlsx_call("MergeCell", fh_, sheet, hcell, vcell); + End; + + ///取消合并单元格 + ///sheet: string,工作表名称 + ///hcell: string,左上角坐标 + ///vcell: string,右下角坐标 + ///返回: [err, info] + Function UnMergeCell(sheet, hcell, vcell); + Begin + return xlsx_call("UnMergeCell", fh_, sheet, hcell, vcell); + End; + + ///获取全部合并单元格的坐标区域和值。 + ///sheet: string,工作表名称 + ///返回: [err, value:json],返回工作表所有合并区域数组 + Function GetMergeCells(sheet); + Begin + return xlsx_call("GetMergeCells", fh_, sheet); + End; + + ///添加批注 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///comment: string + ///返回: [err, info] + Function AddComment(sheet, axis, comment); + Begin + return xlsx_call("AddComment", fh_, sheet, axis, comment); + End; + + ///获取批注 + ///返回: [err, allcomments:json],获取全部工作表中的批注。 + Function GetComments(); + Begin + return xlsx_call("GetComments", fh_); + End; + + ///设置公式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///formula: string,公式 + ///返回: [err, info] + Function SetCellFormula(sheet, axis, formula); + Begin + return xlsx_call("SetCellFormula", fh_, sheet, axis, formula); + End; + + ///获取公式 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, formula:string] + Function GetCellFormula(sheet, axis); + Begin + return xlsx_call("GetCellFormula", fh_, sheet, axis); + End; + + ///计算单元格的值 + ///sheet: string,工作表名称 + ///axis: string,单元格,如"A7" + ///返回: [err, result:string] + Function CalcCellValue(sheet, axis); + Begin + return xlsx_call("CalcCellValue", fh_, sheet, axis); + End; + + ///添加图表 + ///sheet: string,工作表名称 + ///col:string,左上角坐标 + ///format:string,json串 + ///eg. opts := '{ + /// "type": "col", + /// "series": [ + /// { + /// "name": "Sheet1!$A$2", + /// "categories": "Sheet1!$B$1:$D$1", + /// "values": "Sheet1!$B$2:$D$2" + /// }, + /// { + /// "name": "Sheet1!$A$3", + /// "categories": "Sheet1!$B$1:$D$1", + /// "values": "Sheet1!$B$3:$D$3" + /// }], + /// "format": + /// { + /// "x_scale": 1.0, + /// "y_scale": 1.0, + /// "x_offset": 15, + /// "y_offset": 10, + /// "print_obj": true, + /// "lock_aspect_ratio": false, + /// "locked": false + /// }, + /// "legend": + /// { + /// "position": "left", + /// "show_legend_key": false + /// }, + /// "title": + /// { + /// "name": "簇状柱形图 - 折线图" + /// }, + /// "plotarea": + /// { + /// "show_bubble_size": true, + /// "show_cat_name": false, + /// "show_leader_lines": false, + /// "show_percent": true, + /// "show_series_name": true, + /// "show_val": true + /// } + /// }'; + ///combo:string,json串,用来指定创建组合图表,该图表将两个或多个图表类型组合在一个图表中。 + ///返回: [err, info] + Function AddChart(sheet, cell, format, combo); + Begin + return xlsx_call("AddChart", fh_, sheet, cell, format, combo); + End; + + ///创建图表工作表 + ///sheet: string,工作表名称 + ///format:string,json串,参见AddChart + ///combo:string,json串,参见AddChart + ///返回: [err, info] + Function AddChartSheet(sheet, format, combo); + Begin + return xlsx_call("AddChartSheet", fh_, sheet, format, combo); + End; + + ///删除图表 + ///sheet: string,工作表名称 + ///cell: string,单元格 + ///返回: [err, info] + Function DeleteChart(sheet, cell); + Begin + return xlsx_call("DeleteChart", fh_, sheet, cell); + End; + + ///插入图片 + ///sheet: string,工作表名称 + ///cell: string,单元格 + ///picture: string,图片文件路径 + ///format: string,json串,图片格式(例如偏移、缩放和打印设置等) + ///eg. format := '{ + /// "x_scale": 0.5, + /// "y_scale": 0.5, + /// "hyperlink": "#Sheet2!D8", + /// "hyperlink_type": "Location"}'; + ///返回: [err, info] + Function AddPicture(sheet, cell, picture, format); + Begin + return xlsx_call("AddPicture", fh_, sheet, cell, picture, format); + End; + + ///删除图片 + ///sheet: string,工作表名称 + ///cell: string,单元格 + ///返回: [err, info] + Function DeletePicture(sheet, cell); + Begin + return xlsx_call("DeletePicture", fh_, sheet, cell); + End; + + ///添加形状 + ///sheet: string,工作表名称 + ///cell: string,单元格 + ///format: string,json串,样式(包括偏移、缩放、拉伸、宽高比和打印属性等) + ///eg. format := '{ + /// "type": "rect", + /// "color": + /// { + /// "line": "#4286F4", + /// "fill": "#8eb9ff" + /// }, + /// "paragraph": [ + /// { + /// "text": "Rectangle Shape", + /// "font": + /// { + /// "bold": true, + /// "italic": true, + /// "family": "Times New Roman", + /// "size": 36, + /// "color": "#777777", + /// "underline": "sng" + /// } + /// }], + /// "width": 180, + /// "height": 90, + /// "line": + /// { + /// "width": 1.5 + /// } + /// }'; + ///返回: [err, info] + Function AddShape(sheet, cell, format); + Begin + return xlsx_call("AddShape", fh_, sheet, cell, format); + End; + + ///添加迷你图 + ///sheet: string,工作表名称 + ///opt:string,json串 + /// type SparklineOption struct { + /// Location string-array + /// Range string-array + /// Max int + /// CustMax int + /// Min int + /// CustMin int + /// Type string + /// Weight double + /// DateAxis bool + /// Markers bool + /// High bool + /// Low bool + /// First bool + /// Last bool + /// Negative bool + /// Axis bool + /// Hidden bool + /// Reverse bool + /// Style int + /// SeriesColor string + /// NegativeColor string + /// MarkersColor string + /// FirstColor string + /// LastColor string + /// HightColor string + /// LowColor string + /// EmptyCells string + ///} + ///eg. opt := '"Location":["A1", "A2", "A3"],"Range": ["Sheet2!A1:J1", "Sheet2!A2:J2", "Sheet2!A3:J3"],"Markers":true}'; + ///返回: [err, info] + Function AddSparkLine(sheet, opt); + Begin + return xlsx_call("AddSparkLine", fh_, sheet, opt); + End; + + ///设置列样式 + ///sheet: string,工作表名称 + ///columns: string,列名,"A" "D:H" + ///styleID: int,样式ID,参见NewStyle + ///返回: [err, info] + Function SetColStyle(sheet, columns, styleID); + Begin + return xlsx_call("SetColStyle", fh_, sheet, columns, styleID); + End; + + ///设置行样式 + ///sheet: string,工作表名称 + ///row1: int + ///row2: int + ///styleID: int,样式ID,参见NewStyle + ///返回: [err, info] + Function SetRowStyle(sheet, row1, row2, styelID); + Begin + return xlsx_call("SetRowStyle", fh_, sheet, row1, row2, styelID); + End; + + ///设置默认字体 + ///fontName: string + ///返回: [err, info] + Function SetDefaultFont(sheet, fontName); + Begin + return xlsx_call("SetDefaultFont", fh_, fontName); + End; + + ///获取默认字体 + ///返回: [err, fontName:string] + Function GetDefaultFont(); + Begin + return xlsx_call("GetDefaultFont", fh_); + End; + + ///添加数据验证 + ///sheet: string,工作表名称 + ///opt: string,json串 + /// type DataValidation struct { + /// AllowBlank bool + /// Error string + /// ErrorStyle string + /// ErrorTitle string + /// Operator string + /// Prompt string + /// PromptTitle string + /// ShowDropDown bool + /// ShowErrorMessage bool + /// ShowInputMessage bool + /// Sqref string + /// Type string + /// Formula1 string + /// Formula2 string + ///} + ///返回: [err, info] + Function AddDataValidation(sheet, opt); + Begin + return xlsx_call("AddDataValidation", fh_, sheet, opt); + End; + + ///删除数据验证 + ///sheet: string,工作表名称 + ///sqref: string,数据区域,"A7:B8" + ///返回: [err, info] + Function DeleteDataValidation(sheet, sqref); + Begin + return xlsx_call("DeleteDataValidation", fh_, sheet, sqref); + End; + + ///创建数据透视表 + ///opt: string,json串 + /// type PivotTableField struct { + /// Compact bool + /// Data string + /// Name string + /// Outline bool + /// Subtotal string + /// DefaultSubtotal bool + ///} + /// type PivotTableOption struct { + /// pivotTableSheetName string + /// DataRange string + /// PivotTableRange string + /// Rows array of PivotTableField + /// Columns array of PivotTableField + /// Data array of PivotTableField + /// Filter array of PivotTableField + /// RowGrandTotals bool + /// ColGrandTotals bool + /// ShowDrill bool + /// UseAutoFormatting bool + /// PageOverThenDown bool + /// MergeItem bool + /// CompactData bool + /// ShowError bool + /// ShowRowHeaders bool + /// ShowColHeaders bool + /// ShowRowStripes bool + /// ShowColStripes bool + /// ShowLastColumn bool + /// PivotTableStyleName string + ///} + ///返回: [err, info] + Function AddPivottable(opt); + Begin + return xlsx_call("AddPivottable", fh_, opt); + End; + + ///创建表格 + ///sheet: string,工作表名称 + ///hCell: string,左上角坐标 "A1" + ///vCell: string,右下角坐标 "D5" + ///format: string,json串 + /// type formatTable struct { + /// TableName string + /// TableStyle string + /// ShowFirstColumn bool + /// ShowLastColumn bool + /// ShowRowStripes bool + /// ShowColumnStripes bool + ///} + ///返回: [err, info] + Function AddTable(sheet, hCell, vCell, format); + Begin + return xlsx_call("AddTable", fh_, sheet, hCell, vCell, format); + End; + + ///自动过滤器 + ///sheet: string,工作表名称 + ///sheet: string,工作表名称 + ///hCell: string,左上角坐标 "A1" + ///vCell: string,右下角坐标 "D5" + ///format: string,json串 + /// type formatAutoFilter struct { + /// Column string + /// Expression string + /// FilterList array of { + /// Column string + /// Value array of int + /// } + ///} + ///返回: [err, info] + Function AutoFilter(sheet, hCell, vCell, format); + Begin + return xlsx_call("AutoFilter", fh_, sheet, hCell, vCell, format); + End; + + ///清除单元格缓存 + ///返回: [err, info] + Function UpdateLinkedValue(); + Begin + return xlsx_call("UpdateLinkedValue", fh_); + End; + + ///单元格坐标切分 + ///cell: string,单元格坐标 + ///返回: [err, col:string, row:int],"AK47" -> return array(0, "AK", 47); + Function SplitCellName(cell); + Begin + return xlsx_call("SplitCellName", cell); + End; + + ///单元格坐标组合 + ///col: string + ///row: int + ///返回 [err, cell:string],参见SplitCellName + Function JoinCellName(sheet); + Begin + return xlsx_call("JoinCellName", col, row); + End; + + ///列名转索引 + ///name: string + ///返回 [err, index:int],"AK" -> return array(0, 37); + Function ColumnNameToNumber(name); + Begin + return xlsx_call("ColumnNameToNumber", name); + End; + + ///索引转列名 + ///index: int + ///返回 [err, name:string],37 -> return array(0, "AK"); + Function ColumnNumberToName(index); + Begin + return xlsx_call("ColumnNumberToName", index); + End; + + ///单元格坐标转索引 + ///cell: string + ///返回 [err, col:int, row: int] "A2" -> [1,2] + Function CellNameToCoordinates(cell); + Begin + return xlsx_call("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 xlsx_call("CoordinatesToCellName", col, row, abs); + End; + + ///创建条件格式样式 + ///style: string,样式,参见NewStyle + ///返回: [err, info] + Function NewConditionalStyle(style); + Begin + return xlsx_call("NewConditionalStyle", fh_, style); + End; + + ///设置条件格式 + ///sheet: string,工作表名称 + ///area: string,"D1:D10" + ///format: string,json串 + /// type formatConditional struct { + /// Type string + /// AboveAverage bool + /// Percent bool + /// Format int + /// Criteria string + /// Value string + /// Minimum string + /// Maximum string + /// MinType string + /// MidType string + /// MaxType string + /// MinValue string + /// MidValue string + /// MaxValue string + /// MinColor string + /// MidColor string + /// MaxColor string + /// MinLength string + /// MaxLength string + /// MultiRange string + /// BarColor string + ///} + ///返回: [err, info] + Function SetConditionalFormat(sheet, area, format); + Begin + return xlsx_call("SetConditionalFormat", fh_, sheet, area, format); + End; + + ///删除条件格式 + ///sheet: string,工作表名称 + ///area: string,"D1:D10" + ///返回: [err, info] + Function UnSetConditionalFormat(sheet, area); + Begin + return xlsx_call("UnSetConditionalFormat", fh_, sheet, area); + End; + + ///设置窗格 + ///sheet: string,工作表名称 + ///panes: string,json串 + /// type formatPanes struct { + /// Freeze bool + /// Split bool + /// XSplit int + /// YSplit int + /// TopLeftCell string + /// ActivePane string + /// Panes array of { + /// SQRef string + /// ActiveCell string + /// Pane string + /// } + ///} + ///返回: [err, info] + Function SetPanes(sheet, panes); + Begin + return xlsx_call("SetPanes", fh_, sheet, panes); + End; + + ///色值计算,通过给定的 RGB 格式色值与色调参数,计算出最终颜色。 + ///baseColor: string,RGB 格式色值 + ///tinit: double + ///返回: [err, color:string],"FF#br#bg#bb" + Function ThemeColor(baseColor, tint); + Begin + return xlsx_call("ThemeColor", baseColor, tint); + End; + + ///RGB与HSL色彩空间色值转换 + ///r: int + ///g: int + ///b: int + ///返回: [err, h:double, s:double, l:double] + Function RGBToHSL(r, g, b); + Begin + return xlsx_call("RGBToHSL", r, g, b); + End; + + ///HSL与RGB色彩空间色值转换 + ///h: double + ///s: double + ///l: double + ///返回: [err, r:int, g:int, b:int] + Function HSLToRGB(sheet); + Begin + return xlsx_call("HSLToRGB", h, s, l); + End; + + ///嵌入 VBA 项目 + ///bin: string,包含函数和/或宏的vba文件 + ///返回: [err, info] + Function AddVbaProject(bin); + Begin + return xlsx_call("AddVbaProject", fh_, bin); + End; + + ///获取总行数 + ///sheet: string,工作表名称 + ///返回: [err, TotalRows:int] + Function TotalRows(sheet); + Begin + return xlsx_call("TotalRows", fh_, sheet); + End; + + ///获取总列数 + ///sheet: string,工作表名称 + ///返回: [err, TotalCols:int] + Function TotalCols(sheet); + Begin + return xlsx_call("TotalCols", fh_, sheet); + End; + + ///判断单元格数据类型是Unset + ///dataype: int + ///返回: [err, result:bool] + Function IfUnset(datatye); + Begin + if datatype=10 then + return ture; + return false; + End; + + ///判断单元格数据类型是Int + ///dataype: int + ///返回: [err, result:bool] + Function IfInt(datatye); + Begin + if datatype=0 then + return ture; + return false; + End; + + ///判断单元格数据类型是Int64 + ///dataype: int + ///返回: [err, result:bool] + Function IfInt64(datatye); + Begin + if datatype=20 then + return ture; + return false; + End; + + ///判断单元格数据类型是Double + ///dataype: int + ///返回: [err, result:bool] + Function IfNumber(datatye); + Begin + if datatype=1 then + return ture; + return false; + End; + + ///判断单元格数据类型是String + ///dataype: int + ///返回: [err, result:bool] + Function IfString(datatye); + Begin + if datatype=2 then + return ture; + return false; + End; + + ///判断单元格数据类型是Date + ///dataype: int + ///返回: [err, result:bool] + Function IfDate(datatye); + Begin + if datatype=3 then + return ture; + return false; + End; + + ///判断单元格数据类型是Error + ///dataype: int + ///返回: [err, result:bool] + Function IfError(datatye); + Begin + if datatype=-1 then + return ture; + return false; + End; + + ///插入数据表 + ///sheet: string,工作表名称 + ///axis: string,左上角坐标,如: "A4" + ///data: table,数据表 + ///IncludeHeader: bool 是否包括表头 + ///IncludeIndex: bool + ///返回: [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 + [err, info] := SetSheetRow(sheet, axis, FieldNames(data)); + if err then + return array(err, info); + 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; + //PrintLn("cell={},data={}->{}",cell, data[i],t); + [err, info] := SetSheetRow(sheet, cell, t); + if err then + return array(err, info); + End; + return array(0, "OK"); + End; + + ///读取数据表 + ///sheet: string,工作表名称 + ///c1: string,左上角坐标,如: "A4" + ///c2: string,右下角坐标,如: "B8",为空获取从c1开始的整张表 + ///IncludeHeader: bool 是否包括表头 + ///IncludeIndex: bool + ///返回: [err, data:table] + Function GetTable(sheet, c1, c2, IncludeHeader, IncludeIndex); + Begin + r := array(); + fields := array(); + [err, colcount] := TotalCols(sheet); + if err then + return array(err, colcount); + [err, col1, row1] := CellNameToCoordinates(c1); + if err then + return array(err, col1); + if c2="" then Begin + col2 := colcount; + [err, row2] := TotalRows(sheet); + if err then + return array(err, row2); + End else Begin + [err, col2, row2] := CellNameToCoordinates(c2); + if err then + return array(err, col2); + End; + if col2 > colcount then + col2 := colcount; + if IncludeHeader then Begin + for i:=col1 to col2 do Begin + [err, cell] := CoordinatesToCellName(i, row1); + if err then + return array(err, cell); + [err, v, datatype] := GetCellValue(sheet, cell); + if err then + return array(err, v); + fields[length(fields)] := v; + End; + row1 ++; + End; + //echo tostn(array(col1,col2,row1,row2)); + for i:=row1 to row2 do Begin + if IncludeIndex and IncludeHeader then Begin + r[cnt]['Index'] := i - row1 + 1; + End + else if IncludeIndex then Begin + r[cnt][0] := i - row1 + 1; + End; + for j:=col1 to col2 do Begin + [err, cell] := CoordinatesToCellName(col1, i); + if err then + return array(err, cell); + [err, v, datatype] := GetCellValue(sheet, cell); + //echo cell, "->", tostn(array(v, datatype)),"\n"; + if err then + return array(err, v); + try + case datatype of + 0: v := strtoint(v); + 20: v := strtoint(v); + 1,3,10: v := strtofloat(v); + //-1,2://string,Err + End; + except + End; + if IncludeHeader then Begin + r[cnt][ fields[j - col1] ] := v; + End + else Begin + r[cnt][ j - col1 + ifthen(IncludeIndex,1,0)] := v; + End; + End; + cnt++; + End; + return array(0, r); + End; +End; \ No newline at end of file diff --git a/ExcelFile浣跨敤甯姪.xlsx b/ExcelFile浣跨敤甯姪.xlsx new file mode 100755 index 0000000..ab53deb Binary files /dev/null and b/ExcelFile浣跨敤甯姪.xlsx differ diff --git a/Linux-aarch64/libTsXlsx.so b/Linux-aarch64/libTsXlsx.so new file mode 100755 index 0000000..a5f3b84 Binary files /dev/null and b/Linux-aarch64/libTsXlsx.so differ diff --git a/Linux-aarch64/libtsxlsx_plugin.so b/Linux-aarch64/libtsxlsx_plugin.so new file mode 100755 index 0000000..2279fb1 Binary files /dev/null and b/Linux-aarch64/libtsxlsx_plugin.so differ diff --git a/Linux-x86_64/libTSSVRAPI.so b/Linux-x86_64/libTSSVRAPI.so new file mode 100755 index 0000000..d00c761 Binary files /dev/null and b/Linux-x86_64/libTSSVRAPI.so differ diff --git a/Linux-x86_64/libTsXlsx.so b/Linux-x86_64/libTsXlsx.so new file mode 100755 index 0000000..4a18cbf Binary files /dev/null and b/Linux-x86_64/libTsXlsx.so differ diff --git a/Linux-x86_64/libtsxlsx_plugin.so b/Linux-x86_64/libtsxlsx_plugin.so new file mode 100755 index 0000000..9ee7047 Binary files /dev/null and b/Linux-x86_64/libtsxlsx_plugin.so differ diff --git a/README.md b/README.md new file mode 100755 index 0000000..a3803e2 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +1銆丒xcelFile.tsf 绫绘帴鍙o紝tsl64\funcext\ExcelFile.tsf + +2銆丒xcelFile浣跨敤甯姪.xlsx + +3銆佹彃浠跺簱锛歐indows-X64銆丩inux-aarch64銆丩inux-x86_64 + +4銆乨emo1: test.tsl + +5銆乨emo2: create_excelfile_help.tsl 鑷姩鐢熸垚銆奅xcelFile浣跨敤甯姪.xlsx銆嬫枃浠躲 \ No newline at end of file diff --git a/Windows-X64/TSXlsx_plugin.dll b/Windows-X64/TSXlsx_plugin.dll new file mode 100755 index 0000000..911c351 Binary files /dev/null and b/Windows-X64/TSXlsx_plugin.dll differ diff --git a/Windows-X64/tsxlsx.dll b/Windows-X64/tsxlsx.dll new file mode 100755 index 0000000..e449ba8 Binary files /dev/null and b/Windows-X64/tsxlsx.dll differ diff --git a/create_excelfile_help.tsl b/create_excelfile_help.tsl new file mode 100755 index 0000000..a94c678 --- /dev/null +++ b/create_excelfile_help.tsl @@ -0,0 +1,149 @@ +funcs := LoadClassInfo("ExcelFile.tsf"); + +file := CreateObject("ExcelFile"); +[err, errinfo] := file.NewFile(); +if err then + return println("errorno={},errinfo={}", err, errinfo); + +[err, errinfo] := file.SetSheetName("Sheet1","ExcelFile"); +if err then + return println("errorno={},errinfo={}", err, errinfo); + +[err, errinfo] := file.NewSheet("Functions"); +if err then + return println("errorno={},errinfo={}", err, errinfo); + +[err, errinfo] := file.SetCellRichText("ExcelFile", "A1", '[{"Font":{"bold":true,"italic":false,"underline":"none","family":"华文彩云","size":48,"strike":false,"color":"A020F0"},"Text":"ExcelFile类"},{"Font":{"bold":true,"italic":false,"underline":"none","family":"华文行楷","size":36,"strike":false,"color":"FF0000"},"Text":"使用帮助"}]'); +if err then + return println("errorno={},errinfo={}", err, errinfo); + +//合并单元格 +[err, errinfo] := file.MergeCell("ExcelFile", "A1", "C1"); +if err then + return println("errorno={},errinfo={}", err, errinfo); + +//创建样式 +[err, style] := file.NewStyle('{"Border":[{"Type": "left", "Color": "FF0000", "Style": 6}, + {"Type": "top", "Color": "FF0000", "Style": 6}, + {"Type": "bottom", "Color": "FF0000", "Style": 6}, + {"Type": "right", "Color": "FF0000", "Style": 6}], + "Fill":{"Type": "gradient", "Color": ["#FFFFFF", "#E0EBF5"], "Shading": 1}, + "Alignment":{"Horizontal":"center","Vertical":"center"} + }'); +if err then + return println("errorno={},errinfo={}", err, style); + +//设置样式 +[err, errinfo] := file.SetCellStyle("ExcelFile", "A1", "C1", style); +if err then + return println("errorno={},errinfo={}", err, errinfo); + +file.SetCellValue("ExcelFile", "A3", "索引"); +file.SetCellValue("ExcelFile", "B3", "函数名称"); +file.SetCellValue("ExcelFile", "C3", "功能"); +file.SetColWidth("ExcelFile","A", "A", 6); +file.SetColWidth("ExcelFile","B", "B", 42); +file.SetColWidth("ExcelFile","C", "C", 100); +file.SetCellStyle("ExcelFile","A3","C3",style); +file.SetColWidth("Functions","A", "A", 150); + +//创建样式2 +[err, style2] := file.NewStyle('{"Font":{"Color": "A020F0", "Bold": true, "Size": 12, "Family": "Microsoft YaHei"}, + "Fill":{"Type": "pattern", "Color":["#EFEFEF"], "Pattern":1}, + "Alignment":{"WrapText":true} + }'); +if err then + return println("errorno={},errinfo={}", err, style2); +[err, style3] := file.NewStyle('{"Font":{"Color": "1f7f3b", "Size": 9, "Family": "Microsoft YaHei"}, + "Fill":{"Type": "pattern", "Color":["#EFEFEF"], "Pattern":1}, + "Alignment":{"WrapText":true} + }'); +if err then + return println("errorno={},errinfo={}", err, style3); + +//设置超链接下划线 +[err, style4] := file.NewStyle('{"Font":{"Color":"A020F0", "Underline": "single"}}');//设置字体、格式 +if err then + return println("NewStyle:errorno={},errinfo={}", err, style); + +row := 1; +for i:=0 to length(funcs)-1 do begin + [err, cell0] := file.CoordinatesToCellName(1, i+4); + [err, 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']); + + str := funcs[i]['name'] + "\nFunction " + funcs[i]['funcname'] + funcs[i]['comment']; + arr := str2array(str,"\n"); + [err, c1] := file.CoordinatesToCellName(1, row); + [err, c3] := file.CoordinatesToCellName(1, row+length(arr)-1); + file.SetCellStyle("Functions",c1,c3,style3); + file.SetCellStyle("Functions",c1,c1,style2); + + for j:=0 to length(arr)-1 do begin + [err, c] := file.CoordinatesToCellName(1, row++); + file.SetCellValue("Functions",c,arr[j]); + end; + row++; + + //设置超链接 + [err, errinfo] := file.SetCellHyperLink("ExcelFile", cell1, "Functions!"$c1, "Location"); + if err then + return println("SetCellHyperLink:errorno={},errinfo={}", err, errinfo); + [err, errinfo] := file.SetCellStyle("ExcelFile", cell1, cell1, style4); + if err then + return println("SetCellStyle:errorno={},errinfo={}", err, errinfo); +End; + +[err, errinfo] := file.SaveAs("", "ExcelFile使用帮助.xlsx"); +if err then + return println("errorno={},errinfo={}", err, errinfo); +println("Create ExcelFile使用帮助.xlsx File."); + +function LoadClassInfo(f); +Begin + t := array(); + [err,fh] := io_open(f); + if err then return t; + [err, data] := io_read(fh); + io_close(fh); + if err then return t; + + lines := str2array(string(data), "\n"); + for i:=0 to length(lines)-1 do begin + line := lines[i]; + str := " End;"; + if leftstr(line, length(str)) = str then Begin + if funcname <> "" and leftstr(funcname,7) <> "Create(" and leftstr(funcname,8) <> "Destory(" then Begin + n := length(t); + t[n]['funcname'] := funcname; + t[n]['comment'] := comment; + t[n]['name'] := name; + End; + funcname := ""; + comment := ""; + name := ""; + begF := 0; + endF := 1; + continue; + End; + func := " Function "; + if leftstr(line, length(func)) = func then Begin + funcname := rightstr(line, length(line)-length(func)); + begF := 1; + continue; + End; + if endF=0 or begF then continue; + if ParseRegExpr("\/\/\/(.*)$",line,"",result,MPos,Mlen) and length(result) then Begin + str := result[0][1]; + if name="" then begin + name := str; + continue; + end; + comment := comment + "\n " + str; + End; + End; + return t; +End; \ No newline at end of file diff --git a/test.tsl b/test.tsl new file mode 100755 index 0000000..e417270 --- /dev/null +++ b/test.tsl @@ -0,0 +1,198 @@ +file := CreateObject("ExcelFile");//创建ExcelFile对象 +[err, errinfo] := file.NewFile();//新建Excel文件,文件格式默认为GBK +if err then + return println("NewFile: errorno={},errinfo={}", err, errinfo); +testing := 1; +PrintLn( "Test {} [创建ExcelFile] Ok...", testing++); + +//富文本 +[err, errinfo] := file.SetCellRichText("Sheet1", "A1", '[{"Font":{"bold":true,"italic":false,"underline":"none","family":"华文行楷","size":26,"strike":false,"color":"FF0000"},"Text":"深圳市"},{"Font":{"bold":true,"italic":false,"underline":"none","family":"华文行楷","size":48,"strike":false,"color":"A020F0"},"Text":"天软"},{"Font":{"bold":true,"italic":false,"underline":"none","family":"华文行楷","size":26,"strike":false,"color":"FF0000"},"Text":"科技开发有限公司"}]'); +if err then + return println("SetCellRichText:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [富文本] Ok...", testing++); +//[err, txt] := file.GetCellRichText("Sheet1", "A1"); + +//合并单元格 +[err, errinfo] := file.MergeCell("Sheet1", "A1", "J1"); +if err then + return println("MergeCell:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [合并单元格] Ok...", testing++); + +//创建样式 +[err, style] := file.NewStyle('{"Border":[{"Type": "left", "Color": "FF0000", "Style": 6}, + {"Type": "top", "Color": "FF0000", "Style": 6}, + {"Type": "bottom", "Color": "FF0000", "Style": 6}, + {"Type": "right", "Color": "FF0000", "Style": 6}], + "Fill":{"Type": "gradient", "Color": ["#FFFFFF", "#E0EBF5"], "Shading": 1}, + "Alignment":{"Horizontal":"center","Vertical":"center"} + }'); +if err then + return println("NewStyle:errorno={},errinfo={}", err, style); +PrintLn( "Test {} [创建样式] Ok...", testing++); + +//设置样式 +[err, errinfo] := file.SetCellStyle("Sheet1", "A1", "J1", style); +if err then + return println("SetCellStyle:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [设置样式] Ok...", testing++); + +//设置单元格值 +[err, errinfo] := file.SetCellValue("Sheet1","A3","http://www.tinysoft.com.cn"); +if err then + return println("SetCellValue:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [设置单元格值] Ok...", testing++); + +//设置超链接 +[err, errinfo] := file.SetCellHyperLink("Sheet1", "A3", "http://www.tinysoft.com.cn", "External"); +if err then + return println("SetCellHyperLink:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [设置超链接] Ok...", testing++); + +//设置超链接下划线 +[err, style] := file.NewStyle('{"Font":{"Color":"A020F0", "Underline": "single"}, "Alignment":{"Horizontal":"center","Vertical":"center"}}');//设置字体、格式 +if err then + return println("NewStyle:errorno={},errinfo={}", err, style); +[err, errinfo] := file.SetCellStyle("Sheet1", "A3", "A3", style); +if err then + return println("SetCellStyle:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [设置超链接下划线] Ok...", testing++); + +//合并单元格 +[err, errinfo] := file.MergeCell("Sheet1", "A3", "J3"); +if err then + return println("MergeCell:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [合并单元格] Ok...", testing++); + +//插入数据表 +data := array(("Name":"Small","Apple":2,"Orange":3,"Pear":3), + ("Name":"Normal","Apple":5,"Orange":2,"Pear":4), + ("Name":"Large","Apple":6,"Orange":7,"Pear":8)); +[err, errinfo] := file.InsertTable("Sheet1","A5",data, true); +if err then + return println("InsertTable:errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [插入数据表] Ok...", testing++); + +//获取数据表 +[err, r] := file.GetTable("Sheet1","B6","C7"); +if err then + return println("GetTable:errorno={},errinfo={}", err, r); +PrintLn( "Test {} [获取数据表] Ok...{}", testing++, r); + +//插入柱状图 +opts := '{ + "type": "col", + "series": [ + { + "name": "Sheet1!$A$6", + "categories": "Sheet1!$B$5:$D$5", + "values": "Sheet1!$B$6:$D$6" + }, + { + "name": "Sheet1!$A$7", + "categories": "Sheet1!$B$5:$D$5", + "values": "Sheet1!$B$7:$D$7" + }, + { + "name": "Sheet1!$A$8", + "categories": "Sheet1!$B$5:$D$5", + "values": "Sheet1!$B$8:$D$8" + }], + "format": + { + "x_scale": 1.0, + "y_scale": 1.0, + "x_offset": 15, + "y_offset": 10, + "print_obj": true, + "lock_aspect_ratio": false, + "locked": false + }, + "legend": + { + "position": "left", + "show_legend_key": false + }, + "title": + { + "name": "Fruit 2D Column Chart" + }, + "plotarea": + { + "show_bubble_size": true, + "show_cat_name": false, + "show_leader_lines": false, + "show_percent": true, + "show_series_name": true, + "show_val": true + }, + "show_blanks_as": "zero" + }'; +[err, r] := file.AddChart("Sheet1","A10",opts); +if err then + return println("AddChart:errorno={},errinfo={}", err, r); +PrintLn( "Test {} [插入柱状图] Ok...{}", testing++, r); + +//插入三维饼图 + opts := '{ + "type": "pie3D", + "series": [ + { + "name": "Sheet1!$A$6", + "categories": "Sheet1!$B$5:$D$5", + "values": "Sheet1!$B$6:$D$6" + }], + "format": + { + "x_scale": 1.0, + "y_scale": 1.0, + "x_offset": 15, + "y_offset": 10, + "print_obj": true, + "lock_aspect_ratio": false, + "locked": false + }, + "legend": + { + "position": "bottom", + "show_legend_key": false + }, + "title": + { + "name": "Fruit 3D Pie Chart" + }, + "plotarea": + { + "show_bubble_size": true, + "show_cat_name": false, + "show_leader_lines": false, + "show_percent": true, + "show_series_name": false, + "show_val": false + }, + "show_blanks_as": "zero" + }'; +[err, r] := file.AddChart("Sheet1","I10",opts); +if err then + return println("AddChart:errorno={},errinfo={}", err, r); +PrintLn( "Test {} [插入三维饼图] Ok...{}", testing++, r); + +//插入表格 +[err, r] := file.AddTable("Sheet1", "L2", "P6", '{ + "table_name": "table", + "table_style": "TableStyleMedium2", + "show_first_column": true, + "show_last_column": true, + "show_row_stripes": false, + "show_column_stripes": true + }'); +if err then + return println("AddTable:errorno={},errinfo={}", err, r); +PrintLn( "Test {} [插入表格] Ok...{}", testing++, r); + +//save文件 +[err, errinfo] := file.SaveAs("", "test.xlsx"); +if err then + return println("SaveAs: errorno={},errinfo={}", err, errinfo); +PrintLn( "Test {} [SaveAs] Ok...", testing++); + +PrintLn( "Test All Ok!" );