Spire.Office 7.1 is released

2022-01-25 09:15:50

We are excited to announce the release of Spire.Office 7.1. This version brings some new features, for example, Spire.Presentation supports creating "BoxAndWhisker" chart, "Funnel" chart. "Histogram" chart, "Pareto" chart, "SunBurst" chart, "TreeMap" chart, "WaterFall" chart;Spire.XLS supports setting Html string for cell range, adding conditional formatting for the existing PivotTable and file stream to IsPasswordProtected(), also supports getting the linked cell name of IprstGeomShape, as well as supports calculating a single sheet or a cell range; Spire.Doc enhances the conversion from Word to PDF and HTML to Word. Meanwhile, a lot of bugs have been successfully fixed. More details are listed as follow.

In this version, the most recent versions of Spire.Doc, Spire.PDF, Spire.XLS, Spire.Presentation, Spire.Email, Spire.DocViewer, Spire.PDFViewer, Spire.Spreadsheet, Spire.OfficeViewer, Spire.DataExport, Spire.Barcode are included.

DLL Versions:

  • Spire.License.dll 1.4.0
  • Spire.Barcode.dll 6.1.1
  • Spire.Email.dll 5.1.0
  • Spire.DataExport.dll 4.1.9
  • Spire.Pdf.dll 8.1.6
  • Spire.PdfViewer.Forms.dll 7.1.4
  • Spire.Doc.dll 10.1.11
  • Spire.DocViewer.Forms.dll 7.1.1
  • Spire.Presentation.dll 7.1.4
  • Spire.Spreadsheet.dll 6.1.3
  • Spire.XLS.dll 12.1.7
  • Spire.OfficeViewer.Forms.dll 7.1.4
Click the link to get the version Spire.Office 7.1:
More information of Spire.Office new release or hotfix:

Here is a list of changes made in this release

Spire.Presentation

Category ID Description
New feature SPIREPPT-1163 Supports creating "BoxAndWhisker" chart.
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.BoxAndWhisker, new RectangleF(50, 50, 500, 400), false);
string[] seriesLabel = { "Series 1", "Series 2", "Series 3" };
for (int i = 0; i < seriesLabel.Length; i++)
{
    chart.ChartData[0, i + 1].Text = "Series 1";
}
string[] categories = {"Category 1", "Category 1", "Category 1", "Category 1", "Category 1", "Category 1", "Category 1",
                "Category 2", "Category 2", "Category 2", "Category 2", "Category 2", "Category 2",
                "Category 3", "Category 3", "Category 3", "Category 3", "Category 3"};
for (int i = 0; i < categories.Length; i++)
{
    chart.ChartData[i + 1, 0].Text = categories[i];
}
double[,] values = new double[18, 3]{{-7,-3,-24},{-10,1,11},{-28,-6,34},{47,2,-21},{35,17,22},{-22,15,19},{17,-11,25},
                            {-30,18,25},{49,22,56},{37,22,15},{-55,25,31},{14,18,22},{18,-22,36},{-45,25,-17},
                            {-33,18,22},{18,2,-23},{-33,-22,10},{10,19,22}};
for (int i = 0; i < seriesLabel.Length; i++)
{
    for (int j = 0; j < categories.Length; j++)
    {
        chart.ChartData[j + 1, i + 1].NumberValue = values[j, i];
    }
}
chart.Series.SeriesLabel = chart.ChartData[0, 1, 0, seriesLabel.Length];
chart.Categories.CategoryLabels = chart.ChartData[1, 0, categories.Length, 0];
chart.Series[0].Values = chart.ChartData[1, 1, categories.Length, 1];
chart.Series[1].Values = chart.ChartData[1, 2, categories.Length, 2];
chart.Series[2].Values = chart.ChartData[1, 3, categories.Length, 3];
chart.Series[0].ShowInnerPoints = false;
chart.Series[0].ShowOutlierPoints = true;
chart.Series[0].ShowMeanMarkers = true;
chart.Series[0].ShowMeanLine = true;
chart.Series[0].QuartileCalculationType = QuartileCalculation.ExclusiveMedian;
chart.Series[1].ShowInnerPoints = false;
chart.Series[1].ShowOutlierPoints = true;
chart.Series[1].ShowMeanMarkers = true;
chart.Series[1].ShowMeanLine = true;
chart.Series[1].QuartileCalculationType = QuartileCalculation.InclusiveMedian;
chart.Series[2].ShowInnerPoints = false;
chart.Series[2].ShowOutlierPoints = true;
chart.Series[2].ShowMeanMarkers = true;
chart.Series[2].ShowMeanLine = true;
chart.Series[2].QuartileCalculationType = QuartileCalculation.ExclusiveMedian;
chart.HasLegend = true;
chart.ChartTitle.TextProperties.Text = "BoxAndWhisker";
chart.ChartLegend.Position = ChartLegendPositionType.Top;
ppt.SaveToFile(outputFile, FileFormat.Pptx2013);
ppt.Dispose();
New feature SPIREPPT-1163 Supports creating "Funnel" chart.
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.Funnel, new RectangleF(50, 50, 550, 400), false);
chart.ChartData[0, 1].Text = "Series 1";
string[] categories = { "Website Visits	", "Download", "Uploads", "Requested price", "Invoice sent", "Finalized" };
for (int i = 0; i < categories.Length; i++)
{
    chart.ChartData[i + 1, 0].Text = categories[i];
}
double[] values = { 50000, 47000, 30000, 15000, 9000, 5600 };
for (int i = 0; i < values.Length; i++)
{
    chart.ChartData[i + 1, 1].NumberValue = values[i];
}
chart.Series.SeriesLabel = chart.ChartData[0, 1, 0, 1];
chart.Categories.CategoryLabels = chart.ChartData[1, 0, categories.Length, 0];
chart.Series[0].Values = chart.ChartData[1, 1, values.Length, 1];
chart.ChartTitle.TextProperties.Text = "Funnel";
ppt.SaveToFile(outputFile, FileFormat.PPT);
ppt.Dispose();
New feature SPIREPPT-1163 Supports creating "Histogram" chart.
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.Histogram, new RectangleF(50, 50, 500, 400), false);
chart.ChartData[0, 0].Text = "Series 1";
double[] values = { 1, 1, 1, 3, 3, 3, 3, 5, 5, 5, 8, 8, 8, 9, 9, 9, 12, 12, 13, 13, 17, 17, 17, 19, 19, 19, 25, 25, 25, 25, 25, 25, 25, 25, 29, 29, 29, 29, 32, 32, 33, 33, 35, 35, 41, 41, 44, 45, 49, 49 };
for (int i = 0; i < values.Length; i++)
{
    chart.ChartData[i + 1, 1].NumberValue = values[i];
}
chart.Series.SeriesLabel = chart.ChartData[0, 0, 0, 0];
chart.Series[0].Values = chart.ChartData[1, 0, values.Length, 0];
chart.PrimaryCategoryAxis.NumberOfBins = 7;
chart.PrimaryCategoryAxis.GapWidth = 20;
chart.ChartTitle.TextProperties.Text = "Histogram";
chart.ChartLegend.Position = ChartLegendPositionType.Bottom;
ppt.SaveToFile(outputFile, FileFormat.PPT);
New feature SPIREPPT-1163 Supports creating "Pareto" chart.
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.Pareto, new RectangleF(50, 50, 500, 400), false);
chart.ChartData[0, 1].Text = "Series 1";
string[] categories = { "Category 1", "Category 2", "Category 4", "Category 3", "Category 4", "Category 2", "Category 1",
    "Category 1", "Category 3", "Category 2", "Category 4", "Category 2", "Category 3",
    "Category 1", "Category 3", "Category 2", "Category 4", "Category 1", "Category 1",
    "Category 3", "Category 2", "Category 4", "Category 1", "Category 1", "Category 3",
    "Category 2", "Category 4", "Category 1"};
for (int i = 0; i < categories.Length; i++)
{
    chart.ChartData[i + 1, 0].Text = categories[i];
}
double[] values = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
for (int i = 0; i < values.Length; i++)
{
    chart.ChartData[i + 1, 1].NumberValue = values[i];
}
chart.Series.SeriesLabel = chart.ChartData[0, 1, 0, 1];
chart.Categories.CategoryLabels = chart.ChartData[1, 0, categories.Length, 0];
chart.Series[0].Values = chart.ChartData[1, 1, values.Length, 1];
chart.PrimaryCategoryAxis.IsBinningByCategory = true;
chart.Series[1].Line.FillFormat.FillType = FillFormatType.Solid;
chart.Series[1].Line.FillFormat.SolidFillColor.Color = Color.Red;
chart.ChartTitle.TextProperties.Text = "Pareto";
chart.HasLegend = true;
chart.ChartLegend.Position = ChartLegendPositionType.Bottom;
ppt.SaveToFile(outputFile, FileFormat.PPT);
ppt.Dispose();
New feature SPIREPPT-1163 Supports creating "SunBurst" chart.
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.SunBurst, new RectangleF(50, 50, 500, 400), false);
chart.ChartData[0, 3].Text = "Series 1";
string[,] categories = {{"Branch 1","Stem 1","Leaf 1"},{"Branch 1","Stem 1","Leaf 2"},{"Branch 1","Stem 1", "Leaf 3"},
      {"Branch 1","Stem 2","Leaf 4"},{"Branch 1","Stem 2","Leaf 5"},{"Branch 1","Leaf 6",null},{"Branch 1","Leaf 7", null},
      {"Branch 2","Stem 3","Leaf 8"},{"Branch 2","Leaf 9",null},{"Branch 2","Stem 4","Leaf 10"},{"Branch 2","Stem 4","Leaf 11"},
      {"Branch 2","Stem 5","Leaf 12"},{"Branch 3","Stem 5","Leaf 13"},{"Branch 3","Stem 6","Leaf 14"},{"Branch 3","Leaf 15",null}};
for (int i = 0; i < 15; i++)
{
     for (int j = 0; j < 3; j++)
         chart.ChartData[i + 1, j].Value = categories[i, j];
}
double[] values = { 17, 23, 48, 22, 76, 54, 77, 26, 44, 63, 10, 15, 48, 15, 51 };
for (int i = 0; i < values.Length; i++)
{
     chart.ChartData[i + 1, 3].NumberValue = values[i];
}
chart.Series.SeriesLabel = chart.ChartData[0, 3, 0, 3];
chart.Categories.CategoryLabels = chart.ChartData[1, 0, values.Length, 2];
chart.Series[0].Values = chart.ChartData[1, 3, values.Length, 3];
chart.Series[0].DataLabels.CategoryNameVisible = true;
chart.ChartTitle.TextProperties.Text = "SunBurst";
chart.HasLegend = true;
chart.ChartLegend.Position = ChartLegendPositionType.Top;
ppt.SaveToFile(outputFile, FileFormat.PPT);
ppt.Dispose();
New feature SPIREPPT-1163 Supports creating "TreeMap" chart.
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.TreeMap, new RectangleF(50, 50, 500, 400), false);
chart.ChartData[0, 3].Text = "Series 1";
string[,] categories = {{"Branch 1","Stem 1","Leaf 1"},{"Branch 1","Stem 1","Leaf 2"},{"Branch 1","Stem 1", "Leaf 3"},
     {"Branch 1","Stem 2","Leaf 4"},{"Branch 1","Stem 2","Leaf 5"},{"Branch 1","Stem 2","Leaf 6"},{"Branch 1","Stem 2","Leaf 7"},
     {"Branch 2","Stem 3","Leaf 8"},{"Branch 2","Stem 3","Leaf 9"},{"Branch 2","Stem 4","Leaf 10"},{"Branch 2","Stem 4","Leaf 11"},
     {"Branch 2","Stem 5","Leaf 12"},{"Branch 3","Stem 5","Leaf 13"},{"Branch 3","Stem 6","Leaf 14"},{"Branch 3","Stem 6","Leaf 15"}};
for (int i = 0; i < 15; i++)
{
    for (int j = 0; j < 3; j++)
        chart.ChartData[i + 1, j].Text = categories[i, j];
}
double[] values = { 17, 23, 48, 22, 76, 54, 77, 26, 44, 63, 10, 15, 48, 15, 51 };
for (int i = 0; i < values.Length; i++)
{
    chart.ChartData[i + 1, 3].NumberValue = values[i];
}
chart.Series.SeriesLabel = chart.ChartData[0, 3, 0, 3];
chart.Categories.CategoryLabels = chart.ChartData[1, 0, values.Length, 2];
chart.Series[0].Values = chart.ChartData[1, 3, values.Length, 3];
chart.Series[0].DataLabels.CategoryNameVisible = true;
chart.Series[0].TreeMapLabelOption = TreeMapLabelOption.Banner;
chart.ChartTitle.TextProperties.Text = "TreeMap";
chart.HasLegend = true;
chart.ChartLegend.Position = ChartLegendPositionType.Top;
ppt.SaveToFile(outputFile, FileFormat.PPT);
New feature SPIREPPT-1163 Supports creating "WaterFall" chart.
Presentation ppt = new Presentation();
IChart chart = ppt.Slides[0].Shapes.AppendChart(ChartType.WaterFall, new RectangleF(50, 50, 500, 400), false);
chart.ChartData[0, 1].Text = "Series 1";
string[] categories = { "Category 1", "Category 2", "Category 3", "Category 4", "Category 5", "Category 6", "Category 7" };
for (int i = 0; i < categories.Length; i++)
{
    chart.ChartData[i + 1, 0].Text = categories[i];
}
double[] values = { 100, 20, 50, -40, 130, -60, 70 };
for (int i = 0; i < values.Length; i++)
{
    chart.ChartData[i + 1, 1].NumberValue = values[i];
}
chart.Series.SeriesLabel = chart.ChartData[0, 1, 0, 1];
chart.Categories.CategoryLabels = chart.ChartData[1, 0, categories.Length, 0];
chart.Series[0].Values = chart.ChartData[1, 1, values.Length, 1];
ChartDataPoint chartDataPoint = new ChartDataPoint(chart.Series[0]);
chartDataPoint.Index = 2;
chartDataPoint.SetAsTotal = true;
chart.Series[0].DataPoints.Add(chartDataPoint);
ChartDataPoint chartDataPoint2 = new ChartDataPoint(chart.Series[0]);
chartDataPoint2.Index = 5;
chartDataPoint2.SetAsTotal = true;
chart.Series[0].DataPoints.Add(chartDataPoint2);
chart.Series[0].ShowConnectorLines = true;
chart.Series[0].DataLabels.LabelValueVisible = true;
chart.ChartLegend.Position = ChartLegendPositionType.Right;
chart.ChartTitle.TextProperties.Text = "WaterFall";
ppt.SaveToFile(outputFile, FileFormat.PPT);
ppt.Dispose();
Bug SPIREPPT-643 Fixes the issue that the bullets were lost after converting PowerPoint to PDF.
Bug SPIREPPT-1765
SPIREPPT-1802
SPIREPPT-1814
Fixes the issue that the content was incorrect after saving shape to image.
Bug SPIREPPT-1773 Fixes the issue that the obtained text font of the table cell was incorrect.
Bug SPIREPPT-1782 Optimized the cost time of converting PowerPoint file to image.
Bug SPIREPPT-1784 Fixes the issue that the application threw "System.NullReferenceException" when loading PowerPoint file.
Bug SPIREPPT-1795 Fixes the issue that the obtained text font was incorrect.
Bug SPIREPPT-1815 Fixes the issue that the obtained duration of Animation was incorrect.
Bug SPIREPPT-1816 Fixes the issue that the application threw "System.NullReferenceException" when saving shape to image.
Bug SPIREPPT-1817 Fixes the issue that the memory had not been released when using IsPasswordProtected.
Bug SPIREPPT-1819 Fixes the issue that the application threw "OutOfMemoryException" when loading PowerPoint file.
Bug SPIREPPT-1824 Fixes the issue that the application threw "System.NullReferenceException" when saving chart to image.
Bug SPIREPPT-1829 Fixes the issue that the license validation was affected when setting "false" for "generatePublisherEvidence".

Spire.XLS

Category ID Description
New feature SPIREXLS-1845 Supports setting Html string for cell range.
Workbook workbook = new Workbook();
workbook.LoadFromFile(@"input.xlsx");
Worksheet sheet = workbook.Worksheets[0];
sheet.Range["A1"].HtmlString = "<div>xxxx<br>yyyy</div>";
New feature SPIREXLS-3586 Supports adding conditional formatting for the existing PivotTable.
Workbook workbook = new Workbook();
workbook.LoadFromFile(@"input.xlsx");
Worksheet worksheet = workbook.Worksheets[0];
PivotTable table = worksheet.PivotTables[0] as PivotTable;
PivotConditionalFormatCollection pcfs = table.PivotConditionalFormats;
PivotConditionalFormat pc = pcfs.AddPivotConditionalFormat();
IConditionalFormat cf = pc.AddCondition();
cf.FormatType = ConditionalFormatType.ContainsBlanks;
cf.FillPattern = ExcelPatternType.Solid;
cf.BackColor = Color.Red;
New feature SPIREXLS-3598 Supports adding file stream to IsPasswordProtected().
bool havepwd = Workbook.IsPasswordProtected(File.OpenRead(inputFile));
var docBytes = File.ReadAllBytes(inputFile);
MemoryStream ms = new MemoryStream(docBytes);
bool havepwd = Workbook.IsPasswordProtected(ms);
New feature SPIREXLS-3614 Supports getting the linked cell name of IPrstGeomShape.
Workbook book = new Workbook();
book.LoadFromFile("input.xlsx");
Worksheet sheet = book.Worksheets["sheet1"];
PrstGeomShapeCollection prstGeomShapeCollection = sheet.PrstGeomShapes;
IPrstGeomShape shape = prstGeomShapeCollection["a"];
shape.LinkedCell.RangeAddressLocal;
New feature SPIREXLS-3630 Supports calculating a single sheet or a cell range.
Workbook workbook = new Workbook();
workbook.LoadFromFile("input.xlsx");
workbook.Worksheets[0].CalculateAllValue();
workbook.Worksheets[0].Range["A1:C3"].CalculateAllValue();
Bug SPIREXLS-3199
SPIREXLS-3217
SPIREXLS-3573
Fixes the issue that the content was incorrect after saving chart to image.
Bug SPIREXLS-3330 Fixes the issue that the content format was incorrect when converting html file to excel.
Bug SPIREXLS-3489
SPIREXLS-3601
SPIREXLS-3619
SPIREXLS-3643
Fixes the issue that the content was incorrect after converting excel file to PDF.
Bug SPIREXLS-3546 Fixes the issue that the result file has opening error after copying a pivot table sheet to another sheet
Bug SPIREXLS-3551 Fixes the issue that the boder lost after converting excel file to ODF.
Bug SPIREXLS-3552 Optimizes the time consumption when saving chart to image.
Bug SPIREXLS-3558 Fixes the issue that the content was incorrect after saving sheet to Html.
Bug SPIREXLS-3559 Fixes the issue that the application threw "System.FormatException" when converting Excel file to PDF.
Bug SPIREXLS-3572 Fixes the issue that the result file was blank after converting Html to Excel.
Bug SPIREXLS-3577 Fixes the issue that the table column width setting didn't take effect when converting Excel to PDF.
Bug SPIREXLS-3588 Fixes the issue that the row height changed after merged the cells that have been set a row height.
Bug SPIREXLS-3589 Fixes the issue that the content was incorrect after converting Excel to Html.
Bug SPIREXLS-3597 Fixes the issue that the application threw an Exception when converting Excel file to PDF in multi-threading.
Bug SPIREXLS-3603 Fixes the issue that the content format was incorrect after converting Excel to Html.
Bug SPIREXLS-3606 Fixes the issue that the application hung a long time when adding two subtotal for worksheet.
Bug SPIREXLS-3610 Fixes the issue that the application threw "System.ArgumentOutOfRangeException" when adding SparklineGroup.
Bug SPIREXLS-3613 Fixes the issue that only the last signature remained after doing multiple signatures.
Bug SPIREXLS-3615 Fixes the issue that the application threw "IOException" when using IsPasswordProtected().
Bug SPIREXLS-3616 Fixes the issue that the obtained value of IPrstGeomShape was incorrect.

Spire.Doc

Category ID Description
Bug SPIREDOC-6775 Fixes the issue that the position of the formula was deformed after combine Word files.
Bug SPIREDOC-7117 Fixes the issue that the position of the formula in the generated file was incorrect after insert the formula to Word file through HTML string
Bug SPIREDOC-7130 Fixes the issue that the table has extra borders in the generated file after converting the HTML to Word
Bug SPIREDOC-7180 Fixes the issue that the format of the content in the generated file was incorrect after converting the Word file to PDF
Bug SPIREDOC-7233 Fixes the issue that the generated file did not effective after accepting the changes of the Word file.
Bug SPIREDOC-7235 Fixes the issue that the program threw exception "System.NullReferenceException" when setting the BuiltinStyle property of the Word file.
Bug SPIREDOC-7247 Fixes the issue that the program threw exception "System.NullReferenceException" when using the AppendHTML method