Spire.PDFViewer 6.1已发布。该版本支持了显示页面标签的功能并修复了一些显示问题。详情请阅读以下内容。
新功能:
问题修复:
Spire.Presentation 6.1已发布。该本支持嵌入zip对象到PPTX文件;支持加载和打印包含数学公式的PPT/PPTX文档以及转换到其他文档格式。此外,该版本还修复了复制组合图形时出现的问题。详情请阅读以下内容。
新功能:
String zipPath= "C:/test.zip";
Presentation ppt = new Presentation();
byte[] data = File.ReadAllBytes(zipPath);
Rectangle rec = new Rectangle(80, 60, 100, 100);
//The first parameter needs to be passed the complete file name
IOleObject ole = ppt.Slides[0].Shapes.AppendOleObject("test.zip", data, rec);
ole.ProgId = "Package";
Image image = Image.FromFile(@"E:\demoProducts\Image\logo.png");
IImageData oleImage = ppt.Images.Append(image);
ole.SubstituteImagePictureFillFormat.Picture.EmbedImage = oleImage;
ppt.SaveToFile(@"result.pptx", Spire.Presentation.FileFormat.Pptx2013);
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Presentation-NET.html
本文介绍使用Spire.XLS for Java来获取Excel工作表中的超链接,包括获取超链接所在单元格坐标位置、超链接显示文本、超链接屏幕提示词、超链接地址、超链接类型等等。
如下用于测试的Excel文档,包含多种类型的超链接类型,包括链接到网页地址、邮件地址、文档位置、工作表单元格、网络路径等等,通过本文方法可一并获取。

import com.spire.xls.*;
import com.spire.xls.collections.HyperLinksCollection;
public class GetHyperlink {
public static void main(String[] args) {
//加载包含超链接的Excel工作簿
Workbook wb = new Workbook();
wb.loadFromFile("test.xlsx");
//获取工作表
Worksheet sheet = wb.getWorksheets().get(0);
//获取超链接集合
HyperLinksCollection hyperLinks = sheet.getHyperLinks();
//遍历所有超链接
for (int i = 0; i< hyperLinks.getCount();i++)
{
//获取包含超链接的单元格行、列坐标
int row = hyperLinks.get(i).getRange().getRow();
int column = hyperLinks.get(i).getRange().getColumn();
//获取超链接文本、地址
String text = hyperLinks.get(i).getTextToDisplay();
String address = hyperLinks.get(i).getAddress();
//输出超链接获取结果
System.out.println(String.format("单元格[%d, %d] 显示文本:" ,row ,column)+ text +"\n"+ " 链接地址:"+ address);
}
}
}
超链接获取结果:

Spire.PDF 7.1已发布。该版本支持了自定义签名图片的功能。此外还增强了转换PDF到EXEL以及转换XPS到PDF的功能。详情请阅读以下内容。
新功能:
PdfSignature signature = new PdfSignature(doc, page, cert, "123456");
signature.ConfigureCustomGraphics(DrawGraphics);
private void DrawGraphics(PdfCanvas g)
{
PointF point1 = new PointF(10, 20);
PointF point2 = new PointF(25, 50);
PointF point3 = new PointF(60, 20);
PointF[] pntArr = { point1, point2, point3 };
PdfRGBColor color = new PdfRGBColor(Color.Red);
g.DrawPolygon(new PdfPen(color), pntArr);
g.DrawRectangle(new PdfPen(Color.Green), new RectangleF(70, 10, 20, 30));
g.DrawLine(new PdfPen(Color.Blue), new PointF(120, 50), new PointF(95, 5));
g.DrawLine(new PdfPen(Color.Blue), new PointF(100, 30), new PointF(130, 20));
}
问题修复:
前面我们介绍了如何比较两个Word文档的内容。从Spire.Doc V8.12.14始,我们支持获取两个 Word 文档之间比较出的差异并返回list. 该文将介绍如何获取两个Word文档之间比较出的差异。
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using Spire.Doc.Formatting.Revisions;
using System;
namespace GetWordDifferences
{
class Program
{
static void Main(string[] args)
{
//加载第一个Word文档
Document doc1 = new Document();
doc1.LoadFromFile("Sample1.docx");
//加载第二个Word文档
Document doc2 = new Document();
doc2.LoadFromFile("Sample2.docx");
//比较文档
doc1.Compare(doc2, "Author");
foreach (Section sec in doc1.Sections)
{
foreach (DocumentObject docItem in sec.Body.ChildObjects)
{
if (docItem is Paragraph)
{
Paragraph para = docItem as Paragraph;
if (para.IsInsertRevision)
{
EditRevision insRevison = para.InsertRevision;
EditRevisionType insType = insRevison.Type;
string insAuthor = insRevison.Author;
DateTime insDateTime = insRevison.DateTime;
}
else if (para.IsDeleteRevision)
{
EditRevision delRevison = para.DeleteRevision;
EditRevisionType delType = delRevison.Type;
string delAuthor = delRevison.Author;
DateTime delDateTime = delRevison.DateTime;
}
foreach (ParagraphBase paraItem in para.ChildObjects)
{
if (paraItem.IsInsertRevision)
{
EditRevision insRevison = paraItem.InsertRevision;
EditRevisionType insType = insRevison.Type;
string insAuthor = insRevison.Author;
DateTime insDateTime = insRevison.DateTime;
}
else if (paraItem.IsDeleteRevision)
{
EditRevision delRevison = paraItem.DeleteRevision;
EditRevisionType delType = delRevison.Type;
string delAuthor = delRevison.Author;
DateTime delDateTime = delRevison.DateTime;
}
}
}
}
}
//获取差异
DifferRevisions differRevisions = new DifferRevisions(doc1);
var insetRevisionsList = differRevisions.InsertRevisions;
var deletRevisionsList = differRevisions.DeleteRevisions;
}
}
}
Imports Spire.Doc
Imports Spire.Doc.Documents
Imports Spire.Doc.Fields
Imports Spire.Doc.Formatting.Revisions
Imports System
Namespace GetWordDifferences
Class Program
Private Shared Sub Main(ByVal args() As String)
'加载第一个文档
Dim doc1 As Document = New Document
doc1.LoadFromFile("Sample1.docx")
'加载第二个文档
Dim doc2 As Document = New Document
doc2.LoadFromFile("Sample2.docx")
'比较两个文档
doc1.Compare(doc2, "Author")
For Each sec As Section In doc1.Sections
For Each docItem As DocumentObject In sec.Body.ChildObjects
If (TypeOf docItem Is Paragraph) Then
Dim para As Paragraph = CType(docItem,Paragraph)
If para.IsInsertRevision Then
Dim insRevison As EditRevision = para.InsertRevision
Dim insType As EditRevisionType = insRevison.Type
Dim insAuthor As String = insRevison.Author
Dim insDateTime As DateTime = insRevison.DateTime
ElseIf para.IsDeleteRevision Then
Dim delRevison As EditRevision = para.DeleteRevision
Dim delType As EditRevisionType = delRevison.Type
Dim delAuthor As String = delRevison.Author
Dim delDateTime As DateTime = delRevison.DateTime
End If
For Each paraItem As ParagraphBase In para.ChildObjects
If paraItem.IsInsertRevision Then
Dim insRevison As EditRevision = paraItem.InsertRevision
Dim insType As EditRevisionType = insRevison.Type
Dim insAuthor As String = insRevison.Author
Dim insDateTime As DateTime = insRevison.DateTime
ElseIf paraItem.IsDeleteRevision Then
Dim delRevison As EditRevision = paraItem.DeleteRevision
Dim delType As EditRevisionType = delRevison.Type
Dim delAuthor As String = delRevison.Author
Dim delDateTime As DateTime = delRevison.DateTime
End If
Next
End If
Next
Next
'获取差异
Dim differRevisions As DifferRevisions = New DifferRevisions(doc1)
Dim insetRevisionsList = differRevisions.InsertRevisions
Dim deletRevisionsList = differRevisions.DeleteRevisions
End Sub
End Class
End Namespace 本文介绍如何使用Spire.XLS for Java将工作表按照数据拆分成多个工作表。
原文档截图如下:

import com.spire.xls.CellRange;
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;
public class SplitWorksheetIntoMultiSheets {
public static void main(String[] args) {
//创建Workbook对象,加载Excel文档
Workbook bookOriginal = new Workbook();
bookOriginal.loadFromFile("C:\\Users\\Administrator\\Desktop\\Employees.xlsx");
//获取第一个工作表
Worksheet sheet = bookOriginal.getWorksheets().get(0);
//获取标题行
CellRange headRow = sheet.getCellRange(1, 1, 1, 5);
//获取两个数据区域
CellRange range1 = sheet.getCellRange(2, 1, 6, 5);
CellRange range2 = sheet.getCellRange(7, 1, 11, 5);
//添加一个工作表,命名为“销售部”
Worksheet sheet2 = bookOriginal.getWorksheets().add("销售部");
//将标题行和数据区域1复制到“销售部”工作表
sheet.copy(headRow, sheet2, 1, 1, true, false);
sheet.copy(range1, sheet2, 2, 1, true, false);
//添加一个工作表,命名为“技术部”
Worksheet sheet3 = bookOriginal.getWorksheets().add("技术部");
//将标题行和数据区域2复制到“技术部”工作表
sheet.copy(headRow, sheet3, 1, 1, true, false);
sheet.copy(range2, sheet3, 2, 1, true, false);
//将第一个工作表中的列宽应用到新加的两个做工作表
for (int i = 0; i < sheet.getLastColumn(); i++) {
sheet2.setColumnWidth(i + 1, sheet.getColumnWidth(i + 1));
sheet3.setColumnWidth(i + 1, sheet.getColumnWidth(i + 1));
}
//保存文档
bookOriginal.saveToFile("Splited.xlsx", ExcelVersion.Version2016);
}
}
结果文档:

TIFF,即 Tagged Image File Format,这是一种比较灵活的图像格式,具有不依赖于具体硬件、可移植等特点。使用 Spire.PDF for Java,可将 PDF 转为 TIFF 保存到本地指定路径;支持转换 PDF 文档的所有页面或者指定页面为 TIFF 格式。本文,将对此作详细介绍。
首先,您需要在 Java 程序中添加 Spire.Pdf.jar 文件作为依赖项。JAR 文件可以从此链接下载。 如果您使用 Maven,则可以将以下代码添加到项目的 pom.xml 文件中,从而在应用程序中导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>12.9.0</version>
</dependency>
</dependencies>
通过使用 Spire.PDF for Java 将 PDF 转为 TIFF 格式时,可通过设置 PdfDocument.saveToTiff() 方法中的不同参数,来实现将整个 PDF 转为 TIFF 格式或将指定页数范围的 PDF 页面转为 TIFF 格式。下面是实现转换的主要代码:
import com.spire.pdf.*;
public class PDFtoTiff {
public static void main(String[] args) {
//加载PDF测试文档
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("input.pdf");
//将整篇文档保存为tiff格式
pdf.saveToTiff("ToTiff.tiff");
//将指定页面范围保存为tiff格式(第2页到第3页,并设置水平和垂直分辨率),
pdf.saveToTiff("ToTiff2.tiff",1,2,400,600);
}
}所有页面转换结果:

指定页面转换结果:

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。 获取有效期 30 天的临时许可证。
Spire.Office for Java 3.12.1已发布。在本次版本更新中,Spire.PDF for Java支持了转换PDF到TIFF,改善了doc.getPages().get(0).isBlank()方法逻辑,实现了提取PDF文本按照段落断行以及读取和写入XMP元数据的功能。此外,该版本还增强了转换PDF到Image/Excel/Word的功能。详情请阅读以下内容。
获取Spire.Office for Java 3.12.1, 请点击:https://www.e-iceblue.cn/Downloads/Spire-Office-JAVA.html
新功能:
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/Test.pdf");
pdf.saveToTiff("C:/1.tiff");
pdf.saveToTiff("C:/2.tiff",1,2,TiffCompressionTypes.DEFAULT);
PdfDocument doc = new PdfDocument();
// 加载PDF文档
doc.loadFromFile(InputPath);
doc.getConvertOptions().setKeepParagraph(true);
File file = new File(OutputPath);
file.createNewFile();
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);
StringBuilder builder = new StringBuilder();
PdfPageBase pageBase;
for (int i = 0; i < doc.getPages().getCount(); i++) {
pageBase = doc.getPages().get(i);
builder.append(pageBase.extractText(false) + "\r\n");
}
bw.write(builder.toString());
bw.flush();
bw.close();
fw.close();
doc.close();
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/test.pdf");
//Get Xmp meta data
String lcXml = pdf.getXmpMetaData().getXmlString();
PdfDocument newDoc=new PdfDocument();
newDoc.getPages().add();
//Write Xmp meta data to PDF
newDoc.getXmpMetaData().load(lcXml);
newDoc.saveToFile("C:/new.pdf");
问题修复:
Spire.PDF for Java 3.12.6已发布。该版本支持了转换PDF到TIFF,改善了doc.getPages().get(0).isBlank()方法逻辑,实现了提取PDF文本按照段落断行以及读取和写入XMP元数据的功能。此外,该版本还增强了转换PDF到Image/Excel/Word的功能。详情请阅读以下内容。
新功能:
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/Test.pdf");
pdf.saveToTiff("C:/1.tiff");
pdf.saveToTiff("C:/2.tiff",1,2,TiffCompressionTypes.DEFAULT);
PdfDocument doc = new PdfDocument();
// 加载PDF文档
doc.loadFromFile(InputPath);
doc.getConvertOptions().setKeepParagraph(true);
File file = new File(OutputPath);
file.createNewFile();
FileWriter fw = new FileWriter(file, true);
BufferedWriter bw = new BufferedWriter(fw);
StringBuilder builder = new StringBuilder();
PdfPageBase pageBase;
for (int i = 0; i < doc.getPages().getCount(); i++) {
pageBase = doc.getPages().get(i);
builder.append(pageBase.extractText(false) + "\r\n");
}
bw.write(builder.toString());
bw.flush();
bw.close();
fw.close();
doc.close();
PdfDocument pdf=new PdfDocument();
pdf.loadFromFile("C:/test.pdf");
//Get Xmp meta data
String lcXml = pdf.getXmpMetaData().getXmlString();
PdfDocument newDoc=new PdfDocument();
newDoc.getPages().add();
//Write Xmp meta data to PDF
newDoc.getXmpMetaData().load(lcXml);
newDoc.saveToFile("C:/new.pdf");
问题修复:

在处理大型 Excel 文件时,数据量过大不仅可能导致软件启动缓慢、操作卡顿,还会给团队协作带来不便。例如,当一个总表包含所有业务数据时,不同部门往往只需要处理其职责相关的部分,共享同一个大文件不仅效率低下,还可能存在数据安全隐患。
因此,文件拆分就变得尤为重要。由于手动拆分既费时费力又容易出错,本文将带你了解如何利用 Spire.XLS for Java,通过 Java 自动拆分 Excel 文件,轻松解决文件臃肿和协作受限的问题。
Spire.XLS for Java 是一款专业的 Java Excel 组件,它可以帮助开发人员在不安装 Microsoft Office 的情况下,直接通过代码创建、读取、编辑和转换 Excel 文件。对于拆分 Excel 文件这类任务也可以做到灵活按照工作表拆分或按照行、列进行拆分。
如果你使用 Maven 管理项目,只需在 pom.xml 文件中添加以下配置:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls</artifactId>
<version>16.9.2</version>
</dependency>
</dependencies>
你可以下载 Spire.XLS 进行自定义安装。同时,该库还提供免费版用于测试或小型项目。
当一个工作簿中包含多个工作表,且每个表代表不同的数据,如不同部门或月份时,我们可以将每个工作表拆分并保存为独立的 Excel 文件。Spire.XLS 通过遍历源文件中的所有工作表,创建新的工作簿,并拷贝当前工作表来完成这个任务。下方为具体的操作步骤:
下面是一个完整的代码示例,展示了将工作表拆分为多个独立的 Excel 文件:
import com.spire.xls.FileFormat;
import com.spire.xls.Workbook;
public class SplitExcel {
public static void main(String[] args) {
// 创建 Workbook 对象
Workbook wb = new Workbook();
// 加载 Excel 文档
wb.loadFromFile("/input/世界各洲人口前十国家.xlsx");
// 声明 Workbook 变量
Workbook newWb;
// 声明 String 类型变量
String sheetName;
// 指定拆分生成的文档的存放路径
String folderPath = "/output/按表拆分/";
// 遍历所有工作表
for (int i = 0; i < wb.getWorksheets().getCount(); i++) {
// 初始化 Workbook 对象
newWb = new Workbook();
// 删除默认工作表
newWb.getWorksheets().clear();
// 将源文档中的指定工作表复制到新的 Workbook
newWb.getWorksheets().addCopy(wb.getWorksheets().get(i));
// 获取工作表表名
sheetName = wb.getWorksheets().get(i).getName();
// 将新的 Workbook 保存为 Excel 文档
newWb.saveToFile(folderPath + sheetName + ".xlsx", FileFormat.Version2013);
}
}
}
Excel 拆分结果预览:

提示:如果你想要合并多个 Excel 文件,Spire.XLS 也是支持的,请参考:通过 Java 合并 Excel 工作簿 >>
在 Excel 文件处理中,按行拆分常用于将大型明细表拆分为多份独立数据。例如,将 1-10 行保存为一个文件,11-20 行保存为另一个文件,以实现对数据的针对性处理。Spire.XLS 主要通过 Worksheet.copyRow() 方法配合循环遍历来完成这个目标。下方是详细的代码步骤:
下方代码展示了怎样将 Excel 文件中,第一个工作表的 1-5 行、6-10 行分别拆分为两个单独的文件:
import com.spire.xls.*;
import java.util.EnumSet;
public class spiltexcel {
public static void main(String[] args) {
// 设置文件的输入和输出路径
String sourceFile = "/input/世界各洲人口前十国家.xlsx";
String folderPath = "/output/";
// 创建一个 Workbook 类的对象并加载 Excel 文件
Workbook workbook = new Workbook();
workbook.loadFromFile(sourceFile);
// 获取源文件的第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
// 创建新的工作簿作为目标文件并清除默认工作表
Workbook newWorkbook1 = new Workbook();
newWorkbook1.getWorksheets().clear();
// 在目标文件新增一个工作表
Worksheet newSheet1 = newWorkbook1.getWorksheets().add("Sheet1");
// 将源文件第一个工作表的第1-5行复制到目标文件中
int destRow1 = 1;
for (int i = 0; i < 5; i++) {
sheet.copyRow(sheet.getRows()[i], newSheet1, destRow1++, EnumSet.of(CopyRangeOptions.All));
}
copyColumnWidths(sheet, newSheet1);
newWorkbook1.saveToFile(folderPath + "1-5行.xlsx", ExcelVersion.Version2016);
// 创建新的工作簿作为目标文件 2 并清除默认工作表
Workbook newWorkbook2 = new Workbook();
newWorkbook2.getWorksheets().clear();
// 在目标文件 2 新增一个工作表
Worksheet newSheet2 = newWorkbook2.getWorksheets().add("Sheet1");
int destRow2 = 1;
// 复制表头
sheet.copyRow(sheet.getRows()[0], newSheet2, destRow2++, EnumSet.of(CopyRangeOptions.All));
// 将源文件第一个工作表的第6-10行复制到目标文件中
for (int i = 5; i < 10; i++) {
sheet.copyRow(sheet.getRows()[i], newSheet2, destRow2++, EnumSet.of(CopyRangeOptions.All));
}
copyColumnWidths(sheet, newSheet2);
newWorkbook2.saveToFile(folderPath + "6-10行.xlsx", ExcelVersion.Version2016);
}
private static void copyColumnWidths(Worksheet source, Worksheet dest) {
for (int i = 0; i < source.getColumns().length; i++) {
dest.setColumnWidth(i + 1, source.getColumnWidth(i + 1));
}
}
}
Excel 拆分结果预览:

提示:代码中已经内置了将源文档列宽复制到新表的操作,这并非必要步骤。拆分完成后,你也可以自行调整行高和列宽,以更好地控制表格布局,提高可读性和展示效果。
当表格列数较多、字段信息复杂时,按列拆分 Excel 往往比按行处理更直观也更安全。这种方式既能减少无关字段的干扰,也有助于数据权限隔离。与按行拆分的处理方式类似,Spire.XLS 主要使用 Worksheet.copyColumn() 方法和循环遍历来拆分不同列,并将它们分别保存为独立的文件。下方为具体的步骤:
下方代码展示了怎样将 Excel 文件中,第一个工作表的 1-2 列和 3-4 列拆分出来并保存为单独的文件:
import com.spire.xls.*;
import java.util.EnumSet;
public class SplitExcel {
public static void main(String[] args) {
// 创建 Workbook 对象并加载 Excel 文件
Workbook workbook = new Workbook();
workbook.loadFromFile("/input/世界各洲人口前十国家.xlsx");
// 获取原始(第一个)工作表
Worksheet worksheet = workbook.getWorksheets().get(0);
// 指定生成的 Excel 文件的文件夹路径
String folderPath = "/output/";
// 创建新的 Workbook,删除默认工作表并添加新的工作表
Workbook newWorkbook1 = new Workbook();
newWorkbook1.getWorksheets().clear();
Worksheet newWorksheet1 = newWorkbook1.getWorksheets().add("Sheet1");
// 从原始工作表复制第 1-2 列到新工作表
for (int i = 1; i <= 2; i++) {
// 参数:源列,目标表,目标起始列索引,复制选项
worksheet.copyColumn(worksheet.getColumns()[i - 1], newWorksheet1, newWorksheet1.getLastDataColumn() + 1, EnumSet.of(CopyRangeOptions.All));
}
// 复制行高以保持样式一致
for (int i = 0; i < worksheet.getRows().length; i++) {
newWorksheet1.setRowHeight(i + 1, worksheet.getRowHeight(i + 1));
}
newWorkbook1.saveToFile(folderPath + "AB列.xlsx", ExcelVersion.Version2016);
newWorkbook1.dispose();
// 创建新的 Workbook,删除默认工作表并添加新的工作表
Workbook newWorkbook2 = new Workbook();
newWorkbook2.getWorksheets().clear();
Worksheet newWorksheet2 = newWorkbook2.getWorksheets().add("Sheet1");
// 从原始工作表复制第 3-4 列到新工作表
for (int i = 3; i <= 4; i++) {
worksheet.copyColumn(worksheet.getColumns()[i - 1], newWorksheet2, newWorksheet2.getLastDataColumn() + 1, EnumSet.of(CopyRangeOptions.All));
}
// 复制行高
for (int i = 0; i < worksheet.getRows().length; i++) {
newWorksheet2.setRowHeight(i + 1, worksheet.getRowHeight(i + 1));
}
newWorkbook2.saveToFile(folderPath + "CD列.xlsx", ExcelVersion.Version2016);
newWorkbook2.dispose();
}
}
输出文件预览:

通过 Spire.XLS for Java,我们可以从工作表、行、列三个维度对冗长的 Excel 文件进行精准拆分。这不仅解决了大文件打开慢的问题,更实现了数据的解构,让不同部门能够专注于自身业务,极大地提升了团队的协同效率。如果你对 Spire.XLS 感兴趣,或有任何疑问,欢迎随时联系我们!