这几天一直在折腾怎么将文本数据保存到excel表格里,网上的资料不是特别多,找来找去,只有一篇是可以用的,很好的资源,下面粘下他的地址:
http://blog.csdn.net/icyfox_bupt/article/details/6318979。这篇文章讲述了如何导入excel相关类,但是他附的是读excel里的数据,下面我说一下怎么往里面写数据。
前面步骤跟他的一样,excel里写数据主要是用CRange::put_Item()函数。
1 /*以下用到的变量为对话框的成员变量: 2 CApplication m_app; 3 CWorkbook m_book; 4 CWorkbooks m_books; 5 CWorksheet m_sheet; 6 CWorksheets m_sheets; 7 CRange m_range;*/ 8 void CMyExcelTestDlg::OnBnClickedBtninport() 9 { 10 // TODO: 在此添加控件通知处理程序代码 11 if (!m_app.CreateDispatch("Excel.Application")) 12 { 13 AfxMessageBox("无法启动Excel服务器!"); 14 return; 15 } 16 m_books.AttachDispatch(m_app.get_Workbooks()); 17 //得到workbook 18 m_book.AttachDispatch(m_books.Add(_variant_t(m_strExcelPath))); 19 //得到worksheets 20 m_sheets.AttachDispatch(m_book.get_Worksheets()); 21 //获取当前活跃的sheet 22 m_sheet.AttachDispatch(m_book.get_ActiveSheet()); 23 //更改sheet的名字 24 m_sheet.put_Name("测试数据"); 25 m_range.AttachDispatch(m_sheet.get_Cells()); 26 27 char chDataTime[30] = {0}; 28 char chDataSize[10] = {0}; 29 char chCurDelay[10] = {0}; 30 char chAverDelay[10] = {0}; 31 char chRecieve[5] = {0}; 32 char chRate[10] = {0}; 33 char chMiss[5] = {0}; 34 UINT32 uiRowIndex = 1; 35 UINT32 uiColIndex = 1; 36 37 FILE *fp = fopen(m_strTxtPath.GetBuffer(), "rt"); 38 if (!fp) 39 { 40 AfxMessageBox("读取文本文件失败!"); 41 return ; 42 } 43 while(fscanf(fp, "%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\n", chDataTime, chDataSize, 44 chCurDelay, chAverDelay, chRecieve, chRate, chMiss) != EOF) 45 { 46 m_range.put_Item(_variant_t(uiRowIndex), _variant_t(uiColIndex++), _variant_t(chDataTime)); 47 m_range.put_Item(_variant_t(uiRowIndex), _variant_t(uiColIndex++), _variant_t(chDataSize)); 48 m_range.put_Item(_variant_t(uiRowIndex), _variant_t(uiColIndex++), _variant_t(chCurDelay)); 49 m_range.put_Item(_variant_t(uiRowIndex), _variant_t(uiColIndex++), _variant_t(chAverDelay)); 50 m_range.put_Item(_variant_t(uiRowIndex), _variant_t(uiColIndex++), _variant_t(chRecieve)); 51 m_range.put_Item(_variant_t(uiRowIndex), _variant_t(uiColIndex++), _variant_t(chRate)); 52 m_range.put_Item(_variant_t(uiRowIndex), _variant_t(uiColIndex++), _variant_t(chMiss)); 53 ++uiRowIndex; 54 uiColIndex = 1; 55 memset(chDataTime, 0, sizeof(chDataTime)); 56 memset(chDataTime, 0, sizeof(chDataSize)); 57 memset(chDataTime, 0, sizeof(chCurDelay)); 58 memset(chDataTime, 0, sizeof(chAverDelay)); 59 memset(chDataTime, 0, sizeof(chRecieve)); 60 memset(chDataTime, 0, sizeof(chRate)); 61 memset(chDataTime, 0, sizeof(chMiss)); 62 } 63 fclose(fp); 64 m_range.AttachDispatch(m_sheet.get_UsedRange());//加载已使用的单元格 65 //m_range.put_ColumnWidth(_variant_t(100)); 66 m_range.put_WrapText(_variant_t(1));//设置单元格内容自动换行 67 //设置对齐方式为水平垂直居中 68 //水平对齐:默认1,居中-4108,左-4131,右-4152 69 m_range.put_HorizontalAlignment(_variant_t((long)-4108)); 70 m_range.put_VerticalAlignment(_variant_t((long)-4108)); 71 72 //char chFileName[20] = "测试数据.xlsx"; 73 //m_app.Save(_variant_t(chFileName)); 74 m_app.put_Visible(TRUE);//设置Excel可见 75 76 //释放
77 m_range.ReleaseDispatch(); 78 m_sheet.ReleaseDispatch(); 79 m_sheets.ReleaseDispatch(); 80 m_book.ReleaseDispatch(); 81 m_books.ReleaseDispatch(); 82 m_app.ReleaseDispatch(); 83 }
程序还有些设计不好的地方,就是每次打开的excel表格都要“另存为”,还没有设计成直接保存的方式,有待优化。