vc保存clistctrl的内容到excel文件

最近做了个保单系统,需要一些功能,比如查询的记录保存到制定的位置:

1、网上很多操作方式,很少可行,受不了于是乎,我自己研究了。

2、使用csv格式保存呗,使用windows自带的CFile和CStdioFile类,前者提供了write后者提供了writestring功能,简单的贴两个代码吧,但是这个使用的时候必须设置本地化:

void CDb_dialog::OnBnClickedButtonDbSave() { // TODO: Add your control notification handler code here int ItemCount = m_list_ctrl.GetItemCount(); int subnItemCount = m_list_ctrl.GetHeaderCtrl()->GetItemCount(); if(!ItemCount || !subnItemCount) { return; } if(!this->file_path.GetLength()) //如果文件名为空,弹出对话框 { static TCHAR BASED_CODE szFilter[] = _T("Datasheet Files (*.csv)|*.csv||"); CFileDialog file(false, _T("csv"), _T("保单保存"), 6, szFilter); file.DoModal(); this->file_path = file.GetPathName(); } if(!this->file_path.GetLength()) //如果文件名为空,弹出对话框 { return; } CStdioFile myFile; CFileException fileException; char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE, "chs" );//设定 if ( !myFile.Open( file_path.GetString(), CFile::modeCreate| CFile::modeReadWrite, &fileException ) ) { TCHAR szError[1024]; fileException.GetErrorMessage(szError, 1024); MessageBox(szError); return; } //遍历所有行 CString rowContent; CString subContent; for(int nItem = 0; nItem < ItemCount; nItem++) { for(int subnItem = 0; subnItem < subnItemCount - 1; subnItem++) { subContent = m_list_ctrl.GetItemText(nItem, subnItem); rowContent += subContent; rowContent += _T(","); } subContent = m_list_ctrl.GetItemText(nItem, subnItemCount - 1); rowContent += subContent; rowContent += _T("\n"); myFile.WriteString(rowContent.GetString()); myFile.Flush(); rowContent.Empty(); } setlocale( LC_CTYPE, old_locale ); free( old_locale );//还原区域设定 myFile.Close(); }


3、使用其他的库,我使用的是这个:http://www.codeproject.com/Articles/13852/BasicExcel-A-Class-to-Read-and-Write-to-Microsoft

这个上面提供了基本的使用例子,以及相应的类。

using namespace YExcel; void CDb_dialog::OnBnClickedButtonDbSave() { // TODO: Add your control notification handler code here int ItemCount = m_list_ctrl.GetItemCount(); int subnItemCount = m_list_ctrl.GetHeaderCtrl()->GetItemCount(); if(!ItemCount || !subnItemCount) { return; } if(!this->file_path.GetLength()) //如果文件名为空,弹出对话框 { static TCHAR BASED_CODE szFilter[] = _T("Datasheet Files (*.xls)|*.xls||"); CFileDialog file(false, _T("csv"), _T("保单保存"), 6, szFilter); file.DoModal(); this->file_path = file.GetPathName(); } if(!this->file_path.GetLength()) //如果文件名为空,弹出对话框 { return; } BasicExcel e; e.New(1); e.RenameWorksheet("Sheet1", "Test1"); BasicExcelWorksheet* sheet = e.GetWorksheet("Test1"); BasicExcelCell* cell; if(!sheet) { return; } //遍历所有行 CString rowContent; CString subContent; for(int nItem = 0; nItem < ItemCount; nItem++) { for(int subnItem = 0; subnItem < subnItemCount - 1; subnItem++) { subContent = m_list_ctrl.GetItemText(nItem, subnItem); if(subContent.GetLength()) { cell = sheet->Cell(nItem, subnItem); cell->SetWString(subContent.GetString()); } } } e.SaveAs("aa.xls"); CopyFile(_T("aa.xls"), file_path.GetString(), false); int error_no = GetLastError(); }


最后使用了一个saveas到本地,然后copy到指定的目录,貌似这个库不支持非本地保存,没有深究,且这样吧。

最后截图保存的文件:

这个文章先简单的描述一下了,还是推荐使用basicexcel这个库的。毕竟还是支持utf-16的操作。而且作者也给出了一个相应的实例,慢慢细心看,还是很简单的。

后续我在给出一些vc 2008通过odbc操作mysql的实例吧,具体就是使用CDatabase 和CRecordSet类做这个操作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值