冰蓝科技
|
028-81705109
|
|
微信扫一扫
|

Spire.Cloud 纯前端文档控件

Spire.PDFViewer 6.1已发布。该版本支持了显示页面标签的功能并修复了一些显示问题。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.PDFViewer 6.1,请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDFViewer-NET.html

Spire.Presentation 6.1已发布。该本支持嵌入zip对象到PPTX文件;支持加载和打印包含数学公式的PPT/PPTX文档以及转换到其他文档格式。此外,该版本还修复了复制组合图形时出现的问题。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.Presentation 6.1请点击:

https://www.e-iceblue.cn/Downloads/Spire-Presentation-NET.html

本文介绍使用Spire.XLS for Java来获取Excel工作表中的超链接,包括获取超链接所在单元格坐标位置、超链接显示文本、超链接屏幕提示词、超链接地址、超链接类型等等。

如下用于测试的Excel文档,包含多种类型的超链接类型,包括链接到网页地址、邮件地址、文档位置、工作表单元格、网络路径等等,通过本文方法可一并获取。

Java 获取 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);
        }
    }
}

超链接获取结果:

Java 获取 Excel 中的超链接

Spire.PDF 7.1已发布。该版本支持了自定义签名图片的功能。此外还增强了转换PDF到EXEL以及转换XPS到PDF的功能。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.PDF 7.1,请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-NET.html

前面我们介绍了如何比较两个Word文档的内容。从Spire.Doc V8.12.14始,我们支持获取两个 Word 文档之间比较出的差异并返回list. 该文将介绍如何获取两个Word文档之间比较出的差异。

C#
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;      
        }
    }
 }
VB.NET
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将工作表按照数据拆分成多个工作表。

原文档截图如下:

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);
    }
}

结果文档:

Java 将工作表按数据区域拆分成多个工作表

TIFF,即 Tagged Image File Format,这是一种比较灵活的图像格式,具有不依赖于具体硬件、可移植等特点。使用 Spire.PDF for Java,可将 PDF 转为 TIFF 保存到本地指定路径;支持转换 PDF 文档的所有页面或者指定页面为 TIFF 格式。本文,将对此作详细介绍。

安装 Spire.PDF for Java

首先,您需要在 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>

将 PDF 转为 TIFF

通过使用 Spire.PDF for Java 将 PDF 转为 TIFF 格式时,可通过设置 PdfDocument.saveToTiff() 方法中的不同参数,来实现将整个 PDF 转为 TIFF 格式或将指定页数范围的 PDF 页面转为 TIFF 格式。下面是实现转换的主要代码:

  • Java
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);
    }
}

所有页面转换结果:

Java 将 PDF 转为 TIFF

指定页面转换结果:

Java 将 PDF 转为 TIFF

申请临时 License

如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请 该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


Spire.PDF for Java

新功能:

问题修复:

Spire.PDF for Java 3.12.6已发布。该版本支持了转换PDF到TIFF,改善了doc.getPages().get(0).isBlank()方法逻辑,实现了提取PDF文本按照段落断行以及读取和写入XMP元数据的功能。此外,该版本还增强了转换PDF到Image/Excel/Word的功能。详情请阅读以下内容。

新功能:

问题修复:


获取Spire.PDF for Java 3.12.6,请点击:

https://www.e-iceblue.cn/Downloads/Spire-PDF-JAVA.html

通过 Java 灵活拆分 Excel 文件

在处理大型 Excel 文件时,数据量过大不仅可能导致软件启动缓慢、操作卡顿,还会给团队协作带来不便。例如,当一个总表包含所有业务数据时,不同部门往往只需要处理其职责相关的部分,共享同一个大文件不仅效率低下,还可能存在数据安全隐患。

因此,文件拆分就变得尤为重要。由于手动拆分既费时费力又容易出错,本文将带你了解如何利用 Spire.XLS for Java,通过 Java 自动拆分 Excel 文件,轻松解决文件臃肿和协作受限的问题。

一、 Spire.XLS for Java 介绍与安装

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 进行自定义安装。同时,该库还提供免费版用于测试或小型项目。

二、 Java 按工作表拆分 Excel 为独立文件

当一个工作簿中包含多个工作表,且每个表代表不同的数据,如不同部门或月份时,我们可以将每个工作表拆分并保存为独立的 Excel 文件。Spire.XLS 通过遍历源文件中的所有工作表,创建新的工作簿,并拷贝当前工作表来完成这个任务。下方为具体的操作步骤:

  • 创建 Workbook 类的对象并使用 Workbook.loadFromFile() 加载 Excel 源文档。
  • 声明 Workbook 和 String 变量。
  • 遍历源文档中的所有工作表。
    • 创建新的 Workbook 对象,删除默认工作表。
    • 通过 Workbook.getWorksheets().addCopy() 方法,将源文档中的工作表复制到新工作簿中。
    • 调用 Workbook.getWorksheets().get().getName() 方法获取工作表的名称,并应用到复制后的表格。
    • 通过 Workbook.saveToFile() 方法保存新的工作簿为 Excel 文件。

下面是一个完整的代码示例,展示了将工作表拆分为多个独立的 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 拆分结果预览:

Java 按照工作表拆分 Excel 文件

提示:如果你想要合并多个 Excel 文件,Spire.XLS 也是支持的,请参考:通过 Java 合并 Excel 工作簿 >>

三、 Java 按行拆分 Excel 文件

在 Excel 文件处理中,按行拆分常用于将大型明细表拆分为多份独立数据。例如,将 1-10 行保存为一个文件,11-20 行保存为另一个文件,以实现对数据的针对性处理。Spire.XLS 主要通过 Worksheet.copyRow() 方法配合循环遍历来完成这个目标。下方是详细的代码步骤:

  • 创建 Workbook 类的对象,并使用 Workbook.loadFromFile() 方法加载 Excel 源文件。
  • 通过 Workbook.getWorksheets().get() 方法获取源工作表。
  • 创建新的 Workbook 对象,并清除默认工作表。
  • 使用 Workbook.getWorksheets().add() 方法为新工作簿添加一个新工作表。
  • 使用 Worksheet.copyRow() 方法将特定行从原始工作表复制到新工作表,并将列宽也复制到新工作表。
  • 使用 Workbook.saveToFile() 方法将新工作簿保存为单独的 Excel 文件。

下方代码展示了怎样将 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 拆分结果预览:

Java 根据行拆分 Excel 文件

提示:代码中已经内置了将源文档列宽复制到新表的操作,这并非必要步骤。拆分完成后,你也可以自行调整行高和列宽,以更好地控制表格布局,提高可读性和展示效果。

四、 Java 按列拆分 Excel 文件

当表格列数较多、字段信息复杂时,按列拆分 Excel 往往比按行处理更直观也更安全。这种方式既能减少无关字段的干扰,也有助于数据权限隔离。与按行拆分的处理方式类似,Spire.XLS 主要使用 Worksheet.copyColumn() 方法和循环遍历来拆分不同列,并将它们分别保存为独立的文件。下方为具体的步骤:

  • 创建 Workbook 类的对象,并使用 Workbook.loadFromFile() 方法加载 Excel 源文件。
  • 通过 Workbook.getWorksheets().get() 方法获取源工作表。
  • 创建新的 Workbook 对象,并清除默认工作表。
  • 使用 Workbook.getWorksheets().add() 方法为新工作簿添加一个新工作表。
  • 使用 Worksheet.copyColumn() 方法将特定列从原始工作表复制到新工作表。
  • 使用 Workbook.saveToFile() 方法将新工作簿保存为单独的 Excel 文件。

下方代码展示了怎样将 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();  
    }  
}

输出文件预览:

Java 根据列拆分 Excel 文件

总结

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