最近工作需要,需要读写 excel,在网上看了好几个教程,尤其是基于 MFC 库的那个,配置起来太难了,死活加载不上 worksheets 跟 workbooks 头文件 ,放弃ing
无意间看到 libxl 读单元格的例子,顿觉清新明了眼前一亮,研究了一下午,掌握基本操作。
libxl 下载官网:http://www.libxl.com/
libxl 函数说明:http://www.libxl.com/documentation.html
下载包里有各类语言 example,百度上有说明,比较详细
网址:http://wenku.baidu.com/view/8ff2d43a0912a2161479299f.html?from=search
环境配制简单,libxl.lib、libxl.dll、include 头文件直接放到工程目录下取,没多大。
example 上面主要是 xls 文件,说一下 xlsx 文件的读写吧。
Book * bookxml = xlCreateXMLBook();
bool xmload = bookxml->load(path);
Sheet * sheetxml = bookxml->getSheet(0);
path 是文件路径,const wchar_t * 格式,如果调用的话需要注意格式问题,宽字符毕竟还是麻烦。
不带汉字的路径
string path1;
wstring path2(path1.begin(), path1.end());
const wchar_t * path = path2.c_str();
可以直接转换,很方便,带汉字比较麻烦,转换如下:
int lenth = MultiByteToWideChar(CP_ACP, 0, filepath.c_str(), filepath.size(), NULL, 0);
if(lenth < 0)return -2;
wchar_t * path = new wchar_t[lenth+1];
if(path == NULL)return -2;
MultiByteToWideChar(CP_ACP, 0, filepath.c_str(), filepath.size(), path, lenth);
path[lenth] = '\0';
filepath 为 string 类型。
getSheet(0)表示取第一个sheet页。
Format * xmlmat = bookxml->addFormat();
xmlmat->setBorder(BORDERSTYLE_THIN);
xmlmat->setAlignH(ALIGNH_CENTER);
设置单元格边框及居中
libxl::Font * xmlfont = bookxml->addFont();
xmlfont->setBold();
xmlfont->setSize(11);
设置字体大小及粗细,Size 可用,bold 无效,鬼知道什么原因
读写注意宽字符
swprintf(val, L"%S ", data1[k].c_str());
sheetxml->writeStr(nk, k+1, val);
合并单元格
sheetxml->setMerge(height, height, 5, 6);
para1起始行,para2结束行,para3起始列,para4结束列
合并后写的话要特别注意,如合并5,6,实际单元格6还在,写入5或者写入6效果相同。
差不多就这样吧。