使用LibXL库,轻松读写Excel表格

本文介绍了如何使用LibXL库在C++中进行Excel文件的读写操作,包括生成工作表、写入数据、读取数据和插入图片。该库支持xls/xlsx格式,跨平台且无需依赖Excel。文章提供了详细配置教程和代码示例,同时也分享了获取免费许可证密钥的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

介绍

功能

性能

下载

配置

例子1: 生成工作表,并写入数据

例子2: 读数据

例子3: 插入图片

获取许可证密钥


介绍

        LibXl库不依赖Excel和NET框架可以读写Excel文件。 LibXl库可用于 C、C++、C#、PHP、Python等语言。支持 Excel 97-2003二进制格式(xls)、 Excel2007-2021 XML 格式(xlsx/xlsm),并且支持多个平台windows、Linux、Mac等。

功能

        LibXl库支持表格的创建、读取、编辑,支持多种格式选项:对齐、边框、颜色、填充模式、字体、合并单元格等。支持向表格中插入图片。

性能

        LibXl库可以轻松得将数据导入至Excel,或者从Excel中提取数据。性能相当可以,数字的写入速度约为每秒2100,000个单元,二进制xls格式的8字符随机字符串的写入速度约为每秒240000个单元。

下载

        LibXL库官网地址:C++ Excel Library to read/write xls/xlsx files - LibXL

        LibXL库下载地址:LibXL download

        LibXL库4.1.1下载地址: https://www.libxl.com/download/libxl-win-4.1.1.zip

(我们下载“Libxl for Windows 4.1.1”,并以c++为例介绍)

配置

 手动将下图的libxl.dll,复制到生成的动态链接库(*.dll)或者程序文件(*.exe)相同的文件夹。

例子1: 生成工作表,并写入数据

代码

#include <iostream>
#include <windows.h>
#include "libxl.h"

using namespace libxl;

//新建的表格文件名称
const wchar_t* filename = L"custom.xlsx";

int main() 
{	
    Book* book = xlCreateXMLBook();
    //book->setKey(输入key,文章最后送大家Libxl最新库4.4.1 的 KEY)

    if(book)
    {
        int f[6];

        f[0] = book->addCustomNumFormat(L"0.0");
        f[1] = book->addCustomNumFormat(L"0.00");
        f[2] = book->addCustomNumFormat(L"0.000");
        f[3] = book->addCustomNumFormat(L"0.0000");
        f[4] = book->addCustomNumFormat(L"#,###.00 $");
        f[5] = book->addCustomNumFormat(L"#,###.00 $[Black][<1000];#,###.00 $[Red][>=1000]");

        Format* format[6];
        for(int i = 0; i < 6; ++i) 
        {
            format[i] = book->addFormat();
            format[i]->setNumFormat(f[i]); //格式
        }

        Sheet* sheet = book->addSheet(L"Custom formats"); //新建sheet
        if(sheet)
        {
            sheet->setCol(0, 0, 20); //设置第一列到第一列的宽度为20
            sheet->writeNum(3, 0, 25.718, format[0]); //写入数据并设置格式  第3行第1列
            sheet->writeNum(4, 0, 25.718, format[1]); //写入数据并设置格式
            sheet->writeNum(5, 0, 25.718, format[2]); //写入数据并设置格式
            sheet->writeNum(6, 0, 25.718, format[3]); //写入数据并设置格式v

            sheet->writeNum(8, 0, 1800.5, format[4]);//写入数据并设置格式

            sheet->writeNum(10, 0, 500, format[5]); //写入数据并设置格式
            sheet->writeNum(11, 0, 1600, format[5]); //写入数据并设置格式

            sheet->writeStr(2, 0, L"王牌飞行员_里海");//写入字符串 第2行第1列
            sheet->writeNum(2, 1, 1000);//写入数据 第2行第2列
        }

        if(book->save(filename))
        {
            //打开表格文件
            ::ShellExecute(NULL, L"open", filename, NULL, NULL, SW_SHOW);
        }

        book->release();		
    } 
    	
    return 0;
}

例子2: 读数据

  代码

#include <iostream>
#include "libxl.h"

using namespace libxl;

const wchar_t* filename = L"F:\\example.xlsx";

int main() 
{
    Book* book = xlCreateXMLBook();
    //book->setKey(输入key,文章最后送大家Libxl最新库4.4.1 的 KEY)

    if(book)
    {
        if(book->load(filename))
        {
            Sheet* sheet = book->getSheet(0);
            if(sheet)
            {
                const wchar_t* s = sheet->readStr(2, 1);
                if(s) std::wcout << s << std::endl << std::endl;                
                
                std::cout << sheet->readNum(4, 1) << std::endl;
                std::cout << sheet->readNum(5, 1) << std::endl;
                const wchar_t* f = sheet->readFormula(6, 1);
                if(f) std::wcout << f << std::endl << std::endl;

                int year, month, day;
                book->dateUnpack(sheet->readNum(8, 1), &year, &month, &day);
                std::cout << year << "-" << month << "-" << day << std::endl;
            }
        }

        book->release();
    }

    return 0;
}

例子3: 插入图片

 代码

#include <iostream>
#include <windows.h>
#include "libxl.h"

using namespace libxl;

//新建的表格文件名称
const wchar_t* filename = L"custom.xlsx";

int main()
{
    Book* book = xlCreateXMLBook();
    //book->setKey(输入key,文章最后送大家Libxl最新库4.4.1 的 KEY)
    if (book)
    {
        Sheet* sheet = book->addSheet(L"addPictureSheet_lihai"); //新建sheet
        if (sheet)
        {
            int picID = book->addPicture(L"F:\\QQ3123197280图片.jpg");
            sheet->setPicture(2, 1, picID); //设置位置为底3行,第2列
        }

        if (book->save(filename))
        {
            //打开表格文件
            ::ShellExecute(NULL, L"open", filename, NULL, NULL, SW_SHOW);
        }

        book->release();
    }

    return 0;
}

获取许可证密钥

        使用此库需要注册,否则如果是写表格,它将在每个电子表格的第一行写一个横幅广告。

        如果是读表格,则它将只能读取300个单元格(第一行不可用)。购买许可证密钥,可以消除这个限制。199欧

补充(梅雷):

注意 有时候类型不一定是 CELLTYPE_BLANK 很多人中招
不判断if (temp)如果直接用string value = temp;会内存错误但不会马上出问题而是 累计到定程度后爆发。

        const wchar_t* temp = sheet->readStr(row, col);
        if (temp)
        {
            value = MeiLei::Trim(MeiLei::WcharToString(temp));
        }


 

&lt;think&gt;好的,我现在需要帮助用户解决如何使用libXLExcel中进行行列互换,同时保持格式和合并单元格的问题。首先,我需要了解libXL的基本功能和API,因为用户提到了要使用这个进行读写操作。根据引用[2],用户可能需要先掌握创建新工作簿、添加工作表以及读写单元格数据的基础操作。 接下来,用户的需求是行列互换,也就是转置操作。通常,转置一个表格需要将行和列的数据交换位置。例如,原来的第i行第j列的数据会变成新表的第j行第i列。但是,如果原表格中有合并单元格,直接转置可能会导致合并区域不正确,需要特别处理。 然后,保持原有格式和合并单元格是一个挑战。libXL是否支持获取和设置单元格的格式?比如字体、颜色、边框等属性。另外,合并单元格的信息也需要在转置时进行调整。例如,原合并区域是A1到C1(横向合并),转置后应该变成A1到A3(纵向合并)。因此,在转置过程中,需要遍历所有合并区域,调整它们的起始和结束行列位置。 接下来,我需要考虑如何具体实现。首先,读取原Excel文件,获取所有单元格的数据、格式以及合并区域的信息。然后,创建新的工作簿,将原数据的行列索引交换,同时应用对应的格式。对于合并单元格,需要将每个合并区域的起始行、列和结束行、列进行交换,然后在新表中重新创建这些合并区域。 可能遇到的问题包括:如何处理不同行或列的不同格式?例如,某一列可能有特定的列宽或格式,转置后可能需要调整行高或列宽。此外,转置后的合并区域是否正确,是否会有重叠或遗漏的情况? 根据引用[1],用户之前可能处理过合并单元格的生成和读取,因此可以参考相关代码结构。例如,在生成合并单元格时,需要指定起始和结束的行列。同样的,在转置时,需要将这些参数的行列值互换。 现在,我需要将这些步骤转化为具体的代码示例。首先使用libXL读取原文件,遍历每个单元格,获取其值和格式。然后,在写入新文件时,将原行号作为列号,原列号作为行号。对于合并单元格,遍历每个合并区域,交换起始和结束的行列,再添加到新工作表中。 最后,测试代码是否正确处理了格式和合并单元格,可能需要实际运行并检查生成的Excel文件是否符合预期。如果有问题,可能需要调试格式复制或合并区域的调整部分。&lt;/think&gt;### 使用libXL实现Excel行列互换并保留格式和合并单元格的方法 #### 1. **基础读写操作** 首先通过libXL读取原Excel文件,获取单元格数据、格式及合并单元格信息: ```python import libxl # 读取原文件 book = libxl.Book(r&quot;input.xlsx&quot;) sheet = book.get_sheet(0) # 获取总行数和列数 rows = sheet.rows cols = sheet.cols # 遍历单元格数据及格式 data = [] formats = [] for r in range(rows): row_data = [] row_formats = [] for c in range(cols): cell_value = sheet.read(r, c) cell_format = sheet.get_cell_format(r, c) # 获取格式对象 row_data.append(cell_value) row_formats.append(cell_format) data.append(row_data) formats.append(row_formats) # 获取合并单元格信息 merged_cells = [] for i in range(sheet.merged_cells_count()): merged = sheet.merged_cell(i) merged_cells.append(merged) # 格式如 (start_row, start_col, end_row, end_col) ``` #### 2. **行列互换核心逻辑** 交换行与列索引,同时调整合并区域: ```python # 创建新工作簿 new_book = libxl.Book() new_sheet = new_book.add_sheet(&quot;转置结果&quot;) # 写入转置后的数据及格式 for r in range(rows): for c in range(cols): new_sheet.write(c, r, data[r][c]) # 行列索引互换 new_sheet.set_cell_format(c, r, formats[r][c]) # 应用原格式 # 转置合并单元格
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王牌飞行员_里海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值