Spire.Office for Java 11.7.0 已上线。在该版本中,Spire.Doc for Java 支持通过 isSVG 属性检测 SVG 图片;Spire.XLS for Java支持单元格区域转 HTML 功能;Spire.PDF for Python支持签名域中文本自动适配;Spire.Presentation for Java支持转换 PPT 到纯 HTML 格式。此外,本次更新还成功修复了多个已知问题。更多详情如下。
获取 Spire.Office for Java 11.7.0,请点击:
https://www.e-iceblue.cn/Downloads/Spire-Office-JAVA.html
Spire.Doc for Java
新功能:
- 文档对比功能效果进行了整体优化,在 CompareOptions 类中新增了 setIgnoreFields 和 setIgnoreCaseChanges 选项。同时将 setIgnoreTable(boolean value) 修改为 setIgnoreTables(boolean value),getIgnoreTable() 修改为 getIgnoreTables()。
- 支持“双行合一”功能。
- 新增 isSVG 属性支持判断图片是否为 SVG。
Document doc1 = ConvertUtil.GetNewEngineDocument();
doc1.loadFromFile(inputFile_1);
String[] name1 = new String[]{"DJG_Black_Book", "DJG_Repairs_Expense", "DJG_Sale_Amount", "DJG_Dealer_Payment", "DJG_Auction_Fees"};
String[] value1 = new String[]{"20,000.00", "2,000.00", "13,500.00", "1,000.00", "500.00"};
doc1.getMailMerge().execute(name1, value1);
doc1.isUpdateFields(true);
Document doc2 = ConvertUtil.GetNewEngineDocument();
doc2.loadFromFile(inputFile_2);
String[] name2 = new String[]{"DJG_Black_Book", "DJG_Repairs_Expense", "DJG_Sale_Amount", "DJG_Dealer_Payment", "DJG_Auction_Fees"};
String[] value2 = new String[]{"50,000.00", "5,000.00", "3,500.00", "1,000.00", "200.00"};
doc2.getMailMerge().execute(name2, value2);
doc2.isUpdateFields(true);
CompareOptions options = new CompareOptions();
options.setCompareMoves(true);
options.setIgnoreCaseChanges(true);
options.setIgnoreComments(true);
options.setIgnoreFields(true);
options.setIgnoreFootnotes(true);
options.setIgnoreTables(true);
options.setIgnoreTextboxes(true);
doc1.compare(doc2, "user", new Date(), options);
doc1.saveToFile(outputFile, FileFormat.Docx_2013);
doc1.close();
doc2.close();
Document doc = ConvertUtil.GetNewEngineDocument();
Section section = doc.addSection();
section.setTextDirection(TextDirection.Right_To_Left);
Paragraph titlePara = section.addParagraph();
titlePara.appendText("===== FarEastLayout Two-Lines-in-One Full Scenario Test =====\n\n");
titlePara.appendText("\n\n1. Basic Two-Lines-in-One: ");
// Basic Two-Lines-in-One Combine=true, no brackets, no vertical layout
Paragraph p1 = section.addParagraph();
TextRange farEastLayout = p1.appendText("Basic Two-Lines-in-One: One Two Three Four");
farEastLayout.getCharacterFormat().setFontSize(12);
farEastLayout.getCharacterFormat().setFontNameFarEast("Songti");
FarEastLayout layout1 = new FarEastLayout();
layout1.setCombine(true); // Two-Lines-in-One
farEastLayout.getCharacterFormat().setFarEastLayout(layout1);
// Two-Lines-in-One + various bracket styles
Paragraph p1Title = section.addParagraph();
p1Title.appendText("\n\n2. Two-Lines-in-One + Different Brackets: ");
for (CombineBrackets bracket : CombineBrackets.values()) {
Paragraph pTmp = section.addParagraph();
TextRange rt = pTmp.appendText("Bracket Type " + bracket.name() + ": A B C D");
rt.getCharacterFormat().setFontSize(12);
rt.getCharacterFormat().setFontNameFarEast("Songti");
FarEastLayout layoutTmp = new FarEastLayout();
layoutTmp.setCombine(true);
layoutTmp.setCombineBrackets(bracket);
rt.getCharacterFormat().setFarEastLayout(layoutTmp);
}
doc.saveToFile(outputFile, FileFormat.Docx);
doc.close();
DocPicture picture=(DocPicture) object;if(picture.isSVG()){
byte[] svgBytes = picture.getImageBytes();
Files.write(Paths.get(outputFile),svgBytes);
}
问题修复:
- 修复了比较文档报 "StrinqIndexOutofBoundsException" 的问题。
- 修复了接受修订后,表格格式错乱的问题。
- 修复了 Word 转 PDF,内容布局不一致的问题。
- 修复了合并 Word 文档,用 WPS 工具打开效果不正确的问题。
- 修复了 Word 转 HTML,表格布局不正确的问题。
- 修复了 ubuntu 环境 Word 转 PDF,图片不正确的问题。
- 修复了 Word 转 PDF,字体效果不正确的问题 。
- 修复了高版本 Java 下打包项目报错的问题。
- 修复了保存 Word 文档耗时长的问题。
- 修复了对比 Word 文档时程序抛出 “NullPointerException” 异常的问题。
- 修复了转换 Word 到 PDF 时内容重叠的问题。
- 修复了转换 Word 到 PDF 时图片文字乱码的问题。
- 修复了转换 Word 到 PDF 时布局不正确的问题。
- 修复了转换 Word 到 PDF 时程序抛出 “ArgumentOutOfRangeException” 异常的问题。
- 修复了复制模板样式到其他文档时样式不完整的问题。
- 修复了加载 Word 文档时程序抛出 “Document element did not appear. Line 1, position 1” 异常的问题。
- 修复了克隆文档时多出空白页的问题。
- 修复了对比 Word 文档时程序抛出 “String index out of range: 76” 异常的问题。
- 修复了克隆章节时表格格式不正确的问题。
- 修复了转换 Word 到 PDF 时渲染效果不正确的问题。
Spire.XLS for Java
新功能:
- 新增属性支持在转换 Excel 到 HTML 时控制是否保留冻结的行列,默认为 false。
- 新增 isSavePicInRelativePath 属性,支持在转换 Excel 到 Markdown 时控制图片是否以相对路径形式保存。
- 支持 BYROW 和 BYCOL 函数。
- 新增 isSaveHyperlinkAsRef 属性,支持在转换 Excel 到 Markdown 时控制是否将超链接保存为 Markdown 引用样式。
- 支持单元格区域转 HTML 功能。
- 支持 XMATCH 函数。
- ● 支持行列置换功能。
- 支持在单元格中嵌入复选框控件,并支持设置复选框的选中状态。
- 支持数据模拟分析功能,涵盖创建、编辑、删除到摘要生成及合并。
- 支持转换 Excel 到 JSON 数据。
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
HTMLOptions.Default.isSaveFreezedPanes(true);
wb.saveToFile(outputFile, FileFormat.HTML);
wb.dispose();
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
MarkdownOptions markdownOptions = new MarkdownOptions();
markdownOptions.isSavePicInRelativePath(true);
wb.saveToMarkdown(outputFile, markdownOptions);
wb.dispose();
sheet.getRange().get("G7").setFormula("=BYROW(B7:F7, LAMBDA(row, AVERAGE(row)))");
sheet.getRange().get("B8").setFormula("=BYCOL(B2:B7, LAMBDA(col, AVERAGE(col)))");
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
MarkdownOptions markdownOptions = new MarkdownOptions();
markdownOptions.isSaveHyperlinkAsRef(true);
wb.saveToMarkdown(outputFile, markdownOptions);
wb.dispose();
StringBuilder sb = new StringBuilder();
Workbook workbook = new Workbook();
workbook.loadFromFile(inputFile);
Worksheet sheet = workbook.getWorksheets().get(0);
CellRange cell = sheet.getRange().get("A1:B3");
sb.append(cell.getHtmlString());
sheet.getRange().get("C4").setFormula("=XMATCH(\"王五\", A2:A5)");
Workbook workbook = new Workbook();
workbook.loadFromFile(inputFile);
Worksheet sheet = workbook.getWorksheets().get(0);
EnumSet<CopyRangeOptions> options = EnumSet.of(CopyRangeOptions.Transpose, CopyRangeOptions.All);
sheet.getRange().get("D1").setText("A1:C4置换到D2:G3:");
sheet.getRange().get("A1:C4").copy(sheet.getRange().get("D2:G3"), options);
sheet.getRange().get("D4").setText("A1:B5置换到D5:");
sheet.getRange().get("A1:B5").copy(sheet.getRange().get("D5"), options);
options = EnumSet.of(CopyRangeOptions.Transpose, CopyRangeOptions.CopyStyles);
sheet.getRange().get("D9").setText("A10置换到D10:");
sheet.getRange().get("A10").copy(sheet.getRange().get("D10"), options);
sheet.getRange().get("D11").setText("A11:B11置换到D12:");
sheet.getRange().get("A11:B11").copy(sheet.getRange().get("D12"), options);
options = EnumSet.of(CopyRangeOptions.Transpose, CopyRangeOptions.CopyConditionalFormats);
sheet.getRange().get("D16").setText("B17:B20置换到D17:");
sheet.getRange().get("B17:B20").copy(sheet.getRange().get("D17"), options);
options = EnumSet.of(CopyRangeOptions.Transpose, CopyRangeOptions.CopyStyles);
sheet.getRange().get("D19").setText("B17:B20置换到D20:");
sheet.getRange().get("B17:B20").copy(sheet.getRange().get("D20"), options);
options = EnumSet.of(CopyRangeOptions.Transpose);
sheet.getRange().get("D22").setText("B17:B20置换到D23:");
sheet.getRange().get("B17:B20").copy(sheet.getRange().get("D23"), options);
workbook.saveToFile(outputFile);
sheet.dispose();
workbook.dispose();
Workbook workbook = new Workbook();
Worksheet sheet = workbook.getWorksheets().get(0);
XlsRange range = (XlsRange)sheet.getRange().get("A1");
range.insertEmbedCheckBox();
range.setEmbedCheckBoxCheckState(true);
workbook.saveToFile(outputFile);
workbook.dispose();
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
Worksheet worksheet = wb.getWorksheets().get(0);
// Access the collection of scenarios in the worksheet
XlsScenarioCollection scenarios = worksheet.getScenarios();
//Initialize list objects with different values for scenarios
List<Object> currentChangePercentage_Values = new ArrayList<Object>() {{ add(0.23); add(0.8); add(1.1); add(0.5); add(0.35); add(0.2); }};
List<Object> increasedChangePercentage_Values = new ArrayList<Object>() {{ add(0.45); add(0.56); add(0.9); add(0.5); add(0.58); add(0.43); }};
List<Object> decreasedChangePercentage_Values = new ArrayList<Object>() {{ add(0.3); add(0.2); add(0.5); add(0.3); add(0.5); add(0.23); }};
List<Object> currentQuantity_Values = new ArrayList<Object>() {{ add(1500); add(3000); add(5000); add(4000); add(500); add(4000); }};
List<Object> increasedQuantity_Values = new ArrayList<Object>() {{ add(1000); add(5000); add(4500); add(3900); add(10000); add(8900); }};
List<Object> decreasedQuantity_Values = new ArrayList<Object>() {{ add(1000); add(2000); add(3000); add(3000); add(300); add(4000); }};
//Add scenarios in the worksheet with different values for the same cells
scenarios.add("Current % of Change", worksheet.getRange().get("F5:F10"), currentChangePercentage_Values);
scenarios.add("Increased % of Change", worksheet.getRange().get("F5:F10"), increasedChangePercentage_Values);
scenarios.add("Decreased % of Change", worksheet.getRange().get("F5:F10"), decreasedChangePercentage_Values);
scenarios.add("Current Quantity", worksheet.getRange().get("D5:D10"), currentQuantity_Values);
scenarios.add("Increased Quantity", worksheet.getRange().get("D5:D10"), increasedQuantity_Values);
scenarios.add("Decreased Quantity", worksheet.getRange().get("D5:D10"), decreasedQuantity_Values);
//Saving the workbook
wb.saveToFile(outputFile, ExcelVersion.Version2013);
wb.dispose();
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
Worksheet worksheet = wb.getWorksheets().get(0);
// Access the collection of scenarios in the worksheet
XlsScenarioCollection scenarios = worksheet.getScenarios();
XlsScenario scenario1 = scenarios.get(0);
XlsScenario scenario2 = scenarios.get(1);
//Modify the scenario
scenario1.setVariableCells(worksheet.getRange().get("A1:A5"), scenario2.getValues());
CellRange sourceCell = worksheet.getRange().get("B1:B5");
scenario2.setVariableCells(sourceCell, scenario2.getValues());
scenario1.show();
scenario2.show();
//Saving the workbook
wb.saveToFile(outputFile, ExcelVersion.Version2013);
wb.dispose();
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
Worksheet worksheet = wb.getWorksheets().get(0);
// Access the collection of scenarios in the worksheet
XlsScenarioCollection scenarios = worksheet.getScenarios();
//delete the scenario
scenarios.removeScenarioAt(0);
scenarios.removeScenarioByName("two");
String content = "";
content += "Count:" + scenarios.getCount() + "\n";
content += "ContainsScenario:" + scenarios.containsScenario("two") + "\n";
content += "ContainsScenario:" + scenarios.containsScenario("one") + "\n";
TestUtil.writeAllText(outputFile, content);
//Saving the workbook
wb.dispose();
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
Worksheet worksheet = wb.getWorksheets().get(0);
// Access the collection of scenarios in the worksheet
XlsScenarioCollection scenarios = worksheet.getScenarios();
//Initialize list objects with different values for scenarios
List<Object> currentChangePercentage_Values = new ArrayList<Object>() {{ add(0.23); add(0.8); add(1.1); add(0.5); add(0.35); add(0.2); }};
List<Object> increasedChangePercentage_Values = new ArrayList<Object>() {{ add(0.45); add(0.56); add(0.9); add(0.5); add(0.58); add(0.43); }};
List<Object> decreasedChangePercentage_Values = new ArrayList<Object>() {{ add(0.3); add(0.2); add(0.5); add(0.3); add(0.5); add(0.23); }};
List<Object> currentQuantity_Values = new ArrayList<Object>() {{ add(1500); add(3000); add(5000); add(4000); add(500); add(4000); }};
List<Object> increasedQuantity_Values = new ArrayList<Object>() {{ add(1000); add(5000); add(4500); add(3900); add(10000); add(8900); }};
List<Object> decreasedQuantity_Values = new ArrayList<Object>() {{ add(1000); add(2000); add(3000); add(3000); add(300); add(4000); }};
//Add scenarios in the worksheet with different values for the same cells
scenarios.add("Current % of Change", worksheet.getRange().get("F5:F10"), currentChangePercentage_Values);
scenarios.add("Increased % of Change", worksheet.getRange().get("F5:F10"), increasedChangePercentage_Values);
scenarios.add("Decreased % of Change", worksheet.getRange().get("F5:F10"), decreasedChangePercentage_Values);
scenarios.add("Current Quantity", worksheet.getRange().get("D5:D10"), currentQuantity_Values);
scenarios.add("Increased Quantity", worksheet.getRange().get("D5:D10"), increasedQuantity_Values);
scenarios.add("Decreased Quantity", worksheet.getRange().get("D5:D10"), decreasedQuantity_Values);
//Create Summary
worksheet.getScenarios().summary(worksheet.getRange().get("L7"));
//Saving the workbook
wb.saveToFile(outputFile, ExcelVersion.Version2013);
wb.dispose();
Workbook wb = new Workbook();
wb.loadFromFile(inputFile);
Worksheet worksheet1 = wb.getWorksheets().get(0);
Worksheet worksheet2 = wb.getWorksheets().get(1);
//Merge the scenario
worksheet1.getScenarios().merge(worksheet2);
//Saving the workbook
wb.saveToFile(outputFile, ExcelVersion.Version2013);
wb.dispose();
Workbook workbook = new Workbook();
workbook.loadFromFile(inputFile);
workbook.saveToFile(outputFile, FileFormat.Json);
workbook.dispose();
问题修复:
- 修复了加载 Excel 文档时程序抛出“Invalid cell name”异常的问题。
- 修复了拷贝单元格范围时图表坐标轴多出竖线的问题。
- 修复了获取 Excel 文档打印区域失败的问题。
- 修复了复制包含 Slicer 的工作表时程序抛出“System.ArgumentOutOfRangeException”异常的问题。
Spire.Presentation for Java
新功能:
- 支持转换 PowerPoint 到纯 HTML 格式(注:部分不支持的元素以 SVG 形式存在)
Presentation ppt = new Presentation();
ppt.loadFromFile(inputFile);
ppt.getSaveToHtmlOption().setPureHtml(true);
ppt.saveToFile(outputFile, FileFormat.HTML);
ppt.dispose();
问题修复:
- 修复了转换 PPT 到 PDF ,图片变白色的问题。
- 修复了转换 PPT 到 PDF , 文本换行不正确的问题。
Spire.PDF for Java
问题修复:
- 修复了添加数字签名后验证签名报错的问题
- 修复了签名报错 “Undefined length encoding” 的问题。
- 修复了 Java 21 下项目打包报错的问题。
- 修复了压缩 PDF 文件时抛出 “NullPointerException” 的问题。
- 修复了 PDF 转图片时抛出 “ArrayIndexOutOfBoundsException” 的问题。
优化:
- 优化了替换文档内容的内存消耗







