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
测试结果
生成的文件