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

Spire.Cloud 纯前端文档控件

C++实现Excel转OFD教程

在国内文档管理与政务办公领域,OFD(开放固定版式文档)作为国家推荐标准(GB/T 33190-2016),正逐步成为政务申报、档案归档、企业正式文档交付的主流格式,是 PDF 的本土化优质替代方案。在 C++ 开发场景中,无论是财务报表系统、企业文档管理平台还是政务类应用,实现 Excel 到 OFD 的高效转换都成为高频需求。

本文将详细介绍如何通过 Spire.XLS for C++ 这款功能完善的 Excel 处理类库,快速通过 C++ 实现 Excel(XLS/XLSX)到 OFD 的格式转换。该库完全独立,无需依赖 Microsoft Office/Excel,适配服务端与客户端多场景部署。


为何要将 Excel 转换为 OFD 格式?

OFD 格式的核心优势完美适配国内办公与归档的实际需求,也是其逐步替代传统格式的关键原因:

  • 格式不可篡改: 完整保留 Excel 表格的版式、字体、图片、数据布局,在任意设备上打开显示效果完全一致,避免格式错乱
  • 符合国内规范: 作为中国国家标准,OFD 是政府部门、事业单位、档案机构的指定提交格式,政务类应用开发的必备适配格式;
  • 文件轻量化: 对于包含大量图片、复杂格式和公式的 Excel 文件,转换为 OFD 后体积大幅压缩,且不损失显示质量,便于传输与存储。

搭建 Spire.XLS for C++ 开发环境

该库支持两种集成方式,适配不同开发场景,推荐优先使用 NuGet 包管理器实现快速安装,也可手动下载配置,以下为详细步骤。

方式一:通过 NuGet 包管理器安装

  • 在 Visual Studio 中打开目标 C++ 项目;
  • 依次点击工具 -> NuGet包管理器 -> 管理解决方案的NuGet程序包;
  • 搜索 “Spire.XLS.Cpp”;
  • 点击 “安装”。

方式二:手动下载配置

  • 从官方网站下载最新版本的 Spire.XLS for C++;
  • 解压下载的安装包;
  • 配置 Visual Studio 项目,添加 Include 目录的路径,并链接 lib 目录。确保 DLL 文件放置在可执行文件所在目录或系统路径下。

详细的安装教程可参考:在 C++ 程序中集成 Spire.XLS for C++


通过 C++ 实现 Excel 转 OFD 的基础方法

完成 C++ Excel 类库的集成后,就可以编写代码加载 Excel 文档并将其保存为 OFD 格式,适配.xls 和.xlsx 两种主流格式。

以下是完整的 C++ 示例代码:

#include "Spire.Xls.o.h"

using namespace Spire::Xls;
using namespace std;

int main() {

	wstring inputFile = L"测试.xlsx";
	wstring outputFile = L"Excel转OFD.ofd";

	// 创建一个新的Workbook对象
	intrusive_ptr<Workbook> workbook = new Workbook();

	// 从指定的输入文件加载工作簿
	workbook->LoadFromFile(inputFile.c_str());

	// 将工作簿保存为OFD格式
	workbook->SaveToFile(outputFile.c_str(), FileFormat::OFD);

	// 释放工作簿对象资源
	workbook->Dispose();
}

核心代码说明:

上述代码的核心为Workbook 类的三个关键方法,也是 Spire.XLS for C++ 处理 Excel 文件的基础,理解后可灵活拓展:

  • Workbook():构造函数,创建工作簿对象,作为 Excel 文件的操作载体,一个对象对应一个 Excel 文件;
  • LoadFromFile():加载本地 Excel 文件,支持.xls/.xlsx 格式;
  • SaveToFile():文件另存为方法,指定 FileFormat::OFD 即可实现转 OFD;
  • Dispose():释放工作簿对象占用的内存资源,避免服务端长期运行的内存泄漏问题。

Excel 转 OFD 效果:

使用C++将Excel文件转换为OFD格式

上述代码会将 Excel 文件中的每个工作表转换为 OFD 文档中的独立页面。如果你只需要转换指定的工作表,可以先将该工作表复制到新的工作簿,再使用上述代码进行转换。


Excel 转 OFD 的高级转换设置

基础转换满足简单需求,而在实际开发中,常需要对 OFD 的显示效果进行定制,比如宽表适配、页面方向调整、自定义页边距等。Spire.XLS for C++ 提供了 ConverterSetting 和 PageSetup 两个核心类,实现转换效果的精细化控制。

将 Excel 工作表适配到 OFD 单页显示

默认情况下,如果 Excel 工作表内容超出标准页面尺寸,会被拆分到多个 OFD 页面中显示,这可能会破坏数据的视觉连贯性。通过将 ConverterSetting 类的 SetSheetFitToPage 方法设置为 true,即可将每个工作表适配到单个 OFD 页面中显示。

核心实现代码:

intrusive_ptr<Workbook> workbook = new Workbook();
workbook->LoadFromFile(L"Sample.xlsx");

// 启用单页适配功能
workbook->GetConverterSetting()->SetSheetFitToPage(true);

workbook->SaveToFile(L"页面自适应.ofd", FileFormat::OFD);
workbook->Dispose();

代码功能说明:

  • 如果工作表内容超出页面尺寸,类库会按比例缩小内容,使其适配到单个页面中。
  • 这能确保宽表或图表不会被尴尬地拆分到多个页面中。

转换前自定义 Excel 页面设置

通过 PageSetup 类,可对 Excel 工作表的纸张方向、纸张大小、页边距进行自定义设置,效果与在 Excel 中直接调整页面布局一致,转换后的 OFD 会继承这些设置,适合宽表、长表的个性化展示需求。

核心实现代码:

intrusive_ptr<Workbook> workbook = new Workbook();
workbook->LoadFromFile(L"Sample.xlsx");

// 获取第一个工作表
intrusive_ptr<Worksheet> sheet = dynamic_pointer_cast<Worksheet>(workbook->GetWorksheets()->Get(0));

// 获取该工作表的PageSetup对象
intrusive_ptr<PageSetup> pageSetup = dynamic_pointer_cast<PageSetup>(sheet->GetPageSetup());

// 设置页面方向为横向
pageSetup->SetOrientation(PageOrientationType::Landscape);

// 设置纸张大小为A4
pageSetup->SetPaperSize(PaperSizeType::PaperA4);

// 设置自定义页边距
pageSetup->SetBottomMargin(2);
pageSetup->SetLeftMargin(1);
pageSetup->SetRightMargin(1);
pageSetup->SetTopMargin(2);

workbook->SaveToFile(L"页面设置.ofd", FileFormat::OFD);

代码功能说明:

  • 页面方向:将页面方向设置为横向(适合宽表显示)。
  • 页边距:为内容设置自定义页边距。
  • 纸张大小:将页面尺寸设置为 A4(可选类型包括 PaperA4、PaperLetter、PaperLegal 等)。
  • 按工作表单独配置:转换前可为每个工作表设置不同的参数,满足多工作表的差异化需求;

扩展技巧: 若项目需要兼顾国际通用场景,Spire.XLS for C++ 还支持将 Excel 直接转为 PDF,可根据业务需求灵活切换输出格式,适配国内 / 国际不同的文档交付要求。


常见问题解答(FAQ)

问题1:使用该库是否需要在服务器 / 客户端安装 Microsoft Excel/Office?

答:不需要。 Spire.XLS for C++ 是完全独立的 Excel 处理库,不依赖任何 Microsoft Office 组件,可直接部署在无 Office 的服务器环境中,是服务端自动化文档处理的优选。

问题2:转换是否支持 Excel 中的所有元素?

答:支持。 该类库采用高保真渲染引擎,可精准还原 Excel 中的图表、数据透视表、形状、图片、公式(以计算后的值呈现)、单元格样式等所有元素,输出的 OFD 文件与原 Excel 视觉效果一致。

问题3:能否跳过某个工作表,只转换其余工作表为 OFD?

答:可以。你可以在转换前隐藏不需要的工作表(Spire.XLS for C++ 会跳过隐藏的工作表):

// 隐藏第一个工作表
workbook->GetWorksheets()->Get(0)->SetVisibility(WorksheetVisibility::Hidden);

此外,也可以按照前文所述,将需要转换的工作表复制到新的工作簿中再进行转换。

问题4:是否支持批量将多个 Excel 文件转换为 OFD?

答:支持。可通过 C++ 文件操作遍历指定文件夹中的所有 Excel 文件,结合上述转换代码实现循环批量转换,仅需增加文件遍历逻辑,核心转换代码无需修改。


文章总结

借助 Spire.XLS for C++,在 C++ 中实现 Excel 转 OFD 具备代码少、集成快、性能高、兼容性强的核心优势。无论是转换单个电子表格,还是实现批量转换自动化,该类库都能以极少的代码量实现高性能的转换效果。通过适配单页、自定义页面设置等高级配置,可以确保 OFD 文档满足严苛的展示标准。

如需了解 Excel 加密、数据写入、公式计算等更多功能,请查阅官方文档。


获取免费授权许可

如需去除水印或完整体验 Spire.XLS for C++ 的所有功能,可以通过此处申请30天试用许可证。

Spire.PDFViewer 8.2.13 现已正式发布。该版本新增了对 .NET 6.0 WPF 和 WinForms 平台的支持。
更多详情如下。

新功能:


获取 Spire.PDFViewer 8.2.13 请点击:

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

Spire.Doc for Java 14.3.1 现已正式发布。该版本支持设置“定义网格时自动调整为右缩进”和“为字体调整字间距”功能。此外,一些在转换 Word 到 PDF 和 Markdown,以及加载文档时出现问题也已成功被修复。详情如下

新功能:

问题修复:


获取 Spire.Doc for Java 14.3.1 请点击:

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

我们很高兴宣布 Spire.Office 11.2.0 正式发布。在此版本中,Spire.Doc 支持在表格中隐藏行;Spire.XLS 支持 LET 和 MAP 函数;Spire.PDF 支持在 PDF 页面中替换文本时设置文本颜色;Spire.Presentation 强化了从 PowerPoint 转 PDF 的功能。同时,修复了大量已知问题。

此版本包含最新的 Spire.Doc、Spire.PDF、Spire.XLS、Spire.Presentation、Spire.Barcode、Spire.DocViewer、Spire.PDFViewer、Spire.Email、Spire.Spreadsheet 以及 Spire.OfficeViewer。

版本信息如下:


获取Spire.Office 11.2.0,请点击:

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

Spire.Doc

新功能:

调整:

问题修复:

Spire.XLS

新功能:

问题修复:

Spire.Presentation

新问题修复:

Spire.PDF

优化:

新功能:

问题修复:

Spire.PDF 12.2.14 现已正式发布。该版本支持通过 PdfHatchStyle 接口创建 Hatch Brush 画刷,并支持在替换 PDF 页面文本时配置文本颜色。同时,优化了 netstandard DLLs 的压缩功能以提升文件压缩比,一些在转换 PDF 到图片、添加图片或绘制字体时出现的问题也得以成功修复。更多详情如下。

优化:

新功能:

问题修复:


获取 Spire.PDF 12.2.14,请点击:

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

Spire.XLS 16.2.4 现已正式发布。该版本新增了对 LET 和 MAP 函数的支持。同时,修复了排序、条件格式、列宽显示、图片转换、字体设置以及 Excel 转 PDF 等方面的多个问题。详情如下。

新功能:

问题修复:


获取 Spire.XLS 16.2.4 请点击:

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

我们很高兴宣布 Spire.Office for Java 11.2.0 的发布。在此版本中,Spire.PDF 提升了从 PDF 转换为 Word 的功能;Spire.Doc 支持删除 Word 文档中的空白页或指定页;Spire.XLS 支持在从流加载 Excel 文件时判断密码保护。同时,许多已知问题已被修复。更多详细信息如下。


获取 Spire.Office for Java 11.2.0,请点击:

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

Spire.PDF for Java

问题修复:

Spire.Doc for Java

新功能:

问题修复:

Spire.XLS for Java

新功能:

问题修复:

Spire.Presentation for Java

问题修复:

Spire.Presentation for Java 11.2.1 已发布。该版本主要修复了两个在添加公式和判断文档加密时出现的问题。详情请查看以下内容。

问题修复:


获取Spire.Presentation for Java 11.2.1请点击:

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

Spire.XLS for Java 16.2.6 现已正式发布。该版本支持通过 Workbook.isPasswordProtected(stream) 传入流文件数据来判断文档是否受密码保护。同时,一些在复制单元格、公式计算以及转换 Excel 到 PDF 时出现的问题也得以成功修复。
更多详情如下。

新功能:

问题修复:


获取 Spire.XLS for Java 16.2.6,请点击:

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

在 Java 中读取 CSV 文件

CSV(逗号分隔值)因其结构简单、可读性强以及跨平台兼容性广等特点备受欢迎,至今仍是数据交换的通用格式。如果你正在寻找一种稳健且高效的 Java 读取 CSV 方案,Spire.XLS for Java 库提供了一个功能强大且操作简单的解决方法。

本指南将介绍如何利用 Java 加载和读取 CSV 文件,并将其转换为结构化的 DataTable,从而在应用程序中实现无损的数据处理与分析。

为什么选择 Spire.XLS for Java 来解析 CSV 文件?

与其他 Java CSV 解析库相比,Spire.XLS 在处理 CSV 数据时具有以下显著优势:

  • 极简的 API 设计: 提供了更直观的接口,简化了读取 CSV 文件的代码逻辑。
  • 支持自定义分隔符: 分隔符不局限于逗号,可灵活处理各类特殊字符分隔的文本文件。
  • 智能边界检测: 能够自动识别有效数据区域,避免读取到冗余的空行或空列。
  • 原生支持 DataTable 转换: 无需手动解析,即可直接将 CSV 数据精准转换为结构化的 DataTable 对象。
  • 多格式兼容性: 用户可以自由在 CSV、XLS 和 XLSX 格式之间转换。

实战演练:如何使用 Java 读取 CSV 文件

Spire.XLS for Java 提供了 Workbook 类用于加载 CSV 文件,并配合 Worksheet 类来访问具体数据。以下是自动识别分隔符并逐行读取 CSV 文件的具体步骤:

1. 环境配置与依赖管理

首先,确保你的项目中已引入 Spire.XLS for Java。如果你使用 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>

2. 加载 CSV 文件

在 Spire.XLS for Java 中,你可以将 CSV 文件直接加载到 Workbook 对象中。加载完成后,CSV 中的每一行数据都会自动映射为工作表中的对应行。

import com.spire.xls.*;

public class ReadCSV {
    public static void main(String[] args) {
        // 创建一个 Workbook 对象
        Workbook workbook = new Workbook();

        // 加载 CSV 文件  
        workbook.loadFromFile("sample.csv", ",", 1, 1);
    }
}  

方法参数详解:

loadFromFile() 方法支持传入四个关键参数,以便精确控制文件的加载方式:

  • "sample.csv":指定要读取的 CSV 文件所在路径。
  • ",":你可以根据文件格式指定分隔符(例如逗号 “, ” 分号 “;” 或制表符 “\t”)。
  • 1:指定从文件的哪一行开始加载数据。
  • 1:指定从文件的哪一列开始加载数据。

3. 访问工作表并读取 CSV 数据

在 Spire.XLS 中,CSV 文件被视为仅包含单个工作表的工作簿。因此,我们只需获取第一个工作表,然后通过嵌套循环遍历其行和列即可提取数据:

// 获取第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);

// 获取已使用的单元格区域
CellRange dataRange = sheet.getAllocatedRange();

// 遍历行
for (int i = 0; i < dataRange.getRowCount(); i++) {

    // 遍历列
    for (int j = 0; j < dataRange.getColumnCount(); j++) {
        // Get cell text
        CellRange cell = dataRange.get(i+1,j+1);
        System.out.print(cell.getText() + "\t"); 
    }
    System.out.println(); 

输出结果: 程序将从 CSV 文件中读取数据,并在控制台中以制表符分隔的形式打印出来,确保内容排列整齐、易于阅读。

Java 读取并打印 CSV 文件内容到控制台

进阶技巧:在 Java 中将 CSV 读取为 DataTable

对于需要进行结构化数据操作的场景,将 CSV 转换为 DataTable 则更加实用。DataTable 以行列形式组织数据,便于用户进行数据查询、过滤或与数据库集成。

下方 Java 代码展示了怎样将 CSV 文件读取并导出为 DataTable:

import com.spire.xls.*;
import com.spire.xls.data.table.DataTable;

public class CSVtoDataTable {
    public static void main(String[] args) {

        // 创建工作簿并加载 CSV 文件
        Workbook workbook = new Workbook();
        workbook.loadFromFile("sample.csv", ",", 1, 1);

        // 获取第一个工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        // 导出数据到 DataTable
        DataTable dataTable = sheet.exportDataTable();

        // 获取行数和列数
        System.out.println("总列数: " + dataTable.getColumns().size());
        System.out.println("总行数: " + dataTable.getRows().size());
        System.out.println();

        // 打印列名
        for (int i = 0; i < dataTable.getColumns().size(); i++) {
            System.out.print(dataTable.getColumns().get(i).getColumnName() + "  | ");
        }
        System.out.println();
        System.out.println("----------------------------------------------------------");
        
        // 打印各行数据
        for (int i = 0; i < dataTable.getRows().size(); i++) {
            for (int j = 0; j < dataTable.getColumns().size(); j++) {
                System.out.print(dataTable.getRows().get(i).getString(j) + "\t");
            }
            System.out.println();
        }
    }
}

核心要点解析:

  • exportDataTable() 方法:直接将 CSV 数据转换为 DataTable 对象,无需进行繁琐的手动操作。
  • DataTable 的优势:能够轻松获取各类基础数据信息,例如总列数、总行数、列名以及具体的行数据内容等。

输出结果:

Java 解析 CSV 文件并将其转换为 DataTable

推荐阅读:使用 Java 将 CSV 转换为 PDF(含格式设置)

常见问题解答 (FAQ)

1. 如何处理使用不同分隔符(如分号、制表符等)的 CSV 文件?

只需在 loadFromFile() 方法中指定所需的分隔符即可,例如:

// 处理以分号分隔的文件
workbook.loadFromFile("sample.csv", ";", 0, 0);

// 处理以制表符分隔的文件
workbook.loadFromFile("sample.csv", "\t", 0, 0);

// 处理以竖线分隔的文件
workbook.loadFromFile("sample.csv", "|", 0, 0);

2. 如何跳过 CSV 文件中的表头行?

你可以通过从第二行(或任意指定行)开始遍历来跳过表头。例如,一个 CSV 文件包含 2 行表头(第 1 行和第 2 行),且实际数据从第 3 行开始,可以参考下方代码行进行设置:

// 从第三行开始读取
for (int i = 2; i < dataRange.getRowCount(); i++) { 
    for (int j = 0; j < dataRange.getColumnCount(); j++) {
        // 将基于 0 的索引转换为 Spire.XLS 基于 1 的单元格索引。
        CellRange cell = dataRange.get(i + 1, j + 1); 
        System.out.print(cell.getText() + "\t");

3. 我可以将 CSV 的特定范围导出为 DataTable 吗?

可以。Spire.XLS 支持通过 exportDataTable(CellRange range, boolean exportColumnNames) 方法定义精确的单元格范围,并将其导出为 DataTable。

总结

Spire.XLS for Java 极大地简化了 Java 中的 CSV 文件读取流程,是手动解析或基础第三方库的高效替代方案。无论是读取简单的 CSV 数据,还是将其转换为结构化的 DataTable,本指南提供的实战示例都能帮助你快速实现高效的 CSV 文件解析。

如需探索更多高级功能(如将数据导出为 PDF 等),请查阅 Spire.XLS for Java 官方教程。