Flexcel学习笔记

news2025/2/26 9:59:34

1.引用的单元

FlexCel.Core

始终需要使用的一个单元。

多系统运行时。{$IFDEF LINUX}SKIA.FlexCel.Core{$ELSE}{$IFDEF FIREMONKEY}FMX.FlexCel.Core{ $ELSE}VCL.FlexCel.Core{$ENDIF}{$ENDIF}

FlexCel.XlsAdapter这是FlexCel的xls/x引擎。如果您正在处理xls或xlsx文件,则需要使用此单元。很少有情况您不需要使用这个单元
FlexCel.Render这是FlexCel渲染引擎,它可以将xls/x文件中的内容转换成图像、PDF、HTML或其他类似格式的文件。当你想要将一个xls/x文件导出为不同格式时,你需要使用FlexCel.Render
FlexCel.Pdf 这是 FlexCel PDF 引擎。请注意,这是一个通用的 PDF 引擎,与 xls/x 文件无关。如果您直接与 PDF 引擎打交道,或者通常处理 PDF 文件,则需要使用 FlexCel.Pdf
FlexCel.Report 这是FlexCel报告引擎。如果您正在使用TFlexCelReport类进行Excel报告,则需要使用此单元。

2.创建一个使用代码的Excel文件 

uses... System.IOUtils, VCL.FlexCel.Core, FlexCel.XlsAdapter;

procedure CreateExcelFile;
var xls: TXlsFile;
begin 
//Create a new empty Excel file, with default formatting as if it was createdby Excel 2019. //Different Excel versions can have different formatting when they create 
//an empty file, so for example 
//Excel 2003 will have a default font of Arial, and 2019 will use Calibri. 
//This format is anyway the starting format, you can change it all later. 
xls := TXlsFile.Create(1, TExcelFileFormat.v2019, true); 
try 
//Enters a string into A1 
xls.SetCellValue(1, 1, 'Hello from FlexCel!'); 
//Enters a number into A2. //Note that xls.SetCellValue(2, 1, '7') would enter a string. 
xls.SetCellValue(2, 1, 7); 

//Enter another floating point number. 
//All numbers in Excel are floating point, 
//so even if you enter an integer, it will be stored as double. 
xls.SetCellValue(3, 1, 11.3); 
//Enters a formula into A4. 
xls.SetCellValue(4, 1, TFormula.Create('=Sum(A2:A3)')); 
//Saves the file to the "Documents" folder. 

xls.Save(TPath.Combine(TPath.GetDocumentsPath, 'test.xlsx'));
finally 
xls.Free; 
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin 
CreateExcelFile;
end;

3.读取一个文件 

procedure ReadExcelFile(const aMemo: TMemo);
var
 xls: TXlsFile;
 row, colIndex: integer;
 XF: integer;
 cell: TCellValue;
 addr: TCellAddress;
 s: string;
begin
 xls := TXlsFile.Create(TPath.Combine(TPath.GetDocumentsPath, 'test.xlsx'));
 try
 xls.ActiveSheetByName := 'Sheet1'; //we'll read sheet1. We could loop over
the existing sheets by using xls.SheetCount and xls.ActiveSheet
 for row := 1 to xls.RowCount do
 begin
 for colIndex := 1 to xls.ColCountInRow(row) do //Don't use xls.ColCount as
it is slow: See https://doc.tmssoftware.com/flexcel/vcl/guides/performanceguide.html#avoid-calling-colcount
 begin
 XF := -1;
 cell := xls.GetCellValueIndexed(row, colIndex, XF);
 addr := TCellAddress.Create(row, xls.ColFromIndex(row, colIndex));
 s := ('Cell ' + addr.CellRef + ' ');
 if (cell.IsEmpty) then s := s + 'is empty.'
 else if (cell.IsString) then s := s + 'has a string: ' + cell.ToString
 else if (cell.IsNumber) then s := s + 'has a number: ' +
FloatToStr(cell.AsNumber)
 else if (cell.IsBoolean) then s := s + 'has a boolean: ' +
BoolToStr(cell.AsBoolean)
 else if (cell.IsError) then s := s + 'has an error: ' + cell.ToString
 else if (cell.IsFormula) then s := s + 'has a formula: ' +
cell.AsFormula.Text
 else s := s + ('Error: Unknown cell type');
 aMemo.Lines.Add(s);
 end;
 end;
 finally
 xls.Free;
 end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 ReadExcelFile(Memo1);
end;

4.操作文件 

TElExcellFile.InsertAndCopyRange方法来插入行、列或单元格范围。同样也适用于复制单元格范围、单元格、整行或整列。或者在单个操作中插入和复制单元格/列/行(就像在Excel中按下“复制/粘贴已复制的单元格”一样)。它还可以从一个工作表复制单元格到同一个工作表、另一个工作表,甚至是另一个文件中的工作表。

使用TElExcellFile.DeleteRange来删除单元格范围、整行或整列。

将文件保存为“报告.模板.xlsx”在“文档”文件夹中

创建一个新的控制台应用程序,将其保存为“CustomerReport”,并粘贴以下代码:

使用TElExcellFile.MoveRange来移动一个范围、整行或整列从一个位置到另一个位置。

使用TElExcelFile.DeleteSheet来删除一个工作表。

5.创建报告

1.,取表字段值<#Table.FieldName>如<#Customer.Name>

2.列表时要设置步骤如下:“公式”选项卡“->"名称管理器"(Excel2003中菜单,插入,名称,定义)

3.创建一个Customer指向="sheet1!$A$1",该名称不分大小写。它需要以二个下划线(“__”)并以二个下划线结束("__").

6.文件导出为PDF

uses ..., VCL.FlexCel.Core, FlexCel.XlsAdapter, FlexCel.Render;...
procedure ExportToPdf(const InFile, OutFile: string);
var 
xls: TXlsFile; 
pdf: TFlexCelPdfExport;
begin 

xls := TXlsFile.Create(InFile); 
try 
pdf := TFlexCelPdfExport.Create(xls, true); 
try pdf.Export(OutFile); 
finally 
pdf.Free; 
end; 
finally 
xls.Free; 
end;
end;

7.导出Html

uses ..., VCL.FlexCel.Core, FlexCel.XlsAdapter, FlexCel.Render;...

procedure ExportToHtml(const InFile, OutFile: string);
var 
xls: TXlsFile; 
html: TFlexCelHtmlExport;
begin 

xls := TXlsFile.Create(InFile); 
try 
html := TFlexCelHtmlExport.Create(xls, true); 
try 
html.Export(OutFile, ''); 
finally 
html.Free; 
end; 
finally 
xls.Free; 
end;
end;

二、开发指南。

1.数组和单元格

为了保持与Excel OLE自动化兼容的语法,大多数FlexCel索引/数组都是从1开始的。

2。单元格格式(*单元格格式->行格式->列格式)

3.日期单元格(TExcelFile.GetCellValue 将返回一个 TCellValue 记录,而 TCellValue 有一个 ValueType,它可以 是类型 TCellValueType.DateTime。)

三、开始使用FlexCel

为了使用FlexCel,首先要做的是在uses子句中添加FlexCel。有8个单元你可以使用:VCL.FlexCel.Core、FMX.FlexCel.Core、SKIA.FlexCel.Core、FlexCel.Core、FlexCel.XlsAdapter、FlexCel.Render、FlexCel.Pdf和FlexCel.Report。

FlexCel.Core 是平台无关的,因此使用它的单元将在 FireMonkey、VCL 和 Linux 中工作。

1.打开与保存

默认情况下,FlexCel不会覆盖已存在的文件。因此,在保存之前,您总是必须调用File.Delete方法,或者设置TExcelFile.AllowOverWritingFiles属性为true。在这个例子中,我们在创建对象的行中设置了AllowOverWritingFiles = true:xls := TXlsFile.Create(true)。

2插入、复制和移动单元格/行/列以及工作表

InsertAndCopySheets:插入和/或复制一个工作表。使用此方法来添加一个新的空工作表。

DeleteSheet:从文件中删除多张工作表。

ClearSheet:清除工作表中的所有内容,但保留其位置。

3.自动调整行和列

如果你使用的是XlsFile,你可以使用XlsFile.Autofit…方法来完成这个操作。如果你使用的是FlexCelReport,可以使用<#Row Height(Autofit)>和<#Column Width(Autofit)>标签来自动调整你想要的行或列。

4.自动调整合并单元格

FlexCel默认会使用合并单元格的最后一行的自动调整功能,因为在我们的经验中,这通常是您所需要的。但是,您可以通过在调用“Autofit”方法时更改参数“autofitMerged”来改变这种行为,或者,如果您正在使用报表,可以使用<#Autofit settings>标签来实现这一点。

5.智能分页

您需要通过调用TExcelFile.KeepRowsTogether或TExcelFile.KeepColsTogether来指定您希望保持在一起的行或列,一旦您完成创建文件后,调用TExcelFile.AutoPageBreaks对整个文档进行分页,并在尽可能保持行和列在一起的情况下创建分页符。

6.寡妇/孤儿问题

在这个例子中,第4页几乎是空的,因为上面只有当前组的两行数据,下一组从下一页开始。

当一页上写的字很少时,你通常会希望在同一页开始下一组内容,而不是留下一张空白的纸。

您可以在调用AutoPageBreaks时使用FlexCel中的“PercentOfUsedSheet”参数来控制这一点。PercentOfUsedSheet的默认值为20,这意味着为了添加分页符,页面必须至少填充20%。

在上面的示例中,不会在第四页进行分页,因为该页的20%尚未使用,因此下一组也将从第4页开始。如果您将“PercentOfUsedSheet”参数设置为0%,则不会有孤儿控制,下一组将在第5页开始,无论第4页是否只有一行。

将“PercentOfUsedSheet”设置为100%意味着完全不控制孤行和寡列,因为要设置分页符,必须使用页面100%的空间,所以FlexCel没有添加分页符的余地。它无法在页面100%之前设置分页符,因此所有分页符都将设置在最后一行,也无法保持任何行在一起。建议您将“PercentOfUsedSheet”参数保持在约20%左右。

7.不同的打印机问题

稍微减少页面高度可能会导致最后一行的内容无法在该页面上打印出来,而是被打印在下一页上。由于FlexCel在那一行之后自动添加了一个分页符(以便正确地根据它用于计算的30厘米进行分页),最终你得到的是一页只有一个单元格的空白页。

为了解决这个问题,AutoPageBreaks 的第二个参数是 FlexCel 将用于计算分页的页面百分比。它的默认值是 95%,这意味着它将一个 30 厘米高的页面视为 30*0.95=28.5 厘米,并据此为该工作表计算分页。

8.调试智能分页

我们希望每个十年都保持在各自页面上,如果做不到,至少保持每张完整的专辑在一起。为此,我们可以定义以下保持在一起的区间:

第1至15行,第一级第16至22行,第一级第2至8行,第二级第9至15行,第二级第17至22行,第二级

当然,上面的代码并不是您在正常使用中设置智能分页符的方式。在实际代码中,您将使用某种循环,或者插入和复制行,或者在报告中设置保持在一起的区域。但是一旦完成,效果类似于手动调用TExcelFile.KeepRowsTogether并传递上述值。

xls.KeepRowsTogether(1, 15, 1, false); 将第1行和第15行之间的所有行作为一个单元格进行处理。xls.KeepRowsTogether(16, 22, 1, false); 将第16行和第22行之间的所有行作为一个单元格进行处理。xls.KeepRowsTogether(2, 8, 2, false); 将第2行和第8行之间的所有行作为一个单元格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1918399.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7 新增yum源

背景&#xff1a;原来的yum源&#xff0c;无法下载yum包了。新增一个阿里云的&#xff08;网易163的源失效了&#xff0c;无法使用&#xff09; Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was …

PyCharm 2023.3.2 关闭时一直显示正在关闭项目

文章目录 一、问题描述二、问题原因三、解决方法 一、问题描述 PyCharm 2023.3.2 关闭时一直显示正在关闭项目 二、问题原因 因为PyCharm还没有加载完索引导致的 三、解决方法 方法一&#xff1a; 先使用任务管理器强制关闭&#xff0c;下次关闭时注意要等待PyCharm加载完索…

AI软件测试工程师需要学习什么,怎么学习

对于已经从事软件测试工作的人来说真是需要补充的是以下部分的内容 1.AI概念和原理:了解人工智能的基本概念、发展历史、应用领域等 对应内容 https://cloud.baidu.com/article/31805742.机器学习基础知识:学习机器学习的基本概念、算法和框架&#xff0c;如线性回归、迈辑回归…

第一次参加数学建模竞赛新手小白备赛经验贴

2024年暑假已经来临&#xff0c;下半年的数学建模竞赛非常多&#xff0c;许多同学可能是第一次参赛&#xff0c;对于如何准备感到迷茫和无从下手。在这种情况下&#xff0c;我们将分享一些备赛的小技巧&#xff0c;帮助大家在这个暑假更好的入门&#xff0c;即便是零基础的小白…

计算机视觉之ShuffleNet图像分类

前言 ShuffleNetV1是一种计算高效的CNN模型&#xff0c;旨在在移动端利用有限的计算资源达到最佳的模型精度。其设计核心是引入了Pointwise Group Convolution和Channel Shuffle两种操作&#xff0c;以降低模型的计算量并保持精度。与MobileNet类似&#xff0c;ShuffleNetV1通…

【Docker系列】Docker 镜像源:优化你的容器化开发流程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

第18章 概率潜在语义分析:课后习题

本章概要&#xff1a; 1.概率潜在语义分析是利用概率生成模型对文本集合进行话题分析的方法。概率潜在语义分析受潜在语义分析的启发提出两者可以通过矩阵分解关联起来。 给定一个文本集合&#xff0c;通过概率潜在语义分析&#xff0c;可以得到各个文本生成话题的条件概率分布…

WebDriver与浏览器通信的深度剖析与探索

在自动化测试的世界里&#xff0c;WebDriver无疑是连接测试脚本与浏览器之间的桥梁&#xff0c;它让复杂的自动化测试成为可能。本文将深入探讨WebDriver与浏览器之间的通信机制&#xff0c;揭示它们之间如何协同工作&#xff0c;以及这一过程中涉及的关键技术和挑战。 一、We…

2493-04A-6 同轴连接器

型号简介 2493-04A-6是Southwest Microwave的连接器。该连接器是一种端子连接器&#xff0c;采用 1.0 毫米插头&#xff08;公头&#xff09;进行连接。它由多个部件组成&#xff0c;包括过渡块、接地板、螺纹夹紧板、发射针、冷板、底座、电路板和外壳等。 型号特点 外壳&…

stm32——AD采集以及DMA

今天继续我们的STM32的内容学习&#xff0c;我使用的单片机是STM32F103VCT6,通过Keil Array Visualization软件来观测AD采样出来的波形。先来看看本次实验用到的硬件知识。 首先是ADC&#xff08;Analog-to-Digital Converter&#xff09;是模拟信号转数字信号的关键组件&#…

[Linux]五种IO模型(图文讲解+故事讲解)

目录 一、对IO的理解&#xff1a;等拷贝 等 拷贝 二、五种IO模型&#xff08;解释其概念&#xff09; 1.阻塞IO 2.非阻塞IO 3.信号驱动IO 4.IO多路复用 5.异步IO IO速度比较 三、一个故事让你了解五种IO模型 四、同步VS异步 阻塞VS非阻塞 同步VS异步 阻塞VS非阻…

常用录屏软件,分享这四款宝藏软件!

在数字化时代&#xff0c;录屏软件已经成为我们日常工作、学习和娱乐中不可或缺的工具。无论你是需要录制教学视频、游戏过程&#xff0c;还是进行产品演示&#xff0c;一款高效、易用的录屏软件都能让你的工作事半功倍。今天&#xff0c;就为大家揭秘四款宝藏级录屏软件&#…

深度|不同数据系统中的“一致性”(Consistency)含义的区别

“你们的系统能实现强一致性吗&#xff1f;”作为过去几年一直在开发流处理系统的从业者&#xff0c;我经常被问到这个问题。我时常想自信地推销我们的产品&#xff0c;但现实情况是&#xff0c;回答这个问题并不简单。其中的挑战并不在于问题本身&#xff0c;而在于 “一致性”…

【芯片方案】珠宝手机秤方案

珠宝手机秤作为一种便携式电子称重设备&#xff0c;因其小巧、便携、精度高等特点&#xff0c;广泛应用于各种需要精确称重的场景。可能这个目前在国内使用的人比较少&#xff0c;但在西方国家珠宝手机秤却是可以用来送礼的物品。因为珠宝手机秤的外观跟手机外观大多相似&#…

【数据结构】排序——快速排序

前言 本篇博客我们继续介绍一种排序——快速排序&#xff0c;让我们看看快速排序是怎么实现的 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 …

Python高级(三)_正则表达式

Python高级-正则表达式 第三章 正则表达式 在开发中会有大量的字符串处理工作,其中经常会涉及到字符串格式的校验。 1、正则表达式概述 正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、…

springboot企业培训管理系统-计算机毕业设计源码50804

摘要 本研究旨在开发一套高效、安全、易用的springboot企业培训管理系统。该系统致力于提升企业的培训管理效率&#xff0c;确保培训质量与效果的持续优化。通过整合先进的AI技术&#xff0c;在企业培训管理中发挥着不可或缺的作用。 通过采用Java作为主要开发语言&#xff0c;…

AI Earth——2020年中国建筑物高度CNBH数据产品(10m)

数据介绍: 复旦大学生命科学学院GC3S团队(吴万本博士、赵斌教授等)利用多源地球观测数据和机器学习技术,构建了中国第一个10米分辨率的建筑高度估计模型(CNBH-10m)。基于此模型建立了中国10米分辨率的建筑高度数据集。此数据集基于全天候地球观测(雷达、光学和夜光图像)…

USB PD SINK协议取电芯片不同品牌介绍对比-在选择PD SINK 协议芯片时,用户需要综合考虑各方面的因素,包括工作耐压、稳定性、兼容性等

PD SINK协议芯片是现代通信技术中的一项重要技术&#xff0c;它起着连接不同系统的桥梁作用。协议芯片内部集成了各种不同的通信协议&#xff0c;如蓝牙、Wi-Fi、以太网等&#xff0c;使不同设备之间的通信变得更加简单和高效。协议芯片推动了信息通信技术的发展。在过去&#…

赋能 Web3 与 AI 的未来,TARS 协议如何重塑去中心化生态?

TARS 协议如何在 Web3 生态中引领 AI 技术的变革&#xff1f;作为新兴的模块化 AI 平台&#xff0c;TARS 通过整合先进的 AI 模型和区块链技术&#xff0c;为用户提供了更加智能、安全和高效的解决方案。让我们一起回顾第 16 期 TinTinAMA 的精彩内容吧&#xff01; 在 TinTinL…