Flexcel学习笔记

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行之间的所有行作为一个单元格

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件模块的初始化

什么是初始化&#xff1f; 软件的初始化&#xff08;Initialization&#xff09;是指软件启动或重新配置时执行的一系列步骤和过程&#xff0c;旨在准备软件运行环境、加载必要的配置信息、检查系统依赖项、分配资源&#xff08;如内存、文件句柄等&#xff09;&#xff0c;以及…

小白学python(第七天)

哈哈&#xff0c;这个系列的文章也有一段时间没更新&#xff0c;主要是最近在忙c嘎嘎&#xff0c;不过没事接下来会优先更python啦&#xff0c;那么我们先进入正题吧 函数的定义及调用 函数定义 格式&#xff1a;def 函数名&#xff08;形参列表&#xff09;&#xff1a; 语…

ctfshow-web入门-php特性(web100-web103)is_numeric 函数绕过

目录 1、web100 2、web101 3、web102 4、web103 1、web100 提示&#xff1a;flag in class ctfshow&#xff0c;我们只需要构造输出 ctfshow 这个类即可。 代码分析&#xff1a; $v0is_numeric($v1) and is_numeric($v2) and is_numeric($v3); if($v0){ 虽然逻辑运算符的…

Web浏览器485通讯读取RFID卡号js JavaScript

本示例使用设备&#xff1a;485通讯液显带键盘RFID打菲计件读卡器工位机串口可二次开发编程-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …

C++知识点:C和C++(自用)

C和C 1.类和结构体的关系&#xff1a;2.面向对象和面向过程3.头文件和标准命名空间4.cin和cout5. const在C中和C中的区别6.const全局作用域7 new和delete8 内联函数9 函数重载10. 函数重载的匹配 引用&#xff1a; [1]C语言中文网 1.类和结构体的关系&#xff1a; 类是结构体的…

vue3实现无缝滚动列表(大屏数据轮播场景)

实现思路 vue3目前可以通过第三方组件来实现这个需求。 下面介绍一下这个第三方滚动组件--vue3-scroll-seamless vue3-scroll-seamless 是一个用于 Vue 3 的插件&#xff0c;用于实现无缝滚动的组件。它可以让内容在水平或垂直方向上无缝滚动&#xff0c;适用于展示轮播图、新…

值得关注的数据资产入表

不错的讲解视频&#xff0c;来自&#xff1a;第122期-杜海博士-《数据资源入表及数据资产化》-大数据百家讲坛-厦门大学数据库实验室主办第122期-杜海博士-《数据资源入表及数据资产化》-大数据百家讲坛-厦门大学数据库实验室主办-20240708_哔哩哔哩_bilibili

深度学习和NLP中的注意力和记忆

深度学习和NLP中的注意力和记忆 文章目录 一、说明二、注意力解决了什么问题&#xff1f;#三、关注的代价#四、机器翻译之外的关注#五、注意力&#xff08;模糊&#xff09;记忆&#xff1f;# 一、说明 深度学习的最新趋势是注意力机制。在一次采访中&#xff0c;现任 OpenAI 研…

接口基础知识2:http通信的组成

课程大纲 一、http协议 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网中被使用最广的一种网络协议&#xff0c;用于客户端与服务器之间的通信。 HTTP协议定义了一系列的请求方法&#xff0c;例如 GET、POST、PUT、DELETE 等&…

[线性RNN系列] Mamba: S4史诗级升级

前言 iclr24终于可以在openreview上看预印本了 这篇&#xff08;可能是颠覆之作&#xff09;文风一眼c re组出品&#xff1b;效果实在太惊艳了&#xff0c;实验相当完善&#xff0c;忍不住写一篇解读分享分享。 TL;DR &#xff08;overview&#xff09; Structured State-Sp…

代码随想录算法训练营Day21 | 669. 修剪二叉搜索树 | 108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树

今日任务 669. 修剪二叉搜索树 题目链接&#xff1a; https://leetcode.cn/problems/trim-a-binary-search-tree/description/题目描述&#xff1a; Code class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if(root nullptr){return root;…

virtualbox的ubuntu默认ipv4地址为10.0.2.15的修改以及xshell和xftp的连接

virtualbox安装Ubuntu后&#xff0c;默认的地址为10.0.2.15 我们查看virtualbox的设置发现是NAT 学过计算机网络的应该了解NAT技术&#xff0c;为了安全以及缓解ip使用&#xff0c;我们留了部分私有ip地址。 私有IP地址网段如下&#xff1a; A类&#xff1a;1个A类网段&…

GuLi商城-商品服务-API-品牌管理-JSR303自定义校验注解

自定义注解规则: 可以参考@NotNull注解 package com.nanjing.common.valid;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target;i…

MATLAB激光通信和-积消息传递算法(Python图形模型算法)模拟调制

&#x1f3af;要点 &#x1f3af;概率论和图论数学形式和图结构 | &#x1f3af;数学形式、图结构和代码验证贝叶斯分类器算法&#xff1a;&#x1f58a;多类型&#xff1a;朴素贝叶斯&#xff0c;求和朴素贝叶斯、高斯朴素贝叶斯、树增强贝叶斯、贝叶斯网络增强贝叶斯和半朴素…

Java性能优化-switch性能优化-用String还是int做比较

场景 Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化&#xff1a; Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_java热点函数-CSDN博客 参考以上性能测试工具的使用。 下面针对Java中对switch-case比较时…

Prometheus 云原生 - 基于 file_sd、http_sd 实现 Service Discovery

目录 开始 为什么需要服务发现机制 File Service Discovery&#xff08;file_sd&#xff09; 基本概念 配置方式 使用案例 HTTP Service Discovery&#xff08;http_sd&#xff09; 基本概念 配置方式 使用案例 开始 为什么需要服务发现机制 我们知道在 Prometheus …

Java核心篇之JVM探秘:垃圾回收算法与垃圾收集器

系列文章目录 第一章 Java核心篇之JVM探秘&#xff1a;内存模型与管理初探 第二章 Java核心篇之JVM探秘&#xff1a;对象创建与内存分配机制 第三章 Java核心篇之JVM探秘&#xff1a;垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战&#xff1a;Arthas工具使用及…

VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解决方法

错误信息 TypeError: Cannot convert a BigInt value to a number at Math.pow vue 或 react package.json添加 "browserslist": {"production": ["chrome > 67","edge > 79","firefox > 68","opera >…

Go语言---TCP服务端以及客服端的实现

TCP的C/S架构 TCP服务器的实现 监听的底层实现 func Listen(network, address string) (Listener, error) {var lc ListenConfigreturn lc.Listen(context.Background(), network, address) }type Listener interface {// Accept waits for and returns the next connection …

每日Attention学习10——Scale-Aware Modulation

模块出处 [ICCV 23] [link] [code] Scale-Aware Modulation Meet Transformer 模块名称 Scale-Aware Modulation (SAM) 模块作用 改进的自注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as Fclass SAM(nn.Module):def __init__…