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
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 |