Aspose.Cells 8.5.0中的公共API更改

添加的 API

改变了ICustomFunction.CalculateCustomFunction的参数

如果自定义函数的一个参数是单元格引用,在旧版本的Aspose.Cells API中,会将单元格引用转换为单个单元格值或所引用区域中所有单元格值的对象数组。然而,对于许多函数和用户来说,并不需要所引用区域中所有单元格的值数组,他们只需要与公式位置对应的单个单元格,或者只需要引用本身而不是单元格值或值数组。对于某些情况,获取所有单元格值甚至增加了循环引用错误的风险。

为了支持这种需求,Aspose.Cells for .NET 8.5.0已经将"paramsList"参数值更改为引用区域。自v8.5.0以来,当对应的参数是引用或其计算结果是引用时,API会将ReferredArea对象放入"paramsList"中。如果需要引用本身,您可以直接使用ReferredArea。如果需要从引用与公式位置相对应的单个单元格值,可以使用ReferredArea.GetValue(rowOffset, int colOffset)方法。如果需要整个区域的单元格值数组,则可以使用ReferredArea.GetValues方法。

现在,由于Aspose.Cells for .NET 8.5.0在"paramsList"中提供了ReferredArea,因此"contextObjects"中的ReferredAreaCollection将不再需要(在旧版本中它并不总是与自定义函数的参数一一对应),因此该版本现在已将其从"contextObjects"中移除。

这种变化需要在ICustomFunction的实现代码中稍微做一些更改,当您需要引用参数的值/值时。

旧的实现

 public object CalculateCustomFunction(string functionName, ArrayList paramsList, ArrayList contextObjects)

{

    ...

    object o = paramsList[i];

    if (o is Array)

    {

        ...

    }

    else if...

    ...

}

新的实现

 public object CalculateCustomFunction(string functionName, ArrayList paramsList, ArrayList contextObjects)

{

    ...

    object o = paramsList[i];

    if(o is ReferredArea) //fetch data from reference

    {

        ReferredArea ra = (ReferredArea)o;

        if(ra.IsArea)

        {

            o = ra.GetValues();

        }

        else

        {

            o = ra.GetValue(0, 0);

        }

    }

    if (o is Array)

    {

        ...

    }

    else if...

    ...

}

添加了CalculationOptions类

Aspose.Cells for .NET 8.5.0已公开了CalculationOptions类,以增加公式计算引擎的灵活性和可扩展性。新增的类具有以下属性。

  1. CalculationOptions.CalcStackSize:指定递归计算单元格的堆栈大小。-1指定计算将使用相应工作簿的WorkbookSettings.CalcStackSize。
  2. CalculationOptions.CustomFunction:扩展公式计算引擎的自定义公式。
  3. CalculationOptions.IgnoreError:布尔类型值表示在计算公式时是否需要隐藏错误,其中错误可能是由于不受支持的函数、外部链接等。
  4. CalculationOptions.PrecisionStrategy:CalculationPrecisionStrategy类型的值,用于指定计算精度处理策略。

添加了Enumeration CalculationPrecisionStrategy

Aspose.Cells for .NET 8.5.0已公开了CalculationPrecisionStrategy枚举,以增加公式计算引擎的灵活性,以获得期望的结果。该枚举策略计算精度处理。由于IEEE 754浮点算术的精度问题,一些看似简单的公式可能无法计算出预期的结果,因此最新的API版本已公开了以下字段,以根据选择获取所需的结果。

  1. CalculationPrecisionStrategy.Decimal: 尽可能使用十进制作为操作数,从性能上考虑最为低效。
  2. CalculationPrecisionStrategy.Round: 根据有效数字四舍五入计算结果。
  3. CalculationPrecisionStrategy.None: 不应用任何策略,因此在计算过程中引擎使用原始双精度值作为操作数,并直接返回结果。此选项最为有效,在大多数情况下都适用。

新增用于使用CalculationOptions的方法。

随着v8.5.0的发布,Aspose.Cells API已经增加了CalculateFormula方法的重载版本,如下所列。

  • Workbook.CalculateFormula(CalculationOptions)
  • Worksheet.CalculateFormula(CalculationOptions options, bool recursive)
  • Cell.Calculate(CalculationOptions)

添加了PasteType.RowHeights枚举字段

Aspose.Cells API为复制范围时复制行高提供了PasteType.RowHeights枚举字段。当将PasteOptions.PasteType属性设置为PasteType.RowHeights时,将会复制源范围内所有行的高度到目标范围。

C#

 //Create workbook object

Workbook workbook = new Workbook();

//Source worksheet

Worksheet srcSheet = workbook.Worksheets[0];

//Add destination worksheet

Worksheet dstSheet = workbook.Worksheets.Add("Destination Sheet");

//Set the row height of the 4th row

//This row height will be copied to destination range

srcSheet.Cells.SetRowHeight(3, 50);

//Create source range to be copied

Range srcRange = srcSheet.Cells.CreateRange("A1:D10");

//Create destination range in destination worksheet

Range dstRange = dstSheet.Cells.CreateRange("A1:D10");

//PasteOptions, we want to copy row heights of source range to destination range

PasteOptions opts = new PasteOptions();

opts.PasteType = PasteType.RowHeights;

//Copy source range to destination range with paste options

dstRange.Copy(srcRange, opts);

//Write informative message in cell D4 of destination worksheet

dstSheet.Cells["D4"].PutValue("Row heights of source range copied to destination range");

//Save the workbook in xlsx format

workbook.Save("output.xlsx", SaveFormat.Xlsx);

添加了SheetRender.PageScale属性

当您使用 按 n 页宽 x m 页高缩放 选项进行页面设置缩放时,Microsoft Excel会计算页面设置缩放系数。使用Aspose.Cells for .NET 8.5.0公开的SheetRender.PageScale属性也可以实现相同的效果。该属性返回一个double值,可以转换为百分比值。例如,如果它返回0.507968245,那么缩放因子就是51%。

C#

 //Create workbook object

Workbook workbook = new Workbook();

//Access first worksheet

Worksheet worksheet = workbook.Worksheets[0];

//Put some data in these cells

worksheet.Cells["A4"].PutValue("Test");

worksheet.Cells["S4"].PutValue("Test");

//Set paper size

worksheet.PageSetup.PaperSize = PaperSizeType.PaperA4;

//Set fit to pages wide as 1

worksheet.PageSetup.FitToPagesWide = 1;

//Calculate page scale via sheet render

SheetRender sr = new SheetRender(worksheet, new ImageOrPrintOptions());

//Convert page scale double value to percentage

string strPageScale = sr.PageScale.ToString("0%");

//Write the page scale value

Console.WriteLine(strPageScale);

添加了枚举CellValueFormatStrategy

Aspose.Cells for .NET 8.5.0已添加一个新的Cell值格式策略枚举以处理需要提取带有或不带有应用格式的单元格值的情况。CellValueFormatStrategy枚举具有以下字段。

  1. CellValueFormatStrategy.CellStyle: 仅使用单元格的原始格式进行格式化。
  2. CellValueFormatStrategy.DisplayStyle: 使用单元格的显示样式进行格式化。
  3. CellValueFormatStrategy.None: 无格式。

添加了Cell.GetStingValue方法

为了使用CellValueFormatStrategy枚举,v8.5.0公开了Cell.GetStingValue方法,该方法可以接受一个CellValueFormatStrategy类型的参数,返回的值取决于指定的选项。

下面的代码片段显示了如何使用新公开的Cells.GetStingValue方法。

C#

 //Create workbook

Workbook workbook = new Workbook();

//Access first worksheet

Worksheet worksheet = workbook.Worksheets[0];

//Access cell A1

Cell cell = worksheet.Cells["A1"];

//Put value inside the cell

cell.PutValue(0.012345);

//Format the cell that it should display 0.01 instead of 0.012345

Style style = cell.GetStyle();

style.Number = 2;

cell.SetStyle(style);

//Get string value as Cell Style

string value = cell.GetStingValue(CellValueFormatStrategy.CellStyle);

Console.WriteLine(value);

//Get string value without any formatting

value = cell.GetStingValue(CellValueFormatStrategy.None);

Console.WriteLine(value);

添加了ExportTableOptions.FormatStrategy属性

Aspose.Cells for .NET 8.5.0已为希望将数据导出到带有或不带有格式的DataTable的用户公开了ExportTableOptions.FormatStrategy属性。此属性利用CellValueFormatStrategy枚举并根据指定选项导出数据。

以下代码解释了ExportTableOptions.FormatStrategy属性的用法。

C#

 //Create workbook

Workbook workbook = new Workbook();

//Access first worksheet

Worksheet worksheet = workbook.Worksheets[0];

//Access cell A1

Cell cell = worksheet.Cells["A1"];

//Put value inside the cell

cell.PutValue(0.012345);

//Format the cell that it should display 0.01 instead of 0.012345

Style style = cell.GetStyle();

style.Number = 2;

cell.SetStyle(style);

//Print the cell values as it displays in excel

Console.WriteLine("Cell String Value: " + cell.StringValue);

//Print the cell value without any format

Console.WriteLine("Cell String Value without Format: " + cell.StringValueWithoutFormat);

//Export Data Table Options with FormatStrategy as CellStyle

ExportTableOptions opts = new ExportTableOptions();

opts.ExportAsString = true;

opts.FormatStrategy = CellValueFormatStrategy.CellStyle;

//Export Data Table

DataTable dt = worksheet.Cells.ExportDataTable(0, 0, 1, 1, opts);

//Print the value of very first cell

Console.WriteLine("Export Data Table with Format Strategy as Cell Style: " + dt.Rows[0][0].ToString());

//Export Data Table Options with FormatStrategy as None

opts.FormatStrategy = CellValueFormatStrategy.None;

dt = worksheet.Cells.ExportDataTable(0, 0, 1, 1, opts);

//Print the value of very first cell

Console.WriteLine("Export Data Table with Format Strategy as None: " + dt.Rows[0][0].ToString());