​qDebug()<<QString::fromUtf8(strr.c_str());无法输出正确文本c++

​qDebug()<<QString::fromUtf8(strr.c_str());无法输出正确文本c++,第1张

把strrc_str()和"\u65e0\u6301"当成字符数组,将每一个元素的整型值打印出来对比一下,看是不是有区别:
char str1[20]=strrc_str();
char str2[20]="\u65e0\u6301";
int i;
for( i=0; i<20; i++)
{
printf("%d,",str1[i]);
}
printf("\n");
for( i=0; i<20; i++)
{
printf("%d,",str2[i]);
}
另外,注意一下strrc_str()是否有字符串结束符,utf8的汉字字符串末尾应该要有两到三个0作为结束符。

从程序上来看你收到的是字符串形式的浮点数据。
如果发送方的程序你可以控制,可以加标识头,接收时在字符串中找标识头然后截取出对应的浮点数字符串。
如果发送方的程序不受你控制,就比较麻烦了。因为没有办法区分 123456789这样的到底是1234和56789还是12345和6789……

首先把Excel报表文件保存到一个指定目录下,最好放在可执行程序的子目录下,作为模板文件。可以把报表标题、表头等设置好。这里是保存在trpt子目录下。
然后建一个report目录,作为报表目标文件夹,存放填好数据的报表,可以由用户直接 *** 作。
首先确定在你的机器中装有Office。这里一Office2000为例。
在C++Builder中新建一个工程,在窗体Form1上面放一个两个按钮SaveButton和ReadButton,分别用来保存数据到Excel表和显示刚刚保存的Excel表。
在SaveButton按钮的单击事件中把从数据库中取到的数据放入到指定的Excel表中并将改文件拷贝到report目录下。在ReadButto按钮的单击事件中显示report目录下的报表文件,方便用户修改和另外保存。
在Form1h头文件中定义几个变量:
private:
Variant Ex,Wb,Sheet,ERange,EBorders;
并在文件头中包含如下语句:
#include Excel_2K_SRVRh
#include
在Form1cpp的文件头中加入
#pragma link Excel_2K_SRVR
主要代码如下:
void __fastcall TForm1:: SaveButtonClick(TObject Sender)
{
try
{
SaveButton->Enabled = false;
ReadButton->Enabled = false;//使两个按钮无效
file://取报表文件CardSendxls的完整目录名
AnsiString ExcelFileName = GetCurrentDir()+\\trpt\\tablexls;
if(!FileExists(ExcelFileName))
{
Application->MessageBox(报表模板文件不存在,无法打开!,
错误,MB_ICONSTOP|MB_OK);
return;
}
file://建立Excel的Ole对象Ex
try
{
Ex = Variant::CreateObject(ExcelApplication);
}
catch()
{
Application->MessageBox(无法启动Excel,错误,MB_ICONSTOP|MB_OK);
return;
}
file://设置Excel为不可见
ExOlePropertySet(Visible,false);
file://打开指定的Excel报表文件。报表文件中最好设定只有一个Sheet。
ExOlePropertyGet(WorkBooks)OleProcedure(Open,ExcelFileNamec_str());
Wb = ExOlePropertyGet(ActiveWorkBook);
Sheet = WbOlePropertyGet(ActiveSheet);//获得当前默认的Sheet
file://清空Excel表,这里是用循环清空到第300行。对于一般的表格已经足够了。
AnsiString strRowTemp;
AnsiString strRange;
int iCols,iRows;//记录列数和行数
/从第三行开始,到第300行止。一般第一行是表标题,第二行是副标题或者制表日期。/
for(iRows=3;iRows<300;iRows++)
{ file://假设只有6列。
for (iCols = 1;iCols < 7; iCols++)
{
file://清空行
SheetOlePropertyGet(Cells,iRows,iCols)OlePropertySet(Value,);
}
file://去掉表格边框
strRange = A+IntToStr(iRows)+:F+IntToStr(iRows);//获取 *** 作范围
ERange = SheetOlePropertyGet(Range,strRangec_str());
EBorders = ERangeOlePropertyGet(Borders);//获取边框对象
EBordersOlePropertySet(linestyle,xlNone);
}
AnsiString strPtrDate; file://存放当前日期,作为制表日期
DateSeparator = '-';
ShortDateFormat = yyyy/m/d;//设置为年/月/日格式
strPtrDate = DateToStr(Date());//取当前日期
AnsiString strYear = strPtrDateSubString(1,4);
strPtrDate = strPtrDateSubString(6,strPtrDateLength()-5);
AnsiString strMonth = strPtrDateSubString(1,strPtrDatePos(-)-1);
AnsiString strDay =
strPtrDateSubString(strPtrDatePos(-)+1,
strPtrDateLength()-strPtrDatePos(-));
strPtrDate = strYear+年+strMonth+月+strDay+日;
AnsiString strData = 报表标题;//报表标题
file://将报表标题置于第一行第一列。在此之前,应将报表文件的标题格式设定好。
SheetOlePropertyGet(Cells,1,1)OlePropertySet(Value,
strDatac_str());
file://将制表日期置于表格第二行的右侧。
SheetOlePropertyGet(Cells,2,5)OlePropertySet(Value,
strPtrDatec_str());
iRows = 3;//在第三行放置表格的列名
SheetOlePropertyGet(Cells,iRows,1)OlePropertySet(Value,列名1);
SheetOlePropertyGet(Cells,iRows,2)OlePropertySet(Value,列名2);
SheetOlePropertyGet(Cells,iRows,3)OlePropertySet(Value,列名3);
SheetOlePropertyGet(Cells,iRows,4)OlePropertySet(Value,列名4);
SheetOlePropertyGet(Cells,iRows,5)OlePropertySet(Value,列名5);
SheetOlePropertyGet(Cells,iRows,6)OlePropertySet(Value,列名6);
file://画表格边框,在A3:F3之间取范围
strRange = A+IntToStr(iRows)+:F+IntToStr(iRows);
ERange = SheetOlePropertyGet(Range,strRangec_str());
EBorders = ERangeOlePropertyGet(Borders);
EBordersOlePropertySet(linestyle,xlContinuous);
EBordersOlePropertySet(weight,xlThin);
EBordersOlePropertySet(colorindex,xlAutomatic);
iRows++;
file://从数据库中取数据(略),假设数据集放入Query1中。
Query1->Open();//打开数据集
file://循环取数
while(!Query1->Eof)
{
file://循环取字段的数据放到Excel表对应的行列中
for(iCols=1;iCols<7;iCols++)
{
strRowTemp = Query1->Fields->Fields[iCols-1]->AsString;
SheetOlePropertyGet(Cells,iRows,iCols)OlePropertySet(Value,
strRowTempc_str());
}
file://画该行的表格边框
strRange = A+IntToStr(iRows)+:F+IntToStr(iRows);
ERange = SheetOlePropertyGet(Range,strRangec_str());
EBorders = ERangeOlePropertyGet(Borders);
EBordersOlePropertySet(linestyle,xlContinuous);
EBordersOlePropertySet(weight,xlThin);
EBordersOlePropertySet(colorindex,xlAutomatic);
iRows++;
Query1->Next();
}//while结束
WbOleProcedure(Save);//保存表格
WbOleProcedure(Close);关闭表格
ExOleFunction(Quit);退出Excel
file://定义目标文件名
AnsiString DestinationFile =
GetCurrentDir()+\\report\\tablexls;
file://将刚刚修改的Excel表格文件tablexls拷贝到report目录下
if(!CopyFile(ExcelFileNamec_str(),DestinationFilec_str(),false))
{
Application->MessageBox(复制文件 *** 作失败,Excel文件可能正在使用中!,
错误,MB_ICONSTOP|MB_OK);
return;
}
Application->MessageBox(成功完成报表保存!\n可以按\'打开Excel文件\'
按钮进行报表工作,提示,MB_ICONINFORMATION|MB_OK);
SaveButton ->Enabled = true;
ReadButton ->Enabled=true;
}//try结束
catch()
{
Application->MessageBox( *** 作Excel表格失败!,
错误,MB_ICONSTOP|MB_OK);
WbOleProcedure(Close);
ExOleFunction(Quit);
SaveButton ->Enabled = true;
ReadButton ->Enabled=false;
}
}
至此,完成报表数据的写入工作。如果要对完成的Excel表进行 *** 作,可以点击打开Excel表文件按钮(ReadButton),进行修改,保存,打印等 *** 作。ReadButton的单击事件如下实现:
void __fastcall TForm1:: ReadButtonClick(TObject Sender)
{
try
{
file://指定report目录下的报表文件用于用户 *** 作
AnsiString ExcelFileName =
GetCurrentDir();+\\report\\tablexls;
if(!FileExists(ExcelFileName))
{
Application->MessageBox(Excel表文件不存在,无法打开!,
错误,MB_ICONSTOP|MB_OK);
return;
}
try
{
Ex = Variant::CreateObject(ExcelApplication);
}
catch()
{
Application->MessageBox(无法启动Excel,错误,MB_ICONSTOP|MB_OK);
return;
}
file://使Excel可见
ExOlePropertySet(Visible,true);
file://打开Excel表格文件Tablexls
ExOlePropertyGet(WorkBooks)OleProcedure(Open,ExcelFileNamec_str());
}
catch()
{
Application->MessageBox( *** 作Excel表格错误!,错误,MB_ICONSTOP|MB_OK);
ExOleFunction(Quit);
}
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10547629.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-09
下一篇 2023-05-09

发表评论

登录后才能评论

评论列表(0条)

保存