xlsxio全平台(x86、arm32、arm64 )编译、测试,使用编译脚本10分钟快速编译!

大家都知道编译xlsxio需要先编译各种依赖库(zlib、minzip、libexpat),如果再加上交叉编译,相当于需要重复的编译12次,这中间还不能出差错,确实挺麻烦的!

所以为了方便编译,写了这个编译脚本,只需要执行三次脚本(或着合成一个脚本)就可以一键的编译各种架构的xlsxio库!

脚本和文件地址:https://blog.csdn.net/T19900/article/details/150213893

一、创建编译文件夹xlsxio

1、复制脚本

已经将各个平台的编译流程集成到了脚本,直接将x86 arm32 arm64编译脚本复制到xlsxio文件夹

2、复制依赖库

xlsxio编译需要依赖各种库,为了避免编译过程中网络问题导致编译失败,需要手动下载库,并保存到xlsxio文件夹

2.1 下载zlib

地址:https://github.com/madler/zlib

说明:默认是使用zlib-1.2.13.tar.gz,如果对版本有要求需要修改编译脚本为对应的版本

 

2.2 下载libexpat

地址:https://github.com/libexpat/libexpat/releases/tag/R_2_7_1

说明:默认是使用expat-2.7.1.tar.gz,如果对版本有要求需要修改编译脚本为对应的版本

 

2.3 克隆xlsxio库

在xlsxio文件夹下执行克隆命令将xlsxio库克隆到本地

 
git clone https://github.com/brechtsanders/xlsxio.git

二、检查目录执行编译命令

第一步执行完后,xlsxio文件夹下面应该有下面的文件

 

此时执行不同架构的编译脚本即可编译相应架构的xlsxio动态库了,现在以build_xlsxio_x86_64.sh为例演示下x86下xlsxio动态库的编译

编译脚本的编译链可以根据实际情况进行修改,目前默认的三种编译链

 
x86系统:gcc

arm32:arm-linux-gnueabihf

arm64:aarch64-linux-gnu

终端进入xlsxio文件夹

2.1 授予脚本可执行权限

chmod +x xlsxio

2.2 执行脚本

./build_xlsxio_x86_64.sh

 

脚本执行成功

 

最后生成的库在install_x86_64文件夹下面

 

 

三、使用测试程序测试

1、编写测试程序 test_xlsxio.c

 
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "xlsxio_read.h"

#include "xlsxio_write.h"

// 测试数据结构
typedef struct {

    char name[50];
    int age;
    double salary;
    char department[30];
} Employee;


// 测试数据

Employee test_data[] = {

    {"张三", 28, 8500.50, "技术部"},

    {"李四", 32, 9200.00, "销售部"},

    {"王五", 25, 7800.75, "人事部"},

    {"赵六", 35, 12000.00, "管理部"},

    {"钱七", 29, 8900.25, "技术部"}

};

  

int test_write_excel(const char* filename) {

    printf("开始测试 Excel 写入功能...\n");

    // 创建 Excel 写入对象

    xlsxiowriter handle = xlsxiowrite_open(filename, "Sheet1");

    if (!handle) {

        printf("错误:无法创建 Excel 文件 %s\n", filename);

        return -1;

    }

    // 写入表头

    xlsxiowrite_add_cell_string(handle, "姓名");

    xlsxiowrite_add_cell_string(handle, "年龄");

    xlsxiowrite_add_cell_string(handle, "薪资");

    xlsxiowrite_add_cell_string(handle, "部门");

    xlsxiowrite_next_row(handle);

    // 写入数据

    int data_count = sizeof(test_data) / sizeof(Employee);

    for (int i = 0; i < data_count; i++) {

        xlsxiowrite_add_cell_string(handle, test_data[i].name);

        xlsxiowrite_add_cell_int(handle, test_data[i].age);

        xlsxiowrite_add_cell_float(handle, test_data[i].salary);

        xlsxiowrite_add_cell_string(handle, test_data[i].department);

        xlsxiowrite_next_row(handle);

    }

    // 关闭文件

    xlsxiowrite_close(handle);

    printf("Excel 文件写入完成:%s\n", filename);

    printf("写入了 %d 行数据(包含表头)\n", data_count + 1);

    return 0;

}

  

int test_read_excel(const char* filename) {

    printf("\n开始测试 Excel 读取功能...\n");

    // 打开 Excel 文件

    xlsxioreader xlsxioread = xlsxioread_open(filename);

    if (!xlsxioread) {

        printf("错误:无法打开 Excel 文件 %s\n", filename);

        return -1;

    }

    // 获取工作表

    xlsxioreadersheet sheet = xlsxioread_sheet_open(xlsxioread, NULL, XLSXIOREAD_SKIP_EMPTY_ROWS);

    if (!sheet) {

        printf("错误:无法打开工作表\n");

        xlsxioread_close(xlsxioread);

        return -1;

    }

    printf("从 Excel 文件读取的数据:\n");

    printf("%-10s %-6s %-10s %-10s\n", "姓名", "年龄", "薪资", "部门");

    printf("----------------------------------------\n");

    char* value;

    int row = 0;

    int col = 0;

    // 读取数据

    while (xlsxioread_sheet_next_row(sheet)) {

        row++;

        col = 0;

        // 跳过表头行

        if (row == 1) {

            // 读取并丢弃表头

            while ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {

                free(value);

            }

            continue;

        }

        // 读取数据行

        char name[50] = "";

        char age_str[20] = "";

        char salary_str[20] = "";

        char department[30] = "";

        // 读取姓名

        if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {

            strncpy(name, value, sizeof(name) - 1);

            free(value);

        }

        // 读取年龄

        if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {

            strncpy(age_str, value, sizeof(age_str) - 1);

            free(value);

        }

        // 读取薪资

        if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {

            strncpy(salary_str, value, sizeof(salary_str) - 1);

            free(value);

        }

        // 读取部门

        if ((value = xlsxioread_sheet_next_cell(sheet)) != NULL) {

            strncpy(department, value, sizeof(department) - 1);

            free(value);

        }

        printf("%-10s %-6s %-10s %-10s\n", name, age_str, salary_str, department);

    }

    // 关闭文件

    xlsxioread_sheet_close(sheet);

    xlsxioread_close(xlsxioread);

    printf("Excel 文件读取完成\n");

    return 0;

}

  

int main() {

    const char* test_file = "test_employee.xlsx";

    printf("=== xlsxio 库测试程序 ===\n\n");

    // 测试写入

    if (test_write_excel(test_file) != 0) {

        printf("写入测试失败\n");

        return 1;

    }

    // 测试读取

    if (test_read_excel(test_file) != 0) {

        printf("读取测试失败\n");

        return 1;

    }

    printf("\n=== 所有测试完成 ===\n");

    printf("测试文件:%s\n", test_file);

    return 0;

}

2、编写编译脚本compile_test.sh

 
#!/bin/bash

# xlsxio 测试程序编译脚本

# 支持不同架构的编译


set -e

# 默认参数
ARCH="x86_64"
CLEAN=false


# 解析命令行参数
while [[ $# -gt 0 ]]; do

    case $1 in

        --arch)

            ARCH="$2"

            shift 2

            ;;

        --clean)

            CLEAN=true

            shift

            ;;

        -h|--help)

            echo "用法: $0 [选项]"

            echo "选项:"

            echo "  --arch ARCH    指定架构 (x86_64, arm, aarch64)"

            echo "  --clean        清理编译文件"

            echo "  -h, --help     显示帮助信息"

            exit 0

            ;;

        *)

            echo "未知选项: $1"

            echo "使用 -h 或 --help 查看帮助"

            exit 1

            ;;

    esac

done

  

# 设置路径

INSTALL_DIR="$(pwd)/install_${ARCH}"

TEST_PROGRAM="test_xlsxio_${ARCH}"

  

# 清理功能

if [ "$CLEAN" = true ]; then

    echo "清理编译文件..."

    rm -f test_xlsxio_* *.o

    echo "清理完成"

    exit 0

fi

  

# 检查安装目录

if [ ! -d "$INSTALL_DIR" ]; then

    echo "错误:找不到安装目录 $INSTALL_DIR"

    echo "请先运行对应架构的编译脚本:build_xlsxio_${ARCH}.sh"

    exit 1

fi

  

# 检查必要的库文件

REQUIRED_LIBS=(

    "$INSTALL_DIR/lib/libxlsxio_read.a"

    "$INSTALL_DIR/lib/libxlsxio_write.a"

    "$INSTALL_DIR/lib/libminizip.a"

    "$INSTALL_DIR/lib/libexpat.a"

    "$INSTALL_DIR/lib/libz.a"

)

  

for lib in "${REQUIRED_LIBS[@]}"; do

    if [ ! -f "$lib" ]; then

        echo "错误:找不到库文件 $lib"

        echo "请确保 xlsxio 库已正确编译"

        exit 1

    fi

done

  

# 设置编译器

case $ARCH in

    x86_64)

        CC="gcc"

        ;;

    arm)

        CC="arm-linux-gnueabihf-gcc"

        ;;

    aarch64)

        CC="aarch64-linux-gnu-gcc"

        ;;

    *)

        echo "错误:不支持的架构 $ARCH"

        echo "支持的架构:x86_64, arm, aarch64"

        exit 1

        ;;

esac

  

# 检查编译器

if ! command -v $CC &> /dev/null; then

    echo "错误:找不到编译器 $CC"

    if [ "$ARCH" != "x86_64" ]; then

        echo "请安装交叉编译工具链"

    fi

    exit 1

fi

  

echo "开始编译 xlsxio 测试程序..."

echo "架构: $ARCH"

echo "编译器: $CC"

echo "安装目录: $INSTALL_DIR"

  

# 编译命令

CFLAGS="-Wall -O2 -I$INSTALL_DIR/include"

LDFLAGS="-L$INSTALL_DIR/lib"

LIBS="-lxlsxio_write -lxlsxio_read -lminizip -lexpat -lz"

  

echo "执行编译命令..."

$CC $CFLAGS $LDFLAGS test_xlsxio.c $LIBS -o $TEST_PROGRAM

  

if [ $? -eq 0 ]; then

    echo "编译成功!"

    echo "可执行文件: $TEST_PROGRAM"

    echo ""

    echo "运行测试程序:"

    if [ "$ARCH" = "x86_64" ]; then

        echo "  ./$TEST_PROGRAM"

    else

        echo "  将 $TEST_PROGRAM 复制到目标设备运行"

        echo "  目标设备需要设置库路径:"

        echo "  export LD_LIBRARY_PATH=$INSTALL_DIR/lib:\$LD_LIBRARY_PATH"

    fi

    # 显示文件信息

    echo ""

    echo "文件信息:"

    ls -lh $TEST_PROGRAM

    file $TEST_PROGRAM

else

    echo "编译失败!"

    exit 1

fi

3、编译运行测试

 
 ./compile_test.sh

 ./test_xlsxio_x86_64

测试结果

 

生成的文件

posted @ 2025-08-11 14:54  IT技术视界  阅读(53)  评论(0)    收藏  举报