做到最后可能会只是不能识别汉字,但是能识别英文和数字,有待改进的地方`
`
~~ ***
# 详细步骤见如下
一. 新建一个MFC项目:打开VS2013,文件->新建->项目
三. 双击”打开文件“,进入。cpp代码编写页面,填入以下代码:
Book* book = xlCreateXMLBook();
if (!book)
{
MessageBox(L"failed1");
return;
}
book->load(L"Data2.xlsx");
if (!book->load(L"Data2.xlsx"))
{
MessageBox(L"failed2");
return;
}
Sheet* sheet = book->getSheet(0);
if (!sheet)
{
MessageBox(L"failed3");
return;
}
int rowfirst = sheet->firstRow();
int rowlast = sheet->lastRow();
int colfirst = sheet->firstCol();
int collast = sheet->lastCol();
for (int i = rowfirst + 1; i < rowlast; ++i)
{
CString serial = sheet->readStr(i, 0);
//CString address = sheet->readNum(i, 1);
double number = sheet->readNum(i, 1);
CString ttt;
ttt.Format(L"%.0lf", number);
CString project = sheet->readStr(i, 2);
CString time = sheet->readStr(i, 3);
CString gread = sheet->readStr(i, 4);
CString address = sheet->readStr(i, 5);
mList1.InsertItem(i - 1, serial);//开辟一个行,并且设置行的内容为i的内容
mList1.SetItemText(i - 1, 1, ttt);//i代指在第几行插入数据,第二个参数代指第几列,第三个参数代指插入数据的值
mList1.SetItemText(i - 1, 2, project);
mList1.SetItemText(i - 1, 3, time);
mList1.SetItemText(i - 1, 4, gread);
mList1.SetItemText(i - 1, 5, address);
//mList1.SetItemText(i, 1, number);
}
其中的” Data2.xlsx “文件格式事先我已经将格式做好,将该文件放入项目文件下
四. 接下来用libxl.lib库读取excel文件
工程的配置
1、把include_cpp复制到工程文件夹下,设置包含目录2、把libxl.lib复制到工程文件夹下,附加依赖项:libxl.lib
3、把libxl.dll复制到Debug下
Dlg.cpp下补充头文件与命名空间
#include "libxl.h"
#include
using namespace libxl;
Dlg.cpp下主要代码:
const TCHAR* ReadDataToWChar(Sheet* sheet, int row,int col)
{
CellType type = sheet->cellType(row,col);
TCHAR buff[1024];
switch (type)
{
case 1://Num
{
swprintf_s(buff,1024,_T("%.2lf"),sheet->readNum(row,col));
return buff;
}
case 2://Str
{
return sheet->readStr(row,col);
}
default:
{
return _T("读取错误!");
}
}
}
void CExcelTestDlg::OnBnClickedButton1()
{
//初始化
Book* book = xlCreateBook();
//if(!book) return -1;
//book->load("00.xls"); //直接读的方式
//创建两个表,一个为“测试写”,一个为“测试读”
Sheet* sheet = book->addSheet(_T("测试写"));
Sheet* sheet1 = book->addSheet(_T("测试读"));
//sheet = book->getSheet(0);
//创建出错返回
//if(!sheet || !sheet1) return -2;
///设置格式//
//设置字体
//libxl::Font* font = book->addFont();
//font->setName(_T("0"));
//font->setSize(20);
//font->setColor(COLOR_DARKBLUE);
//font->setItalic();
//设置样式
Format* StrFormat = book->addFormat();
//StrFormat->setAlignH(ALIGNH_LEFT);
//StrFormat->setBorder(BORDERSTYLE_MEDIUMDASHDOTDOT);
//StrFormat->setBorderColor(COLOR_RED);
//StrFormat->setFont(font);
Format* dateFormat = book->addFormat();
//dateFormat->setNumFormat(NUMFORMAT_DATE);
Format* NumFormat = book->addFormat();
//NumFormat->setNumFormat(NUMFORMAT_NUMBER);
//Format* NumFormat1 = book->addFormat();
//NumFormat1->setNumFormat(NUMFORMAT_NUMBER_D2);
/你提出的要求的测试代码/
//读EDIT写入EXCEL
CString str;
GetDlgItemText(IDC_WRITE, str);//得到字符串
sheet->writeStr(0, 0, str, StrFormat);//0行0列
//读EXCEL写入EDIT
CString str2;
str2 = ReadDataToWChar(sheet,0,0);//0行0列
SetDlgItemText(IDC_READ, str2);
/你提出的要求的测试代码/
//以下为自由发挥部分
///写数据///
sheet->writeStr(2, 0, _T("Hello, World !"),StrFormat);
sheet->writeNum(4, 0, 1000,NumFormat);
//sheet->writeNum(5, 0, 20.98,NumFormat1);
sheet->writeFormula(6, 0, _T("SUM(A5:A6)"));
sheet->writeNum(8, 0, book->datePack(2012, 05, 17), dateFormat);
//循环写
for (int i = 0;i < 200;i++)
{
sheet->writeStr(i, 2, _T("Hello, World !"),StrFormat);
sheet->writeNum(i, 3, i);
}
///读数据///
for (int i = 0;i < 200;i++)
{
sheet1->writeStr(i, 0,ReadDataToWChar(sheet,i,2));
sheet1->writeStr(i, 3,ReadDataToWChar(sheet,i,3));
sheet1->setCellFormat(i,3,StrFormat);
}
///保存///
if(book->save(_T("00.xls")))
{
// ::ShellExecute(NULL, _T("open"), _T("00.xls"), NULL, NULL, SW_SHOW);
}
else
{
std::cout << book->errorMessage() << std::endl;
}
book->release();
}
我当时是参考的这片文章,可以去看一下【mfc】excel读写——libxl.lib库
五. ” 全选 “按键代码
// TODO: 在此添加控件通知处理程序代码
for (int i = 0; i < mList1.GetItemCount(); i++)
{
if (mList1.GetCheck(i) == FALSE) //未被选中的
{
mList1.SetCheck(i, TRUE);
}
else //选中的
{
mList1.SetCheck(i, FALSE);
}
}
六. 接下来就就最好去找一个服务器可以发短信,这里用的是阿里云的
经过操作,最主要的就是拿到 短信签名signName、模板**templateCode、accessKeyId、accessKeySecret。为后续的代码准备**
七. 在阿里云注册好账号有了ID后就接下来的操作:Windows下 VS2013编译,配置C/C++ libcurl开发环境
具体步骤可以参考这篇文章:Windows下 VS2013编译,配置C/C++libcurl开发环境
编译配置环境:
IDE:Visual Studio 2013
Env:Win 10
libcurl_version:curl 7.64.0
官网下载地址:https://curl.haxx.se/download.html
八. 构建libcurl静态库 (这里编译x64的release版本)
下载到本地解压后,留意红色框选的winbuild目录:
2,打开命令提示符
“开始”菜单——>Visual Studio 2013——>Visual Studio Tools——>VS2013 开发人员命令提示。
打开如下窗口(本机64位,这里选择红色框选快捷命令):
3,编译libcurl库
命令窗口切换到刚刚解压的源码文件夹的winbuild目录下
命令解析:
nmake是MS的编译工具
/f 参数描述文件名不使用默认的makefile
Makefile.vc 是winbuild里的makefile文件
mode=static 编译静态链接库
vc=12 是VC++版本号MACHINE=64,64位lib库DEBUG=no,是否是debug版本(这里是release版本)。更多详细命令参数,参考winbuild文件夹中的BUILD.WINDOWS.txt查看。
回车,等待编译完成,关闭命令行界面。此时会在curl根目录下,生成一个builds文件夹:
打开builds文件夹,其中libcurl-vc12-x64-release-static-ipv6-sspi-winssl 文件夹包含了我们需要的运行库和头文件(可将该目录拷贝至其他位置,若方便后续使用)。
***这一步可做可不做***
> 打开builds文件夹,其中libcurl-vc12-x64-release-static-ipv6-sspi-winssl
> 文件夹包含了我们需要的运行库和头文件(可将该目录拷贝至其他位置,若方便后续使用)。
九. 在Visual Studio中链接libcurl
1,在Visual Studio中,右键单击解决方案资源管理器中的项目,然后单击“属性”。
2,配置属性> C / C ++>常规>其他包含目录:添加F:\curl-7.64.0\builds\libcurl-vc12-x64-release-static-ipv6-sspi-winssl\include。
3,配置属性>链接器>常规>其他库目录:添加F:\curl-7.64.0\builds\libcurl-vc12-x64-release-static-ipv6-sspi-winssl\lib
将以下lib添加至工程!
libcurl_a.lib;Ws2_32.lib;Wldap32.lib;winmm.lib;Crypt32.lib;Normaliz.lib;
使用了静态编译libcurl,所以需要将CURL_STATICLIB预编译添加至工程。
如果没有编译debug版libcurl,则需要将“Runtime Library”改为Release版(即后面不带小写字母d)。同时官方并不建议使用“/MT”或“/MTd”。
注意此处设置修改为和上述设置一致。
// ConsoleApplication3.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include
#include
#include
#include
#include
//#include
#define bzero(a, b) memset(a, 0, b)
#pragma warning(disable:4996)
#define MAXPARAM 2048
CURL* curl;
CURLcode res;
/**
bingone
本样例依赖libcurl库
下载地址 https://curl.haxx.se/download.html
**/
// 修改为您的apikey(https://www.yunpian.com)登录官网后获取
char* apikey = "你自己的apikey";
// 修改为您要发送的手机号
char* mobile = "159570";
// 设置您要发送的内容
char* text = "您的验证码是1234";
// 指定发送的模板id
int tpl_id = 3569052;
// 指定发送模板内容
char* tpl_data[4] = { "#name#", "www", "#code#", "444" };
// 发送语音验证码内容
int code = 1234;
// 获取user信息url
char* url_get_user = "你自己的url";
// 智能模板发送短信url
// 指定模板发送短信url
char* url_tpl_sms = "你自己的url";
// 发送语音验证码短信url
// ar * url_send_voice = "你自己的url";
void send_data(char* url, char* data)
{
// specify the url
curl_easy_setopt(curl, CURLOPT_URL, url);
// specify the POST data
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
// get response data
curl_easy_perform(curl);
printf("\n\n");
}
/**
* 指定模板单发
*/
void send_tpl_sms(char* apikey, char* mobile, int tpl_id, char* tpl_value)
{
char params[MAXPARAM + 1];
char* cp = params;
sprintf(params, "apikey=%s&mobile=%s&tpl_id=%d&tpl_value=%s", apikey, mobile,
tpl_id, tpl_value);
send_data(url_tpl_sms, params);
}
int main(void)
{
curl = curl_easy_init();
mobile = curl_easy_escape(curl, mobile, strlen(mobile));
if (NULL == curl) {
perror("curl open fail\n");
}
// 获取用户信息
//get_user(apikey);
// 发送语音验证码
// nd_voice(apikey, mobile, code);
char* tmp;
char* tpl_value = (char*)malloc(sizeof(char) * 500);
bzero(tpl_value, sizeof(char) * 500);
// 模板短信发送需要编码两次,第一次URL编码转换
int len = 0;
tmp = curl_easy_escape(curl, tpl_data[0], strlen(tpl_data[0]));
memcpy(tpl_value + len, tmp, strlen(tmp));
len += strlen(tmp);
tpl_value[len++] = '=';
tmp = curl_easy_escape(curl, tpl_data[1], strlen(tpl_data[1]));
memcpy(tpl_value + len, tmp, strlen(tmp));
len += strlen(tmp);
tpl_value[len++] = '&';
tmp = curl_easy_escape(curl, tpl_data[2], strlen(tpl_data[2]));
memcpy(tpl_value + len, tmp, strlen(tmp));
len += strlen(tmp);
tpl_value[len++] = '=';
tmp = curl_easy_escape(curl, tpl_data[3], strlen(tpl_data[3]));
memcpy(tpl_value + len, tmp, strlen(tmp));
len += strlen(tmp);
tmp = tpl_value;
// 第二次URL编码
tpl_value = curl_easy_escape(curl, tpl_value, strlen(tpl_value));
send_tpl_sms(apikey, mobile, tpl_id, tpl_value);
free(tmp);
curl_easy_cleanup(curl);
return 0;
}
将代码运行一遍便可以接受到短信了,但是现在属于用C++控制套程序发送短信,并没有用到MFC的” 发送短信“按键,还待后续继续完善
这里推荐一个关于MFC与云片程序相结合的网站,写的很全----云片