InsertExcel.cpp
上传用户:haiweijt
上传日期:2018-02-23
资源大小:8195k
文件大小:9k
源码类别:

Telnet服务器

开发平台:

Visual C++

  1. #include "InsertExcel.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <ole2.h>
  6. #ifdef UNICODE 
  7. #define _T(x) L##x 
  8. #else 
  9. #define _T(x) x 
  10. #endif 
  11. InsertExcel::InsertExcel()
  12. {
  13. m_Offset=0;
  14. m_str=0;
  15.  m_zhi=0;//判断执行了命令
  16.  m_zhizhen=0;//用于判断一条记录占多行
  17. filename.vt = VT_BSTR;
  18. filename.bstrVal = SysAllocString(L"c:\test.xls");
  19. flag=1;
  20. m_flag=10;
  21. for(int k=0;k<420;k++)
  22. { for(int t=0;t<6;t++)
  23. {
  24. strcpy(v_str[k][t]," ");
  25. }
  26. }
  27. }
  28. InsertExcel::~InsertExcel()
  29. {
  30. //pXlRange->Release();
  31. AutoWrap(DISPATCH_METHOD, NULL, pXlSheet, L"SaveAs", 1, filename);
  32. pXlSheet->Release();
  33. pXlBook->Release();
  34. pXlBooks->Release();
  35. pXlApp->Release();
  36. VariantClear(&arr);
  37. // 注销COM库
  38. CoUninitialize();
  39. }
  40. void InsertExcel::Insert(char* buf, int size)
  41. {
  42. if (size == 0)
  43. return;
  44. unsigned char tmpc = *(unsigned char *)buf;
  45. switch(tmpc)
  46. {
  47. case 8:
  48. if (m_Offset > 0)
  49. m_Offset --;
  50. break;
  51. case 13:
  52. m_Buffer[m_Offset++] = 'x0d';
  53. break;
  54. case 10:
  55. m_Buffer[m_Offset++] = 'x0a';
  56. m_Buffer[m_Offset] = '';
  57. InsertInto(m_Buffer);
  58. //dwStr(m_Buffer);
  59. strcpy(m_Buffer,"");
  60. m_Offset = 0;
  61. break;
  62. default:
  63. m_Buffer[m_Offset++] = buf[0];
  64. break;
  65. }
  66. Insert(buf+1, size-1);
  67. }
  68. int InsertExcel::InsertInto(char* str)
  69. {
  70. char ** p;
  71. if(flag==1)
  72. {
  73. // 初始化COM库
  74. CoInitialize(NULL);
  75. // 获得EXCEL的CLSID
  76. CLSID clsid;
  77. HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
  78. if(FAILED(hr)) {
  79.    ::MessageBox(NULL, _T("CLSIDFromProgID() 函数调用失败!"),_T("错误"), 0x10010);
  80.   return -1;
  81. }
  82. // 创建实例
  83. //IDispatch *pXlApp;
  84. hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
  85. if(FAILED(hr)) {
  86.    ::MessageBox(NULL, _T("请检查是否已经安装EXCEL!"), _T("错误"), 0x10010);
  87.   return -2;
  88. }
  89. // 显示,将Application.Visible属性置1
  90. VARIANT x;
  91. x.vt = VT_I4;
  92. x.lVal = 1;
  93. AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, x);
  94. // 获取Workbooks集合
  95. //IDispatch *pXlBooks;
  96. {
  97. VARIANT result;
  98. VariantInit(&result);
  99. AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
  100. pXlBooks = result.pdispVal;
  101. }
  102. // 调用Workbooks.Add()方法,创建一个新的Workbook
  103. //IDispatch *pXlBook;
  104. {
  105. VARIANT result;
  106. VariantInit(&result);
  107. AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
  108. pXlBook = result.pdispVal;
  109. }
  110. // 从Application.ActiveSheet属性获得Worksheet对象
  111. //IDispatch *pXlSheet;
  112. {
  113. VARIANT result;
  114. VariantInit(&result);
  115. AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
  116. pXlSheet = result.pdispVal;
  117. }
  118. flag=0;
  119. }
  120. // 创建一个15x15的数组,用于填充表格
  121. //VARIANT arr;
  122. WCHAR szTmp[170];
  123. arr.vt = VT_ARRAY | VT_VARIANT;
  124. SAFEARRAYBOUND sab[2];
  125. sab[0].lLbound = 1; sab[0].cElements = 420;
  126. sab[1].lLbound = 1; sab[1].cElements = 15;
  127. arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);
  128. if(str[0]==13)
  129. {
  130. return 1;
  131. }else{
  132. p=dwStr(str);
  133. if((str[0]=='T')&&(str[9]=='h')&&(str[4]=='S'))//每次执行一个命令,Excel会空
  134. { //出一行显示(“>show ip int br”)所执行的命令。
  135. char Field[30];
  136. int ps=0;
  137. int fi=10;
  138. while(str[fi]!=13)
  139. {
  140. Field[ps++]=str[fi++];
  141. }
  142. Field[ps]='';
  143. strcpy(v_str[m_str][0],Field);
  144. ps=1;
  145. while(ps<6)
  146. {
  147. strcpy(v_str[m_str][ps]," ");
  148. ps++;
  149. }
  150. }else
  151. {
  152. int pt=0;
  153. int pflag=0;
  154. while(pt<6)
  155. {
  156. if(strcmp(p[pt],"")==0)
  157. pflag++;
  158. pt++;
  159. }
  160. if(pflag==6) return 1;
  161. for(int ms=0;ms<6;ms++)
  162. {
  163. strcpy(v_str[m_str][ms],p[ms]);
  164. }
  165. }
  166. m_str++;
  167. for(int i=1; i<=420; i++) {
  168.   for(int j=1; j<=6; j++) {
  169. VARIANT tmp;
  170. tmp.vt = VT_BSTR;
  171. wsprintfW(szTmp,L"%S",v_str[i-1][j-1]);
  172. tmp.bstrVal = SysAllocString(szTmp);
  173.    // 添加数据到数组中
  174. long indices[] = {i,j};
  175. SafeArrayPutElement(arr.parray, indices, (void *)&tmp);
  176.   }
  177. }
  178. }
  179. IDispatch *pXlRange;
  180. {
  181. VARIANT parm;
  182. parm.vt = VT_BSTR;
  183.   parm.bstrVal = ::SysAllocString(L"A1:O400");//L"A1:O1"
  184. VARIANT result;
  185. VariantInit(&result);
  186. AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
  187. VariantClear(&parm);
  188. pXlRange = result.pdispVal;
  189. }
  190. //::MessageBox(NULL,_T("我要填充数据了哈!"), _T("通知"), 0x10000);
  191. // 用我们的数组填充这个Range
  192. AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
  193. pXlRange->Release();
  194. return 1;
  195. }
  196. char** InsertExcel::dwStr(char *str)
  197. {
  198. char Fie[6][300]={{""}};
  199. char ff[6][200]={{""}};
  200. //char Fe[6][200]={{""}};
  201. char **Fe;
  202. char Do[50]; //一个字段还有多个分离的字符串
  203. char str1[500]="";
  204.     char path[256];
  205. char cmd[100];
  206. int zd; //标记字段起始点
  207. int m_duozd=0; //标记遇到上条记录余下的记录
  208. //一行一行的写入硬盘文件中
  209. FILE* fp = fopen("c:\Telnet-xls.txt","at");
  210. fprintf(fp, "%s",str);
  211. fclose(fp);
  212.     int i=0;
  213.     int j=0;
  214. Fe=(char **)malloc(6*sizeof(char *)); //首先动态构建第一维
  215. for(int t=0;t<6;t++)
  216. {
  217. *(Fe+t)=ff[t];
  218. }
  219. while((str[i]!=' ')&&(str[i]!='>')&&(str[i]!=13)&&(str[i]!='#'))
  220. {
  221. cmd[j++]=str[i++];
  222. }
  223. cmd[j]=str[i];
  224. cmd[j+1]='';
  225. int k=1;
  226. while(cmd[k]!='')
  227. {
  228. if(((cmd[k]=='>')||(cmd[k]=='#'))&&(cmd[k+1]=='')) //strcmp(cmd,"TCS_Switch")==0找到根标记是以'#'或'>'结尾的
  229. {
  230. //判断命令属于配置文件中的第几条,并用m_flag标注
  231. m_flag=1;
  232. m_zhi=1;
  233. for(int fo=0;fo<6;fo++)
  234. {
  235. ziduan[fo]=0;
  236. }
  237. return Fe;
  238. }
  239. k++;
  240. }
  241. i=0;j=0;
  242. while((i<strlen(str))&&(m_flag!=10)&&(str[i]!=13))
  243. {
  244.   if((str[i]!=''))//(str[i]!=' ')&&
  245. {   
  246. while((str[i]=='-')&&(str[i+1]=='-'))
  247. return Fe;
  248.  zd=i;
  249. char zid[20]="";
  250. for(int c=0;c<6;c++)
  251. {
  252. j=0;
  253. if(ziduan[c]==0){
  254. while((str[i]!=' ')&&(str[i+1]!=''))
  255. {
  256. Fie[c][j++]=str[i++];
  257. }
  258. }else{
  259. if((c+1<=5)&&(ziduan[c+1]==0))
  260. {
  261. ziduan[c]=40;
  262. m_zdshu=c;
  263. }
  264. while(((i-zd)<ziduan[c])&&(str[i]!=13))//若不加str[i]!=13条件,单元格高度加倍
  265. {
  266. Fie[c][j++]=str[i++];
  267. if((str[i]==',')&&(str[i+1]==13))//遇到,加回车符即可判断下行还是此记录内容
  268. {
  269. m_duozd=1;
  270. }
  271. if(str[i]==13) break;
  272. }
  273. }
  274. Fie[c][j]='';//Status
  275. if(Fie[c][0]=='')//Excel存在这样一种情况:若该单元格无数据时,该单元格与上一单元格会合并成一个单元格。
  276. { //该处理就为解决这一问题。
  277. Fie[c][0]=' ';
  278. Fie[c][1]='';
  279. }
  280. if(m_zhi==1)
  281. {
  282. while((str[i]==' ')&&(str[i]!=''))
  283. {
  284. i++;
  285. }
  286. ziduan[c]=i-zd;
  287.     zd=i;
  288. }
  289. zd=i;
  290. }
  291. while(i<strlen(str))
  292. {
  293. i++;
  294. }
  295. if(m_zhi==1)
  296. m_zhi=0;
  297. }
  298. i++;
  299. }
  300. // printf("------------n|%s|-----",Fie[0]);
  301. if(m_duozd==1){  //遇到一条记录占多行的情况 插入累加到数据库中
  302. if((Fie[0][0]==' ')&&(Fie[0][1]==' '))
  303. {
  304. strcat(v_duozd[m_zdshu],Fie[m_zdshu]);
  305. }else{
  306. for(int k=0;k<6;k++){
  307. strcpy(v_duozd[k],Fie[k]);
  308. }
  309. }
  310. }else
  311. {
  312. if((Fie[0][0]==' ')&&(Fie[0][1]==' '))
  313. {
  314. strcat(v_duozd[m_zdshu],Fie[m_zdshu]);
  315. for(int t=0;t<6;t++)
  316. {
  317. *(Fe+t)=v_duozd[t];
  318. }
  319. }else{
  320. for(int t=0;t<6;t++)
  321. {
  322. *(Fe+t)=Fie[t];
  323. }
  324. for(int k=0;k<6;k++){
  325. strcpy(v_duozd[k],Fie[k]);
  326. }
  327. }
  328. }
  329. return Fe;
  330. }
  331. HRESULT InsertExcel::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...) {
  332.     // Begin variable-argument list...
  333.     va_list marker;
  334.     va_start(marker, cArgs);
  335.     if(!pDisp) {
  336.         MessageBox(NULL,_T("NULL IDispatch passed to AutoWrap()"),_T("Error"), 0x10010);
  337.         _exit(0);
  338.     }
  339.     // Variables used...
  340.     DISPPARAMS dp = { NULL, NULL, 0, 0 };
  341.     DISPID dispidNamed = DISPID_PROPERTYPUT;
  342.     DISPID dispID;
  343.     HRESULT hr;
  344.     char buf[200];
  345.     char szName[200];
  346.     // Convert down to ANSI
  347.     WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
  348.     // Get DISPID for name passed...
  349.     hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
  350.     if(FAILED(hr)) {
  351.         sprintf(buf, "IDispatch::GetIDsOfNames("%s") failed w/err 0x%08lx", szName, hr);
  352. //LPCSTR lbuf=(LPCSTR)buf;
  353.         MessageBox(NULL, buf,_T("AutoWrap()"), 0x10010);
  354.         _exit(0);
  355.         return hr;
  356.     }
  357.     // Allocate memory for arguments...
  358.     VARIANT *pArgs = new VARIANT[cArgs+1];
  359.     // Extract arguments...
  360.     for(int i=0; i<cArgs; i++) {
  361.         pArgs[i] = va_arg(marker, VARIANT);
  362.     }
  363.     // Build DISPPARAMS
  364.     dp.cArgs = cArgs;
  365.     dp.rgvarg = pArgs;
  366.     // Handle special-case for property-puts!
  367.     if(autoType & DISPATCH_PROPERTYPUT) {
  368.         dp.cNamedArgs = 1;
  369.         dp.rgdispidNamedArgs = &dispidNamed;
  370.     }
  371.     // Make the call!
  372.     hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
  373.     if(FAILED(hr)) {
  374.         sprintf(buf, "IDispatch::Invoke("%s"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);
  375. //LPCSTR lbuf=(LPCSTR)buf;
  376.         MessageBox(NULL, buf,_T("AutoWrap()"), 0x10010);
  377.         _exit(0);
  378.         return hr;
  379.     }
  380.     // End variable-argument section...
  381.     va_end(marker);
  382.     delete [] pArgs;
  383.     return hr;
  384. }