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