C++操作Excel文件的完整指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:C++是一种广泛使用的编程语言,尤其在需要高性能和底层控制的应用中。本主题探讨了如何使用C++读写Microsoft Excel文件,这对于数据处理和自动化任务非常重要。由于C++标准库不直接支持Office文档操作,因此需要依赖第三方库。libxl是一个轻量级库,用于操作.xls格式的Excel文件,而TinyXML则适用于解析和生成.xlsx格式的文件。此外,还有一些其他库如pugixml、xlsxwriter和openxml4j,它们提供了更丰富的功能。通过COM接口或Python的pandas库也可以实现对Excel的读写,但具有较强的平台依赖性。开源项目cppexcel提供了一种不依赖于特定库的方式来操作Excel文件。在实际应用中,应根据项目需求选择合适的工具,并注意库的授权协议。本指南涉及文件操作、第三方库集成、数据序列化和反序列化等概念,旨在帮助C++开发者提升数据处理能力。 C++实现读写excel

1. C++实现读写Excel文件概述

在现代软件开发中,处理Excel文件是一项常见的任务,尤其是在数据分析和报告生成方面。C++作为一种高效的编程语言,虽然没有内置的Excel文件操作功能,但通过使用第三方库,我们可以轻松地实现对Excel文件的读写操作。在本章中,我们将概述C++实现读写Excel文件的基本方法和策略,并为后续章节的深入探讨奠定基础。

1.1 C++操作Excel文件的需求和挑战

C++开发者在处理Excel文件时面临的主要需求包括:读取和解析Excel文件内容、修改和更新数据、以及创建和保存新的Excel文件。这些需求往往与数据导入导出、报表生成、自动化测试等相关。挑战则在于Excel文件格式的复杂性和第三方库的选择多样性。

1.2 第三方库的选择标准

由于C++标准库本身不支持Excel文件操作,选择合适的第三方库变得至关重要。理想的选择标准包括:库的功能是否满足需求、性能是否高效、是否易于集成到现有项目、以及社区支持和文档是否充分。在后续章节中,我们将深入探讨几个流行的库,如libxl和TinyXML,以及它们的特点和使用方法。

2. libxl库操作.xls文件

在本章节中,我们将深入探讨libxl库,这是一个用于读写Excel文件的C++库,特别适用于.xls格式的文件。本章节将介绍libxl库的基本特性、安装配置、基本操作方法以及高级应用案例。

2.1 libxl库的基本介绍

2.1.1 libxl库的特性和适用场景

libxl是一个为C++开发者提供的第三方库,它允许开发者在他们的应用程序中轻松地读写Excel文件。这个库特别适合以下场景:

  • 需要处理Excel文件的自动化脚本和应用程序。
  • 图形用户界面(GUI)应用程序,需要提供Excel文件操作功能。
  • 服务器端应用程序,需要批量生成或分析Excel报告。

libxl支持.xls和.xlsx格式的文件,但本章节主要聚焦于.xls格式,因为xlsx格式的处理更加复杂,将在后续章节中讨论。

2.1.2 libxl库的安装和配置

在开始使用libxl之前,需要进行安装和配置。这通常包括以下几个步骤:

  1. 下载libxl库的二进制文件或源代码。
  2. 将库文件添加到项目中。
  3. 设置编译器,确保能够找到libxl的头文件和库文件。

具体步骤如下:

  1. 访问libxl官方网站或GitHub仓库下载最新的libxl库文件。
  2. 解压下载的文件,并将包含头文件的目录添加到项目的包含目录(Include Directories)。
  3. 将库文件(通常是.lib文件)添加到项目的链接器输入(Linker Input)。
  4. 如果是使用命令行编译器,需要在编译命令中指定库文件的路径。
g++ -o myapp myapp.cpp -Ipath/to/libxl/include -Lpath/to/libxl/libs -lxl

2.2 libxl库操作.xls文件的基本方法

2.2.1 读取.xls文件内容

读取.xls文件内容是libxl库最基本的功能之一。以下是一个简单的示例代码,展示了如何使用libxl打开一个.xls文件并读取第一个工作表的内容。

#include "libxl.h"
using namespace libxl;

int main() {
    // 创建Book对象
    Book* book = xlCreateBook();
    // 打开文件
    if(book->load(L"path/to/your/file.xls")) {
        // 获取第一个工作表
        Sheet* sheet = book->getSheet(0);
        // 遍历工作表的单元格
        for(int row = 0; row < sheet->rows(); ++row) {
            for(int col = 0; col < sheet->cols(); ++col) {
                Cell* cell = sheet->cell(row, col);
                if(cell) {
                    // 打印单元格的字符串
                    printf("%s\t", cell->str().c_str());
                } else {
                    printf("#\t");
                }
            }
            printf("\n");
        }
    }
    // 释放资源
    book->release();
    return 0;
}
2.2.2 修改.xls文件内容

除了读取,libxl库还支持修改.xls文件的内容。以下代码展示了如何修改已加载的.xls文件中的单元格内容。

#include "libxl.h"
using namespace libxl;

int main() {
    // 创建Book对象
    Book* book = xlCreateBook();
    // 打开文件
    if(book->load(L"path/to/your/file.xls")) {
        // 获取第一个工作表
        Sheet* sheet = book->getSheet(0);
        // 修改第2行第3列的单元格内容
        sheet->writeStr(1, 2, L"New Value");
    }
    // 保存修改
    book->save(L"path/to/your/newfile.xls");
    // 释放资源
    book->release();
    return 0;
}
2.2.3 新建和保存.xls文件

libxl库不仅可以读取和修改现有的.xls文件,还可以创建新的.xls文件并进行保存。以下代码展示了如何创建一个新的.xls文件并保存。

#include "libxl.h"
using namespace libxl;

int main() {
    // 创建Book对象
    Book* book = xlCreateBook();
    // 创建新的工作表
    Sheet* sheet = book->addSheet(L"MySheet");
    // 写入数据到工作表
    sheet->writeNum(0, 0, 123);
    sheet->writeStr(0, 1, L"Hello, libxl!");
    // 保存新创建的文件
    book->save(L"path/to/your/newfile.xls");
    // 释放资源
    book->release();
    return 0;
}

2.3 libxl库操作.xls文件的高级应用

2.3.1 表格样式和格式的处理

libxl库提供了丰富的API来处理Excel的表格样式和格式。例如,可以设置单元格的颜色、字体、边框等。以下代码展示了如何设置单元格的字体和颜色。

#include "libxl.h"
using namespace libxl;

int main() {
    // 创建Book对象
    Book* book = xlCreateBook();
    // 加载文件
    if(book->load(L"path/to/your/file.xls")) {
        // 获取第一个工作表
        Sheet* sheet = book->getSheet(0);
        // 获取单元格
        Cell* cell = sheet->cell(0, 0);
        // 设置字体
        Font* font = book->newFont();
        font->setName(L"Arial");
        font->setSize(14);
        cell->setFont(font);
        // 设置颜色
        cell->setInteriorColor(0x00FF00); // 设置为绿色
    }
    // 保存修改
    book->save(L"path/to/your/newfile.xls");
    // 释放资源
    book->release();
    return 0;
}
2.3.2 公式和函数的支持

libxl库支持在Excel文件中写入和读取公式和内置函数。这使得开发者可以在程序中处理Excel的计算逻辑。以下代码展示了如何在单元格中写入一个简单的公式。

#include "libxl.h"
using namespace libxl;

int main() {
    // 创建Book对象
    Book* book = xlCreateBook();
    // 加载文件
    if(book->load(L"path/to/your/file.xls")) {
        // 获取第一个工作表
        Sheet* sheet = book->getSheet(0);
        // 设置单元格的公式
        sheet->writeStr(0, 0, L"=SUM(A1:A2)");
    }
    // 保存修改
    book->save(L"path/to/your/newfile.xls");
    // 释放资源
    book->release();
    return 0;
}
2.3.3 复杂表格操作案例分析

在实际应用中,可能需要处理更复杂的Excel表格操作,如合并单元格、插入行或列、设置打印区域等。libxl库提供了相应的方法来处理这些操作。以下代码展示了如何合并单元格。

#include "libxl.h"
using namespace libxl;

int main() {
    // 创建Book对象
    Book* book = xlCreateBook();
    // 加载文件
    if(book->load(L"path/to/your/file.xls")) {
        // 获取第一个工作表
        Sheet* sheet = book->getSheet(0);
        // 合并A1到B2的单元格
        sheet->mergeCells(0, 0, 1, 1);
        // 写入合并后的单元格内容
        sheet->writeStr(0, 0, L"Merged Cell");
    }
    // 保存修改
    book->save(L"path/to/your/newfile.xls");
    // 释放资源
    book->release();
    return 0;
}

在本章节中,我们介绍了libxl库的基本特性、安装配置、基本操作方法以及一些高级应用。通过这些示例代码,我们可以看到libxl在处理.xls文件时的强大功能和灵活性。在下一章节中,我们将探讨TinyXML库在解析和生成.xlsx文件方面的应用。

3. TinyXML库解析和生成.xlsx文件

3.1 TinyXML库的基本介绍

3.1.1 TinyXML库的特性和适用场景

TinyXML是一个小巧的C++ XML解析库,它非常适合用于解析和生成小型到中等规模的XML文件。由于其轻量级的设计,它不依赖任何其他库,也不需要复杂的安装过程,使得它在嵌入式系统和小型项目中尤为受欢迎。TinyXML能够解析标准的XML文件,并且支持DOM风格的节点访问。它的API简单直观,使得开发者能够快速上手并且进行高效的XML数据处理。

3.1.2 TinyXML库的安装和配置

TinyXML库的安装和配置非常简单。大多数情况下,你只需要下载TinyXML的源代码包,解压后将相应的头文件和源文件加入到你的项目中即可。使用以下命令可以快速安装:

# 下载TinyXML源代码
wget ***
* 解压源代码包
tar -zxvf tinyxml_2_6_2.tar.gz
# 复制头文件到项目目录
cp -r tinyxml_2_6_2/* /path/to/your/project/

在你的项目配置文件中(如CMakeLists.txt或Makefile),确保包含TinyXML的头文件路径,并且编译时链接相应的源文件。

3.2 TinyXML库解析.xlsx文件的方法

3.2.1 解析.xlsx文件的基本结构

.xlsx文件实际上是一个压缩包,它包含了XML文件作为工作表的数据源。TinyXML-2.6.2之前的版本不能直接解析.xlsx文件,因为它不支持压缩的XML文件。但是,可以使用第三方库如zipios++来解压.xlsx文件,然后再用TinyXML进行解析。以下是一个示例代码:

#include <zipios/zipios.hpp>
#include <tinyxml2.h>
#include <iostream>

int main() {
    try {
        zipios::Zip-archive archive("example.xlsx");
        const zipios::File-entry& entry = archive["xl/workbook.xml"];
        std::string content((std::istreambuf_iterator<char>(entry.openInputStream()),
                              std::istreambuf_iterator<char>()));
        // content now contains the uncompressed XML content of the workbook.xml
        // You can now use TinyXML to parse this content
    } catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return 1;
    }
    return 0;
}

3.2.2 读取.xlsx文件中的数据

解析后的XML文件可以使用TinyXML的解析器来读取。例如,要读取工作表中的单元格数据,可以按照以下步骤进行:

tinyxml2::XMLDocument doc;
doc.Parse(content.c_str());
tinyxml2::XMLElement* root = doc.FirstChildElement("workbook");
tinyxml2::XMLElement* sheet = root->FirstChildElement("sheets")->FirstChildElement("sheet");
// Iterate through the rows of the sheet
for (tinyxml2::XMLElement* row = sheet->FirstChildElement("row"); row != nullptr; row = row->NextSiblingElement("row")) {
    // Iterate through the cells of the row
    for (tinyxml2::XMLElement* cell = row->FirstChildElement("c"); cell != nullptr; cell = cell->NextSiblingElement("c")) {
        const char* value = cell->Attribute("r");
        // Process the cell data
    }
}

3.2.3 修改.xlsx文件中的数据

修改数据可以通过直接修改XML节点的内容来完成。例如,要修改一个单元格的值,可以先找到对应的节点,然后修改其文本内容:

tinyxml2::XMLElement* cell = doc.FirstChildElement("workbook")->FirstChildElement("sheets")->FirstChildElement("sheet")->FirstChildElement("row")->FirstChildElement("c");
const char* originalValue = cell->GetText();
cell->SetText("new value");

3.3 TinyXML库生成.xlsx文件的方法

3.3.1 创建.xlsx文件的基本结构

生成.xlsx文件首先需要创建XML结构,然后将其压缩为.xlsx格式。TinyXML可以帮助创建必要的XML节点,而zipios++可以将这些节点压缩成最终的文件。以下是一个示例代码:

// Create XML structure using TinyXML
tinyxml2::XMLDocument doc;
tinyxml2::XMLElement* workbook = doc.NewElement("workbook");
doc.InsertFirstChild(workbook);
// ... Add sheets, rows, cells to the workbook
// Use zipios++ to compress the XML structure into .xlsx file

3.3.2 写入数据到.xlsx文件

写入数据到.xlsx文件涉及到将XML节点添加到XML结构中,然后将结构压缩。TinyXML的API允许你轻松地添加节点:

tinyxml2::XMLElement* cell = doc.NewElement("c");
cell->SetAttribute("r", "A1");
cell->SetText("Hello, Excel!");
sheet->InsertFirstChild(cell);

3.3.3 保存和导出.xlsx文件

将XML结构转换为.xlsx文件需要使用zipios++。以下是将XML内容压缩并保存为.xlsx文件的示例代码:

zipios::Zip-archive archive;
zipios::File-entry& entry = archive.createEntry("xl/workbook.xml");
std::ostream* out = entry.openOutputStream();
doc.Print(out);
out->flush();
// ... Add other XML files and Excel specific files to the archive
archive.close();

在本章节中,我们介绍了TinyXML库的基本介绍、解析.xlsx文件的方法以及如何生成.xlsx文件。通过上述步骤,你可以使用TinyXML库来处理.xlsx文件,无论是在商业应用还是个人项目中。总结来说,TinyXML提供了简单而强大的API来处理XML数据,结合zipios++库,可以实现对.xlsx文件的解析和生成。虽然TinyXML对.xlsx文件的支持不是直接的,但通过结合其他库,我们可以轻松扩展其功能以满足我们的需求。

在本章节中,我们深入了解了如何使用TinyXML库来解析和生成.xlsx文件。通过实际的代码示例和解释,我们展示了如何从头开始创建.xlsx文件的结构,如何读取和修改现有的.xlsx文件,以及如何将修改后的内容保存为新的.xlsx文件。这个过程涉及到了多个库的交互使用,包括TinyXML和zipios++,这为我们提供了一种灵活的方式来处理Excel文件,尤其是在不需要依赖重型库的情况下。

4. 其他第三方库使用

在本章节中,我们将深入探讨除了libxl和TinyXML之外的其他第三方库,它们在处理Excel文件时的不同特性和应用场景。通过本章节的介绍,你将了解到如何根据项目需求选择合适的第三方库,并且掌握它们的基本使用方法和最佳实践。

4.1 第三方库的比较分析

4.1.1 不同库的性能对比

在处理Excel文件时,性能是一个重要的考量因素。不同的库在读写速度、内存消耗等方面各有千秋。例如,一些库可能在处理大型文件时表现更优,而另一些库可能在小文件操作上更为迅速。以下是一个简化的性能对比表格:

| 库名称 | 文件大小适应性 | 读取速度 | 写入速度 | 内存消耗 | |--------|----------------|-----------|-----------|-----------| | libxl | 小型至中型 | 快 | 较快 | 适中 | | TinyXML| 小型至大型 | 较快 | 快 | 较低 | | ... | ... | ... | ... | ... |

在实际应用中,性能对比应该根据具体的工作负载和数据集进行详细的基准测试。

4.1.2 不同库的功能对比

功能对比是选择第三方库的另一个关键点。不同的库提供了不同的功能集,包括但不限于:

  • 对不同版本的Excel文件(如.xls和.xlsx)的支持
  • 单元格格式、样式的操作能力
  • 公式和函数的支持
  • 数据库连接和操作
  • 内存和磁盘的使用优化

为了帮助你更好地理解,这里展示一个功能对比的表格:

| 库名称 | 支持.xls | 支持.xlsx | 格式和样式支持 | 公式支持 | 数据库连接 | |--------|----------|-----------|-----------------|-----------|-------------| | libxl | 是 | 否 | 有限 | 否 | 否 | | TinyXML| 否 | 是 | 有限 | 是 | 否 | | ... | ... | ... | ... | ... | ... |

4.2 使用第三方库进行Excel文件操作

4.2.1 OLE/COM接口的使用

OLE/COM(对象链接与嵌入/组件对象模型)是Windows系统中处理Excel文件的一种传统方式。通过OLE/COM接口,可以在C++程序中直接创建、打开和操作Excel文档。这种方式的优点是可以利用Excel自身的功能,但缺点是依赖于Windows平台,且操作较为复杂。

以下是一个简单的示例代码,展示如何使用OLE/COM接口打开一个Excel文件:

#include <iostream>
#include <Windows.h>

int main() {
    // 初始化COM库
    CoInitialize(NULL);

    // 创建Excel应用程序实例
    CLSID clsid;
    CLSIDFromProgID(L"Excel.Application", &clsid);
    IDispatch *pXlApp;
    CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);

    // 打开一个工作簿
    VARIANT x;
    x.vt = VT_BSTR;
    x.bstrVal = SysAllocString(L"C:\\path\\to\\your\\file.xlsx");
    DISPID dispID;
    // 获取Open方法的DISPID
    OLECHAR *szMethod = L"Open";
    pXlApp->GetIDsOfNames(IID_NULL, &szMethod, 1, LOCALE_USER_DEFAULT, &dispID);
    DISPPARAMS dispParams = {NULL, NULL, 0, 0};
    VARIANTARG vRet;
    vRet.vt = VT_VARIANT | VT_BYREF;
    dispParams.cArgs = 1;
    dispParams.rgvarg = &vRet;
    // 调用Open方法
    pXlApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);

    // 清理
    pXlApp->Release();
    SysFreeString(x.bstrVal);
    CoUninitialize();

    return 0;
}

4.2.2 Boost库的使用

Boost库是一个广泛使用的C++库,提供了许多有用的功能。Boost并没有直接提供Excel文件操作的工具,但是可以使用Boost库中的文件系统组件(如Boost.Filesystem)和其他库(如Boost.Serialization)来辅助处理Excel文件的数据。

4.2.3 其他轻量级库的选择和应用

除了上述提到的库之外,还有一些轻量级的库,如xlnt和OpenXLSX,它们提供了更简洁的API和更好的性能。这些库通常更容易集成和使用,而且很多都是跨平台的。

以xlnt为例,以下是一个使用xlnt库读取Excel文件的示例代码:

#include <xlnt/xlnt.hpp>
#include <iostream>

int main() {
    // 创建一个工作簿对象
    xlnt::workbook wb;
    try {
        // 加载一个工作簿
        wb.load("C:\\path\\to\\your\\file.xlsx");
        // 获取第一个工作表
        auto ws = wb.active_sheet();
        // 读取A*单元格的值
        auto cell = ws.cell("A1");
        std::cout << "Value of A1: " << cell.to_string() << std::endl;

        // 遍历工作表中的所有单元格
        for (auto row : ws.rows(false)) { 
            for (auto cell : row) {
                std::cout << cell.to_string() << std::endl;
            }
        }
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;
}

通过本章节的介绍,我们对不同第三方库的性能、功能以及使用方法有了一个全面的了解。在实际开发中,可以根据具体需求选择合适的库,以便高效地处理Excel文件。

5. API接口和平台依赖性

5.1 API接口的选择和使用

5.1.1 API接口的概念和作用

API(Application Programming Interface)是应用程序编程接口的简称,它是一组预定义的函数、协议和工具,用于构建软件应用程序。API定义了不同软件组件之间交互的方式,使得开发者可以使用一组标准化的命令来实现特定的功能,而不必从头开始编写代码。API的作用在于简化开发流程,提高开发效率,同时促进不同系统之间的兼容性和互联性。

5.1.2 常用API接口的介绍

在处理Excel文件操作时,我们通常会用到以下几种API接口:

  • Microsoft Office API :这是处理Excel文件最直接的方式,但主要适用于Windows平台。
  • Open XML SDK :为处理 .xlsx 文件提供了一套全面的接口,适用于Office 2007及以上版本。
  • libxl :一个第三方库,支持 .xls .xlsx 文件的读写操作,具有跨平台特性。
  • TinyXML :虽然主要用于解析XML文件,但在处理 .xlsx 文件时,可以辅助解析文件中的XML结构。

5.1.3 API接口的调用方式和示例

以下是一个使用Open XML SDK读取 .xlsx 文件中第一个工作表的数据的示例:

#include <iostream>
#include <openxmltoolkit.h>
using namespace OpenXLSX;

int main() {
    // 打开文件
    XLDocument doc;
    doc.open("example.xlsx");
    // 获取第一个工作表
    auto worksheet = doc.workbook().worksheet("Sheet1");
    // 遍历单元格并打印值
    for (auto& row : worksheet.rows()) {
        for (auto& cell : row.cells()) {
            std::cout << cell.value().get() << " ";
        }
        std::cout << std::endl;
    }
    // 关闭文档
    doc.close();
    return 0;
}

5.2 平台依赖性的问题和解决方案

5.2.1 平台依赖性的定义和影响

平台依赖性指的是软件或程序对特定操作系统、硬件或软件环境的依赖。这种依赖性会导致软件在不同的平台上运行时出现兼容性问题,限制了软件的可移植性和可扩展性。在跨平台开发中,平台依赖性是一个需要特别关注的问题,它可能会影响软件的维护、升级和用户群体。

5.2.2 跨平台编程的最佳实践

为了减少平台依赖性,开发人员可以采取以下最佳实践:

  • 使用跨平台库 :选择如Boost、Qt等跨平台支持的库,而不是依赖于特定平台的API。
  • 抽象接口层 :创建抽象接口层来封装平台相关的调用,如文件系统操作、线程管理等。
  • 虚拟化和容器化 :使用虚拟机或容器技术来隔离不同平台的差异,确保软件在不同环境中的一致性。

5.2.3 虚拟化技术和容器化应用

虚拟化技术和容器化应用是解决平台依赖性问题的有效手段:

  • 虚拟化技术 :通过虚拟机管理程序(如VMware、VirtualBox)创建虚拟机实例,使得应用程序可以在不同硬件平台上运行。
  • 容器化应用 :利用Docker等容器技术,将应用程序及其运行环境打包为容器镜像,确保应用在不同环境中运行的一致性。
graph LR
A[应用程序] -->|依赖| B[虚拟机]
A -->|依赖| C[容器]
B --> D[不同硬件平台]
C --> D

通过上述图表,我们可以看到应用程序通过虚拟机和容器技术,可以有效地减少对特定硬件平台的依赖,实现跨平台运行。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:C++是一种广泛使用的编程语言,尤其在需要高性能和底层控制的应用中。本主题探讨了如何使用C++读写Microsoft Excel文件,这对于数据处理和自动化任务非常重要。由于C++标准库不直接支持Office文档操作,因此需要依赖第三方库。libxl是一个轻量级库,用于操作.xls格式的Excel文件,而TinyXML则适用于解析和生成.xlsx格式的文件。此外,还有一些其他库如pugixml、xlsxwriter和openxml4j,它们提供了更丰富的功能。通过COM接口或Python的pandas库也可以实现对Excel的读写,但具有较强的平台依赖性。开源项目cppexcel提供了一种不依赖于特定库的方式来操作Excel文件。在实际应用中,应根据项目需求选择合适的工具,并注意库的授权协议。本指南涉及文件操作、第三方库集成、数据序列化和反序列化等概念,旨在帮助C++开发者提升数据处理能力。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值